PageSourceSearch

https://nycsca.org/DesktopModules/DnnSharp/TabsPro/static/tabspro.js?cdv=1257

js nycsca.org collected 2026-10-02 06:55:00 UTC 46,100 bytes, 1,021 lines download raw bytes

1;
2function registerLoadingListeners(opts) {
3    var bsVersion = $.fn.tab.Constructor.VERSION;
4    if (bsVersion) {
5        bsVersion = bsVersion.replace(/\./g, '');
6        bsVersion = parseInt(bsVersion);
7        if (bsVersion >= 400) {
8            $.fn.tab.noConflict();
9        }
10    }
11
12
13    if (opts.ShowLoading && opts.ShowLoading.Value) {
14        dnnsf.api.tabspro.showLoading['tabsPopup' + opts.ModuleId] = opts.ShowLoading.Value;
15        dnnsf.initStickyLoading('dnn_ctr' + opts.ModuleId + '_Main_pnlTabs');
16
17        var target = $('#dnn_ctr' + opts.ModuleId + '_Main_pnlDialog .common-loading-container');
18
19        var loadingQueue = [];
20
21        var moduleIdsInTabsPro = _.reduce(opts.Tabs,
22            function (midArray, tab) {
23                var tabIds = _.map(tab.TabModules,
24                    function (module) {
25                        return module.ModuleId;
26                    })
27                return _.concat(tabIds, midArray);
28            }, []);
29
30        function fnLoading(message) {
31            if (_.find(moduleIdsInTabsPro, function (mid) { return mid === message.moduleId; })) {
32                if (message.loading) {
33                    target.show();
34                    loadingQueue.push(message.moduleId);
35                } else {
36                    _.pull(loadingQueue, message.moduleId);
37                    !loadingQueue.length && target.hide();
38                }
39            }
40        }
41
42        dnnsf.events.listen('loadGrid', opts.ModuleId, fnLoading);
43
44        dnnsf.events.listen('loadForm', opts.ModuleId, fnLoading);
45    }
46};
47
48(function ($) {
49
50    // sametimes, the hashchange function breaks the tab state, so use this variable to bypass onHashChange if the we changed it from the activate/select handler
51    var _hashLockNext = false;
52    var defaultTabId = '';
53    var currentHash;
54    function elementInViewport(el, reduceHeight) {
55        var top = el.offsetTop;
56        var left = el.offsetLeft;
57        var width = el.offsetWidth;
58        var height = el.offsetHeight;
59        var pageHeight = window.innerHeight - (reduceHeight || 0);
60
61        while (el.offsetParent) {
62            el = el.offsetParent;
63            top += el.offsetTop;
64            left += el.offsetLeft;
65        }
66
67        return (
68            top >= window.pageYOffset &&
69            left >= window.pageXOffset &&
70            (top + height) <= (window.pageYOffset + pageHeight) &&
71            (left + width) <= (window.pageXOffset + window.innerWidth)
72        );
73    }
74
75    // once for all tabs pro modules
76    $(function () {
77
78        // setup image tabs
79        $('.tp-imagetab').hover(function () {
80            if ($(this).find('.tp-image-active:visible').size())
81                return;
82            $(this).find('.tp-image-hover').show();
83            $(this).find('.tp-image-default').hide();
84        }, function () {
85            if ($(this).find('.tp-image-active:visible').size())
86                return;
87            $(this).find('.tp-image-hover').hide();
88            $(this).find('.tp-image-default').show();
89        });
90
91        $(".ui-tabs").on("tabsbeforeactivate", function (event, ui) {
92            ui.oldTab.find('.tp-image-active,.tp-image-hover').hide();
93            ui.oldTab.find('.tp-image-default').show();
94            ui.newTab.find('.tp-image-active').show();
95            ui.newTab.find('.tp-image-hover,.tp-image-default').hide();
96        }).on("tabscreate", function (event, ui) {
97            if (ui.tab) {
98                ui.tab.find('.tp-image-active').show();
99                ui.tab.find('.tp-image-hover,.tp-image-default').hide();
100            }
101        });
102
103    });
104
105    function updateQs(params) {
106        if (!params.qs || $.isEmptyObject(params.qs))
107            return;
108        setTimeout(function () {
109            var nextQs = $.param($.isEmptyObject(dnnsf.getUrlParts(location.search).query) ? params.qs : $.extend({}, dnnsf.getUrlParts(location.search).query, params.qs || {}));
110            if (nextQs != location.search.substring(1))
111                window.history.pushState({}, "", '?' + nextQs);
112        }, 500)
113    }
114
115    window.tpInitBootstrapLayout = function (opts) {
116        dnnsf['tp-' + opts.ModuleId] = opts;
117        // merge defaults
118        opts = $.extend({
119            tabInit: -1
120        }, opts);
121
122        defaultTabId = '';//reset default tab
123        for (var i = 0; i < opts.Tabs.length; i++) {
124            for (var j = 0; j < opts.Tabs[i].TabModules.length; j++) {
125                if ($('.DnnModule-' + opts.Tabs[i].TabModules[j].ModuleId).children().size() == 0)
126                    continue;
127                $('.DnnModule-' + opts.Tabs[i].TabModules[j].ModuleId).children().last(
127).hide();
128
129            }
130            if (opts.Tabs[i].DefaultTab)
131                defaultTabId = opts.Tabs[i].TabId;
132        }
133
134        for (var i = 0; i < opts.Tabs.length; i++) {
135
136            // tabs with static content and URLs already handled in xsl template
137            if (opts.Tabs[i].Contents || opts.Tabs[i].TabUrl)
138                continue;
139
140            var _pnl = $('#tptab' + opts.Tabs[i].TabId);
141            var _pnlContent = $("<div id='" + Math.random().toString(16).slice(2, 10) + "'></div>"); //need the id for moduleActions(dnn)
142
143            if (opts.Tabs[i].DisplayAccordion) {
144                _pnlContent.append('<div class="panel-group tp-inner-accordion" id="tpInnerAccordion' + opts.Tabs[i].TabId + '"></div>');
145            }
146
147            for (var j = 0; j < opts.Tabs[i].TabModules.length; j++) {
148                if (!$('.DnnModule-' + opts.Tabs[i].TabModules[j].ModuleId).size() == 0 && $('.DnnModule-' + opts.Tabs[i].TabModules[j].ModuleId).children().size() == 0)
149                    continue;
150
151                var mod = $('.DnnModule-' + opts.Tabs[i].TabModules[j].ModuleId);
152                if (mod.find('.dnnsharp-container').length)
153                    mod.find('.dnnsharp-container').addClass('tabsProC');
154                else
155                    mod.children(':last').addClass('tabsProC');
156
157                // prevent scripts from running again, except module actions which need reinitialization
158                //mod.find('script').not(':contains(dnnModuleActions)').remove();
159                mod.find('script').remove();
160                mod.find('.dnnDragHint').remove();
161                mod.attr('data-mid', opts.Tabs[i].TabModules[j].ModuleId);
162
163                if (opts.Tabs[i].DisplayAccordion) {
164                    var panel = $('<div class="panel panel-default ignore-events"></div>').appendTo(_pnlContent.children('.panel-group'));
165                    // append header
166                    panel.append('<div class="panel-heading"><h4 class="panel-title"><a class="accordionLink ignore-events " data-toggle="collapse" data-parent="#tpInnerAccordion' + opts.Tabs[i].TabId
167                        + '" href="javascript:void(0)" data-target="#tpCollapseInner' + opts.Tabs[i].TabModules[j].ModuleId + '">' + (opts.Tabs[i].TabModules[j].DisplayTitle ? opts.Tabs[i].TabModules[j].ModuleTitle : '') + '</a></h4></div>');
168                    if (!opts.Tabs[i].TabModules[j].DisplayTitle)
169                        panel.find('a.accordionLink').addClass('empty-link');
170                    // append body
171                    var body = $('<div data-child="true" id="tpCollapseInner' + opts.Tabs[i].TabModules[j].ModuleId
172                        + '" class="panel-collapse collapse ignore-events ' + (j == 0 ? 'in' : '') + '"><div class="panel-body" id="' + Math.random().toString(16).slice(2, 10) + '"></div></div>').appendTo(panel)
173                        .children().append(mod); //random id for dnn moduleActions
174                } else {
175                    _pnlContent.append(mod);
176                }
177
178                $("a[name=" + opts.Tabs[i].TabModules[j].ModuleId + "]").remove();
179
180                if (opts.isAdmin || opts.Tabs[i].TabModules[j].DisplayTitle && !opts.Tabs[i].DisplayAccordion) {
181                    mod.find('.tp-module-header').addClass('well');
182                } else {
183                    mod.find('.tp-module-header').remove();
184                }
185
186            }
187
188            if (opts.Tabs[i].StackDirection == 'horizontal' || opts.Tabs[i].StackDirection == 1) {
189                _pnlContent.css("display", "inline-flex").find('.tabsProC').addClass('tabsProC-left').css("display", "inline-block");
190                _pnlContent.append("<div style='clear: both;'></div>");
191            }
192            _pnl.append(_pnlContent);
193
194            $.each($('.tabsProC'), function (i, v) {
195                $(v).attr('class', 'tabsProC dnnsharp-container')
196                $(v).css({ 'padding': '4px', 'overflow': 'visible', 'display': 'block' });
197
198                setTimeout(function () {
199                    if ($(v).find(".eipbackimg.containerTitle").length) {
200                        var id = $(v).find(".eipbackimg.containerTitle").parents().eq(1).find("span").attr("id"),
201                            title = $("#" + id).html();
202                        $(id).replaceWith($('<div class="tp-module-header well">' + title + '</div>'));
203                        dnn.controls.initLabelEdit($(id));
204                    }
205                }, 1000);
206            });
207        }
208
209        // render as accordion or tabs
210        if (opts.EffectiveLayout == 4) { // 'accordion') {
211            tpRenderAccordion(this, opts);
212            changeAccordionState(getAccordions(opts));
213            $(opts.pnlDlgSelector).attr('data-layout', 'accordion');
214        } else {
215            tpRenderTabs(this, opts);
216            changeTabState(getTabs(opts));
217            $(opts.pnlDlgSelector).attr('data-layout', 'tab');
218        }
219        $(opts.pnlDlgSelector).attr('data-mid', opts.ModuleId);
220        $(opts.pnlDlgSelector).attr('data-page-query', opts.dnnPageQuery);
221
222        var _this = this;
223        var fnHashChange = function () {
224
225            if (_hashLockNext) {
226                _hashLockNext = false;
227                return;
228            }
229
230            // select this item
231            var activeItem = getActiveItem(_this, opts);
232            activeItem = activeItem == -1 ? 0 : activeItem;
233            activeItem = getAvailableItem(activeItem, opts);
234            var selItem;
235            if (activeItem != -1) {
236                if (opts.EffectiveLayout == 4) { // 'accordion') {
237                    $(".collapsing").one('shown.bs.collapse', function () {
238                        selItem = _this.find('.accordion-root>div>.panel-collapse:eq(' + activeItem + ')');
239                        selItem.collapse('show');
240                    });
241                } else {
242                    selItem = _this.find('.tabs-root>li>a:eq(' + activeItem + ')');
243                    selItem.tab('show');
244                }
245            }
246
247            // scroll tab header into view
248            if (opts.AutoScroll.Value && selItem && selItem.size() && !elementInViewport(selItem[0], window.innerHeight / 2)) {
249                $('html, body').scrollTop(selItem.offset().top - 40);
250            }
251            window.TabsPro = window.TabsPro || {};
252            window.TabsPro[opts.ModuleId] = opts.Tabs;
253
254        };
255        $(window).hashchange(fnHashChange);
256        fnHashChange();
257        // OnTabLeave
258        $(opts.pnlDlgSelector + ' .nav-tabs a').on('show.bs.tab', function (e, data) {
259            if (!data)
260                return;
261            var modules = opts.Tabs;
262            e.relatedTarget = e.relatedTarget || data.relatedTarget;
263            e.currentTarget = e.currentTarget || data.currentTarget;
264            //indentify current tab;
265            var currentTab = true;
266            if (!e.relatedTarget)
267                currentTab = null;
268            if (currentTab) {
269                $.each(getTabs(opts), function (index, value) {
270                    if (value.control.attr('href') == $(e.relatedTarget || e.currentTarget).attr('href')) {
271                        currentTab = index;
272                    }
273                });
274
275                //Modules from it
276                var targetModuleListLeave = [];
277                $.each(opts.Tabs[currentTab].TabModules, function (index, value) {
278                    targetModuleListLeave.push(value.ModuleId);
279                });
280            }
281            var nextTab;
282            $.each(getTabs(opts), function (index, value) {
283                if (value.control.attr('href') == $(e.currentTarget).attr('href')) {
284                    nextTab = index;
285                }
286            });
287
288            var targetModuleListEnter = [];
289            if (!opts.Tabs[nextTab].DisplayAccordion)
290                $.each(opts.Tabs[nextTab].TabModules, function (index, value) {
291                    targetModuleListEnter.push(value.ModuleId);
292                });
293
294            if (currentTab != null && !opts.waitingForBroadcast) {
295                opts.Tabs[currentTab].Reevaluate && dnnsf.api.tabspro.refreshTabPro({ mid: opts.ModuleId });
296                //Reevaluate state
297                !dnnsf.events._listeners.OnTabsLeave && $(this).closest('.nav').removeClass('disabled-nav');// fix tabspro crazyness
298                if (dnnsf.events._listeners.OnTabsLeave)
299                    setTimeout(function () {
300
301                        e.preventDefault();
302                        e.stopImmediatePropagation();
303
304                        opts.waitingForBroadcast = true;
305                        //Broadcast event
306                        dnnsf.events.broadcast('OnTabsLeave', { 'targetModuleList': targetModuleListLeave }, function (responses) {
307                            var switchTab = true;
308                            var refreshTabsPro = false;
309                            responses && $.each(responses, function (index, response) {
310                                if (response.value != true) {
311                                    switchTab = false;
312                                }
313                                if (response.refresh != false) {
314                                    refreshTabsPro = true;
315                                }
316                            })
317                            if (switchTab) {
318                                var target = $(e.currentTarget).is('body') ? e.target || e.relatedTarget : e.currentTarget || e.relatedTarget;
319                                // $(e.currentTarget || e.relatedTarget).tab('show');
320                                $(target).tab('show');
321                                dnnsf.api.tabspro.changeTab({ mid: opts.ModuleId, viewOrder: nextTab, refresh: refreshTabsPro, qs: opts.qs }, EnterTab);
322                                function EnterTab(tabId) {
323                                    targetModuleListEnter = [];
324                                    $.each(opts.Tabs[tabId].TabModules, function (index, value) {
325                                        targetModuleListEnter.push(value.ModuleId);
326                                    });
327                                    responses && dnnsf.events.broadcast('OnTabsEnter', { 'targetModuleList': targetModuleListEnter, qs: opts.qs }, function (responses) { });
328                                }
329                                //opts.waitingForBroadcast = false;
330                            }
331                            else {
332                                e.relatedTarget && $(e.relatedTarget).tab('show');
333                            }
334                        });
335                    }, 0);
336                else {
337                    $(e.currentTarget).tab('show');
338                }
339            }
340        });
341
342        $(opts.pnlDlgSelector + ' .collapse,' + opts.pnlDlgSelector + ' .collapsing').not('.ignore-events').on('show.bs.collapse', function (e) {
343            if ($(e.target).hasClass('ignore-events'))
344                return;
345            var modules = opts.Tabs;
346            //indentify current tab;
347            var currentTab;
348            var accordions = getAccordions(opts);
349            var activeAccordion = getActiveAccordion($(e.currentTarget).closest('.bstrap30'));
350            if (activeAccordion == null) {
351                targetModuleListEnter = [];
352                var parentDiv = $(e.currentTarget).closest('.accordion-root');
353                if (!parentDiv.length)
354                    return;
355                var tabIndex = $(e.currentTarget).closest('.panel').index();
356                if (tabIndex == -1)
357                    tabIndex = 0;
358                $.each(opts.Tabs[tabIndex].TabModules, function (index, value) {
359                    targetModuleListEnter.push(value.ModuleId);
360                });
361                dnnsf.events.broadcast('OnTabsEnter', { 'targetModuleList': targetModuleListEnter }, function (responses) { });
362                return;
363            }
364            var activeAccordionControll = getAccordions(opts)[activeAccordion].control;
365            $.each(getAccordions(opts), function (index, value) {
366                if (value.control.attr('data-target') == activeAccordionControll.attr('data-target')) {
367                    currentTab = index;
368                }
369            });
370            //Modules from it
371            var targetModuleListLeave = [];
372            $.each(opts.Tabs[currentTab].TabModules, function (index, value) {
373                targetModuleListLeave.push(value.ModuleId);
374            });
375
376            var nextTab;
377            $.each(getAccordions(opts), function (index, value) {
378                if (value.control.attr('data-target') == '#' + $(e.currentTarget).attr('id')) {
379                    nextTab = index;
380                }
381            });
382
383            var targetModuleListEnter = [];
384            $.each(opts.Tabs[nextTab].TabModules, function (index, value) {
385                targetModuleListEnter.push(value.ModuleId);
386            });
387
388            if (!opts.waitingForBroadcast) {
389                //Reevaluate state
390                opts.Tabs[currentTab].Reevaluate && dnnsf.api.tabspro.refreshTabPro({ mid: opts.ModuleId });
391
392                e.preventDefault();
393                e.stopImmediatePropagation();
394
395                opts.waitingForBroadcast = true;
396                //Broadcast event
397                dnnsf.events.broadcast('OnTabsLeave', { 'targetModuleList': targetModuleListLeave }, function (responses) {
398                    var switchTab = true;
399                    var refreshTabsPro = false
400                    responses && $.each(responses, function (index, response) {
401                        if (response.value != true) {
402                            switchTab = false;
403                        }
404                        if (response.refresh != false) {
405                            refreshTabsPro = true;
406                        }
407                    })
408                    if (switchTab) {
409                        if ($(e.relatedTarget || e.currentTarget).attr('data-child')) {
410                            $(e.relatedTarget || e.currentTarget).collapse('show');
411                            return;
412                        }
413                        $(e.relatedTarget || e.currentTarget).tab('show');
414                        $(e.relatedTarget || e.currentTarget).collapse('show');
415                        dnnsf.api.tabspro.changeTab({ mid: opts.ModuleId, viewOrder: nextTab, refresh: refreshTabsPro }, EnterTab);
416                        function EnterTab(tabId) {
417                            targetModuleListEnter = [];
418                            $.each(opts.Tabs[tabId].TabModules, function (index, value) {
419                                targetModuleListEnter.push(value.ModuleId);
420                            });
421                            responses && dnnsf.events.broadcast('OnTabsEnter', { 'targetModuleList': targetModuleListEnter }, function (responses) { });
422                        }
423                    }
424                    // opts.waitingForBroadcast = false;
425
426                });
427            }
428        });
429        //console.log(opts.tabInit);
430
431        this.find('.tabsProC').show().parent().show();
432
433        // set absolute URLs
434        this.find('[data-absurl]').each(function () {
435            $(this).attr('href', $(this).attr('data-absurl'));
436            $(this).unbind('click').unbind('click.tabs');
437        });
438
439        // show tabs pro containers outside tabs
440        $('.tabsProC').not(this.find('.tabsProC')).show();
441
442        this.find('[data-absurl]').click(function () {
443            window.location = $(this).attr('data-absurl');
444            return false;
445        });
446
447        tpRenderDlg(opts);
448        return this;
449    }
450
451    function tpRenderDlg(opts) {
452        if (!opts.dlgShow)
453            return;
454
455        $(opts.pnlDlgSelector).dialog({
456            autoOpen: false,
457            width: opts.Dlg_ContentWidth.Value,
458            resizable: false,
459            modal: opts.Dlg_Modal.Value,
460            title: opts.ModuleTitle
461        }).parents('.ui-dialog:first').wrap("<div class='" + opts.ThemeId + "'></div>");
462
463        $(opts.pnlDlgSelector).find('.tabPnl').height(opts.Dlg_ContentHeight.Value);
464    }
465
466
467    function getActiveItem(el, opts) {
468        // first, check the bookmarks, since these also reflect navigation around tabs on client side
469        if (opts.PersistInUrl.Value && location.hash.length) {
470            if (location.hash.indexOf('tptab') == 1) {
471                var tabIndex;
472                var tabId = location.hash.substr(6);
473                $.each(opts.Tabs, function (i, tab) {
474                    if (tab.TabId.toString() == tabId) {
475                        tabIndex = i;
476                        return false;
477                    }
478                });
479                return tabIndex != null ? tabIndex : tabId; // len of tptab
480            }
481
482            var selItem = el.find('[data-bookmark="' + location.hash.match(/#?\/?(.+)/)[1] + '"]');
483            if (opts.EffectiveLayout != 4) {
484                if (selItem.length)
485                    return selItem.parent().children().index(selItem) - 1;
486            } else {
487                return selItem.parent().parent().parent().parent().children().index(selItem.parent().parent().parent());
488            }
489        }
490
491        // if persist in cookies, that takes precendece over postback, since cookies persist on postback as well
492        if (opts.PersistInCookies.Value && $.cookie('tabsPro' + opts.ModuleId))
493            return parseInt($.cookie('tabsPro' + opts.ModuleId));
494
495        // next, load persist on postback
496        var hdnActive = $(opts.hdnActiveTabSelector);
497        if (opts.PersistOnPostback.Value && !isNaN(parseInt(hdnActive.val())))
498            return parseInt(hdnActive.val());
499
500        // if we got here, we have to fallback to default
501        if ((!opts.IsCollapsible.Value || !opts.IsCollapsedInitially.Value) && defaultTabId != '') {
502            if (opts.EffectiveLayout == 4) {
503                var selectedTab = $('#tpHead' + defaultTabId).parent();
504                var parentDiv = $(selectedTab).parent();
505                return parseInt($(parentDiv).children().index($(selectedTab)));
506            } else {
507                var parentTab = $('#tpHead' + defaultTabId).parent();
508                return parseInt(parentTab.children().index($('#tpHead' + defaultTabId)));
509            }
510        }
511
512        //return intial tab: if not initially collapsed
513        if (!opts.IsCollapsedInitially.Value)
514            return 0;
515
516        return null;
517    }
518
519    function getActiveAccordion(parent) {
520        var ret = $(parent).find('.collapse').not('.ignore-events').index($('[aria-expanded="true"]'));
521        // var accs = $(parent).find('.collapse').not('.ignore-events');
522        // var el = $(parent).find('.collapse.in');
523        // if (!el.length)
524        // return null;
525
526        // $.each(accs, function (index, value) {
527        // if (value == (el.length ? el[0] : el.context)) {
528        // ret = index;
529        // return false;
530        // }
531        // });
532        return ret >= 0 ? ret : null;
533    }
534
535    function getActiveTab(parent) {
536        var ret;
537        $.each($(parent).find('.tabButton'), function (index, value) {
538            if ($(value).hasClass('active')) {
539                ret = index;
540            }
541        });
542        return ret;
543    }
544
545    function getAvailableItem(activeItem, opts) {
546        if (!opts.Tabs.length) return 0;
547        if (activeItem && (opts.Tabs[activeItem].IsEnabled == false || opts.Tabs[activeItem].IsShown == false)) {
548            var i = activeItem;
549            for (i; i >= 0; i--) {
550                if (opts.Tabs[i].IsEnabled != false && opts.Tabs[i].IsShown != false) {
551                    return i;
552                    break;
553                }
554            };
555            i = activeItem;
556            for (i; i < opts.Tabs.length; i++) {
557                if (opts.Tabs[i].IsEnabled != false && opts.Tabs[i].IsShown != false) {
558                    return i;
559                    break;
560                }
561            }
562        } else {
563            return activeItem;
564        }
565    }
566
567    function loadModules(pnlTabs, opts, qs) {
568        var tpSettings = dnnsf['tp-' + opts.ModuleId];
569        setTimeout(function () {
570            var isAccordion, gridModules;
571            isAccordion = (tpSettings.TabsLayout.Value == 4 || (tpSettings.AccordionOnMobile.Value && tpSettings.IsMobile));
572            gridModules = isAccordion ? $('.panel-collapse.in').find('div[data-ngbootstrap]') : $('.tab-pane.active').find('div[data-ngbootstrap]');
573            if (!gridModules.length) return;
574            _.forEach(gridModules, function (module, key) {
575                var app = $(module).attr('data-ngbootstrap');
576                try {
577                    if (!window.dnnsfAngular15.element(module).scope())
578                        window.dnnsfAngular15.bootstrap(module, [app]);
579                    window.dnnsfAngular15.element(module).scope().$broadcast('TabsProEvent', !$.isEmptyObject(qs) && qs);
580                } catch (e) {// old grid with new tabspro and new form
581                    if (!window.angular.element(module).scope())
582                        window.angular.bootstrap(module, [app]);
583                    window.angular.element(module).scope().$broadcast('TabsProEvent', !$.isEmptyObject(qs) && qs);
584                }
585
586            });
587        }, 500);
588    }
589
590    function tpRenderTabs(pnlTabs, opts) {
591
592        // initialize tabs
593        pnlTabs.find('.tabs-root>li>a.tabLink').click(function (e, params) {
594            $(this).removeClass('has-error');
595
596            if (dnnsf.events._listeners.OnTabsLeave) { !$(this).parent().hasClass('active') && $(this).closest('.nav').addClass('disabled-nav'); }
597
598            setTimeout(function () {
599                $(opts.pnlDlgSelector).find('.nav').removeClass('disabled-nav'); // failsafe for when tabspro decides to set disabled-nav permanently which happens in very rare occasions
600            }, 1500)
601
602            if (params && params.fromChangeTab) {
603                $(this).data('fromChangeTab', true);
604                $.each(getTabs(opts), function (index, value) {
605                    value.control.removeClass('disabled');
606                });
607            }
608            opts.waitingForBroadcast = false;
609            if (params && params.qs) {
610                opts.qs = params.qs;
611                loadModules(this, opts, opts.qs);
612            }
613            if (!$('.modal').has(e.target).length && params && !$.isEmptyObject(params.qs)) {
614                updateQs(params);
615            }
616            e.preventDefault();
617            e.stopImmediatePropagation();
618            currentHash = location.hash;
619            var itemIndex;
620            if (opts.OpenAction.Value == 0 && opts.IsCollapsible.Value && $(this).parent().hasClass('active') && opts.TabsLayout.Value == 4) {
621                $(this).parent().removeClass('active');
622                $($(this).attr('href')).removeClass('active');
623                itemIndex = 1;
624            } else if (opts.IsCollapsible.Value && e.target !== $(this)[0] && e.target !== $($(this).attr('href'))[0] && !$(".actionMenu").has(e.target).length) {
625                $(this).parent().removeClass('active');
626                $($(this).attr('href')).removeClass('active');
627                itemIndex = 1;
628            } else {
629                if (!$(this).parent().hasClass('active'))
630                    loadModules(pnlTabs, opts);
631                var ev = { relatedTarget: $(this).parent().siblings('.active').find('a')[0], currentTarget: e.currentTarget };
632                $(this).trigger('show.bs.tab', [ev]);
633                itemIndex = $(this).closest('ul').children().index($(this).parent());
634            }
635            var tab = $(this);
636
637            // setup persistence
638            setTimeout(function () {
639                persist(opts, tab, itemIndex, $(tab.attr('href')).attr('data-bookmark'));
640            }, 300)
641
642        });
643
644        // load active tab
645        var activeItem = getActiveItem(pnlTabs, opts);
646        if (activeItem >= 0) {
647            pnlTabs.find('.tabs-root>li>a:eq(' + activeItem + ')').tab('show');
648            loadModules(pnlTabs, opts);
649        }
650        else if (opts.IsCollapsedInitially.Value)
651            pnlTabs.find('.tab-pane').removeClass('active in');
652
653        pnlTabs.find('.tabButton').click(function (e) {
654            refreshIframes($(this).children('a').attr('href'));
655            e.preventDefault();
656        });
657
658        if (opts.OpenAction.Value == 1 || opts.OpenAction.Value == 'hover') {
659            pnlTabs.find('ul > li > a.tabLink').mouseenter(function () {
660                $(this).click();
661                $($(this).attr('href')).mouseenter(function (e) {
662                    e.preventDefault();
663                    $("[href=#" + $(this).attr('id') + "]").click();
664                })
665            });
666        }
667    }
668
669    function persist(opts, elHeader, itemIndex, bookmark) {
670
671        elHeader = $(elHeader);
672
673        var anchorParent = elHeader.parent();
674        elHeader.hasClass('active') && !anchorParent.hasClass('active') && anchorParent.addClass('active');
675
676        // setup cookie persistence
677        if (opts.PersistInCookies.Value)
678            $.cookie('tabsPro' + opts.ModuleId, itemIndex, { "path": "/", "expires": 365 });
679
680        // setup urls persistence
681        setTimeout(function () {
682            if (opts.PersistInUrl.Value && (anchorParent.hasClass('active') || $($(elHeader).attr('data-target')).attr('aria-expanded'))) {
683                _hashLockNext = true;
684                if (location.hash.replace(/\//g, '') !== ('#' + bookmark))
685                    location.hash = '#' + (itemIndex != -1 ? bookmark : '_');
686            } else {
687                return false;
688
689            }
690        }, 300);
691
692
693        // setup postback persistence
694        if (opts.PersistOnPostback.Value)
695            $(opts.hdnActiveTabSelector).val(itemIndex);
696
697
698        // scroll tab header into view
699        if (opts.AutoScroll.Value && !elementInViewport(elHeader, window.innerHeight / 2)) {
700            $('html, body').animate({
701                scrollTop: elHeader.offset().top - 40
702            }, 500);
703        }
704
705        // log current tab in google analytics
706        if (typeof (_gaq) != 'undefined') {
707            //console.log('push to google analytics');
708            if (bookmark) {
709                _gaq.push(['_trackPageview', window.location.pathname + '/' + bookmark]);
710            } else {
711                _gaq.push(['_trackPageview', window.location.pathname + '/']);
712            }
713        }
714
715    }
716
717    function tpRenderAccordion(pnlTabs, opts) {
718
719        // initialize accordion
720        pnlTabs.find('>.accordion-root>.panel>.panel-collapse').collapse({
721            parent: '.panel-group' + opts.ModuleId,
722            toggle: false
723        });
724
725        // setup height
726        if (opts.PanelHeight.Value > 0) {
727            pnlTabs.find('.tabPnl').css('height', opts.PanelHeight.Value);
728            pnlTabs.find('>.accordion-root>div>.panel-collapse>div>div').css({ 'overflow': 'auto' });
729        }
730
731        // load active item
732        var activeItem = getActiveItem(pnlTabs, opts);
733        if (activeItem >= 0)
734            pnlTabs.find('.accordion-root .panel-collapse:eq(' + activeItem + ')').collapse('show');
735        loadModules(pnlTabs, opts);
736        // setup navigation
737        pnlTabs.find('.accordionLink').not('.ignore-events').click(function (e, params) {
738            if ($(e.currentTarget).parent().hasClass('disabled')) {
739                e.preventDefault();
740                return false; // fix for internet explorer, pointer-events:none
741            }
742            opts.waitingForBroadcast = false;
743            // select current item
744            var itemIndex = pnlTabs.find('.accordion-root>div>.panel-heading a').index($(this));
745            var panel = $($(this).attr('data-target'));
746
747            // check if item is already open
748            // if (panel.hasClass('in')) {
749
750            // if (!opts.IsCollapsible.Value)
751            // return false;
752            // itemIndex = -1;
753            // }
754
755
756            if (opts.IsCollapsible.Value) {
757                panel.collapse('toggle');
758            } else {
759                panel.collapse('show');
760                pnlTabs.find('.accordion-root .panel-collapse[aria-expanded="true"]').not('.ignore-events').not(panel).not('.collapsing').collapse('hide')
761            }
762            // $($(this).attr('data-target')).collapse(opts.IsCollapsible.Value ? 'toggle' : 'show');
763
764            // setup persistence
765            setTimeout(function () {
766                persist(opts, $(e.relatedTarget || e.currentTarget), itemIndex, panel.find('>div>div').attr('data-bookmark'));
767            }, 100)
768
769            refreshIframes($(this).attr('data-target'));
770            loadModules(pnlTabs, opts);
771            return false;
772        });
773
774
775    }
776
777    function refreshIframes(tabs) {
778        // this is for google map issue in tab
779        //Warning: It refresh all iframe (iframe which you dont want to refresh add a class 'donotrefresh')
780        var iframes = $(tabs).find('iframe:not(.donotrefresh)');
781        for (var i = 0; i < iframes.length; i++) {
782            $(iframes[i]).attr('src', $(iframes[i]).attr('src'));
783            // avoid re-refresh of iframe
784            $(iframes[i]).addClass('donotrefresh');
785        }
786    }
787
788
789    //get Tabs and match them with settings
790    function getTabs(opts) {
791        var tabs = [];
792        $.each($(opts.pnlDlgSelector).find('.tabLink'), function (index, value) {
793            tabs.push({ 'control': $(opts.pnlDlgSelector).find('.tabLink').eq(index), 'settings': opts.Tabs == undefined ? {} : opts.Tabs[index] });
794        });
795        return tabs;
796    }
797    //Change Tab State
798    function changeTabState(tabs) {
799        $.each(tabs, function (index, tab) {
800            //check for Enable
801            if (tab.settings.IsEnabled == true || tab.settings.IsEnabled == null) {
802                tab.control.parent().removeClass('disabled');
803            }
804            else {
805                tab.control.parent().addClass('disabled');
806            }
807            //check for Show
808            if (tab.settings.IsShown == true || tab.settings.IsShown == null) {
809                tab.control.css('display', 'block');
810                //$(tab.control.attr('href')).css('display', 'block');
811            }
812            else {
813                tab.control.css('display', 'none');
814                //$(tab.control.attr('href')).css('display', 'none');
815            }
816        })
817    }
818    //get Accordions and match them with settings
819    function getAccordions(opts) {
820        var accordions = [];
821        $.each($(opts.pnlDlgSelector).find('.accordionLink').not('.ignore-events'), function (index, value) {
822            accordions.push({ 'control': $(opts.pnlDlgSelector).find('.accordionLink').not('.ignore-events').eq(index), 'settings': opts.Tabs == undefined ? {} : opts.Tabs[index] });
823        });
824        return accordions;
825    }
826    //Change Accordion State
827    function changeAccordionState(accordions) {
828        $.each(accordions, function (index, accordion) {
829            if (!accordion.settings)
830                return;
831            //check for Enable
832            if (accordion.settings.IsEnabled == true || accordion.settings.IsEnabled == null) {
833                accordion.control.parent().removeClass('disabled');
834            }
835            else {
836                accordion.control.parent().addClass('disabled');
837            }
838            //check for show
839            if (accordion.settings.IsShown == true || accordion.settings.IsShown == null) {
840                accordion.control.closest('.panel').css('display', 'block');
841            }
842            else {
843                accordion.control.closest('.panel').css('display', 'none');
844            }
845        })
846    }
847
848    //Public API
849    dnnsf.api.tabspro = {
850        refreshTabPro: function (params, done) {
851            try {
852                var opts = { 'pnlDlgSelector': '#' + $('div[data-mid=' + params.mid + ']').attr('id'), ModuleId: params.mid };
853                opts.dnnPageQuery = $('div[data-mid=' + params.mid + ']').attr('data-page-query');
854                //get Query of dnn 
855                var dnnQuery = dnnsf.getUrlParts(dnnsf.getUrlParts().getUrl() + '?' + opts.dnnPageQuery).query;
856                //get our Query
857                var pageQuery = dnnsf.getUrlParts(window.location).query;
858                //Merge QueryStrings
859                var currentLink = dnnsf.getUrlParts('');
860
861                var tabIdKey = _.head(_.keys(_.pickBy(dnnQuery, function (val, key, obj) { return key.match(/tabid/i); })));
862                currentLink.query = $.extend(dnnQuery, pageQuery,
863                    params.qs && !$.isEmptyObject(params.qs) && params.qs,
864                    { _alias: dnnsf.alias }, { _mid: params.mid }, { _tabid: dnnQuery[tabIdKey] });
865
866                delete currentLink.query[tabIdKey];
867
868                //Get Tab State
869                $.get("//" + dnnsf.alias + "/DesktopModules/DnnSharp/TabsPro/API/settings/EvaluateTabStates",
870                    currentLink.query
871                )
872                    .done(function (data) {
873                        opts.Tabs = data;
874                        //tabs
875                        if (done) {
876                            done(getAvailableItem(params.tabId, opts));
877                        }
878                        if ($(opts.pnlDlgSelector).attr('data-layout') == 'tab') {
879                            params.tabId = params.tabId == undefined ? getActiveTab(opts.pnlDlgSelector) : params.tabId;
880                            setTimeout(function () {
881                                changeTabState(getTabs(opts));
882                            }, 0);
883                            dnnsf.api.tabspro.changeTab({ 'mid': params.mid, 'viewOrder': getAvailableItem(params.tabId, opts), 'refresh': false, 'qs': params.qs || '' });
884                            return getTabs(opts);
885                        }
886                        //accordion
887                        if ($(opts.pnlDlgSelector).attr('data-layout') == 'accordion') {
888                            params.tabId = params.tabId == undefined ? getActiveAccordion(opts.pnlDlgSelector) : params.tabId;
889                            changeAccordionState(getAccordions(opts));
890                            dnnsf.api.tabspro.changeTab({ 'mid': params.mid, 'viewOrder': getAvailableItem(params.tabId, opts), 'refresh': false });
891                            return getAccordions(opts);
892                        }
893                    });
894            }
895            catch (e) {
896                return e;
897            }
898        },
899        changeTab: function (params, done) {
900            params.fromChangeTab = true;
901            try {
902                var opts = { 'pnlDlgSelector': '#' + $('div[data-mid=' + params.mid + ']').attr('id'), ModuleId: params.mid };
903                var viewOrderTabId;
904                if (!$(opts.pnlDlgSelector).length)
905                    return waitForTp(params, done, opts);
906                if ($(opts.pnlDlgSelector).attr('data-layout') == 'tab') {
907                    var elems = getTabs(opts);
908                    $.each(elems, function (index, value) {
909                        if (parseInt(value.control.attr('href').split('#tptab')[1]) == params.tabId) {
910                            viewOrderTabId = index;
911                        }
912                    });
913                }
914                if ($(opts.pnlDlgSelector).attr('data-layout') == 'accordion') {
915                    var elems = getAccordions(opts);
916                    $.each(elems, function (index, value) {
917                        if (parseInt(value.control.attr('data-target').split('#tptabRoot')[1]) == params.tabId) {
918                            viewOrderTabId = index;
919                        }
920                    });
921                }
922                if (params.viewOrder != null) {
923                    params.tabId = params.viewOrder;
924                } else {
925                    params.tabId = viewOrderTabId;
926                }
927                var elems;
928                if (params.refresh == true) {
929                    dnnsf.api.tabspro.refreshTabPro(params, done);
930                } else {
931                    if (done) {
932                        done(params.viewOrder);
933                    }
934                    //tabs
935                    if ($(opts.pnlDlgSelector).attr('data-layout') == 'tab') {
936                        elems = getTabs(opts);
937                        //elems[params.tabId].control.tab('show');
938                        !elems[params.tabId].control.parent().hasClass('active') && elems[params.tabId].control.trigger('click', params);
939                        return { control: elems[params.tabId].control, tabId: params.tabId }
940                    }
941                    //accordion
942                    if ($(opts.pnlDlgSelector).attr('data-layout') == 'accordion') {
943                        elems = getAccordions(opts);
944                        elems[params.tabId].control.closest('.panel').find('.collapse').collapse('show');
945                        elems[params.tabId].control.click();
946                        if (params && !$.isEmptyObject(params.qs)) {
947                            updateQs(params);
948                        }
949                        return { control: elems[params.tabId].control, tabId: params.tabId }
950                    }
951                    getAvailableItem(params.tabId, opts);
952
953                }
954                setTimeout(function () {
955                    $(opts.pnlDlgSelector).find('.nav').removeClass('disabled-nav');
956                }, 0)
957            }
958            catch (e) {
959                return e;
960            }
961        },
962        isModalOpen: {},
963        showLoading: {},
964        openModal: function (params) {
965            dnnsf.api.tabspro.showLoading['tabsPopup' + params.mid] && $('#dnn_ctr' + params.mid + '_Main_pnlDialog .common-loading-container').first().show();
966
967            if (!dnnsf.api.tabspro.isModalOpen['tabsPopup' + params.mid]) {
968
969                dnnsf.api.tabspro.isModalOpen['tabsPopup' + params.mid] = true;
970
971                $('#dnn_ctr' + params.mid + '_Main_pnlTabs > .modal').on('hidden.bs.modal', function () {
972                    dnnsf.api.tabspro.isModalOpen['tabsPopup' + params.mid] = false;
973                    $('#dnn_ctr' + params.mid + '_Main_pnlTabs > .modal').off('hidden.bs.modal');
974                });
975
976                var opts = { 'pnlDlgSelector': '#' + $('div[data-mid=' + params.mid + ']').attr('id'), TabsLayout: { Value: '' }, ModuleId: params.mid }
977                var tabs = getTabs(opts);
978                var index;
979                if ($(opts.pnlDlgSelector).attr('data-layout') == 'tab') {
980                    index = getActiveTab(opts.pnlDlgSelector);
981                }
982                if ($(opts.pnlDlgSelector).attr('data-layout') == 'accordion') {
983                    index = getActiveAccordion(opts.pnlDlgSelector);
984                    opts.TabsLayout.Value = 4;
985                }
986                if (index != undefined) {
987                    var targetModuleListLeave = [];
988                    $.each(window.TabsPro[params.mid][index].TabModules, function (index, value) {
989                        targetModuleListLeave.push(value.ModuleId);
990                    });
991                    dnnsf.events.broadcast('ActionFormPing', { 'targetModuleList': targetModuleListLeave }, function (responses) {
992                        responses && $.each(responses, function (index, mid) {
993                            dnnsf.api.actionForm.initForm(mid, params.params);
994                        });
995
996                    });
997                }
998                return setTimeout(function () {
999                    loadModules(this, opts, params.params);
1000                    $('#dnn_ctr' + params.mid + '_Main_pnlTabs > .modal').modal();
1001                }, 300);
1002            }
1003        },
1004        closeModal: function (params) {
1005            return $('#dnn_ctr' + params.mid + '_Main_pnlTabs > .modal').modal('hide');
1006        },
1007    };
1008    function waitForTp(params, done, opts) {
1009        var i = 0;
1010        var checkIfLoaded = setInterval(function () {
1011            i++;
1012            if ($('div[data-mid=' + params.mid + ']').length || i > 100) {
1013                dnnsf.api.tabspro.changeTab(params, done);
1014                clearInterval(checkIfLoaded);
1015            }
1016        }, 100)
1017    }
1018})(dnnsfjQuery);
1019
1020
1021

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.