Uname: Linux webm005.cluster107.gra.hosting.ovh.net 5.15.167-ovh-vps-grsec-zfs-classid #1 SMP Tue Sep 17 08:14:20 UTC 2024 x86_64
User: 6036 (villadal)
Group: 100 (users)
Disabled functions: NONE
Safe mode: On[ PHPinfo ]
//home/villadal/www/wp-content///plugins/wordfence/js      ( Reset | Go to )
File Name: admin.liveTraffic.1756145765.js
Edit
(function($) {
    var __ = window.wfi18n.__;
    var sprintf = window.wfi18n.sprintf;

    var LISTING_LIMIT = 50;

    LiveTrafficViewModel = function(listings, filters) {
        var self = this;
        var listingIDTable = {};
        self.listings = ko.observableArray(listings);
        self.listings.subscribe(function(items) {
            listingIDTable = {};
            for (var i = 0; i < items.length; i++) {
                listingIDTable[items[i].id()] = 1;
            }
            //console.log(items);
        });
        self.hasListing = function(id) {
            return id in listingIDTable;
        };
        self.filters = ko.observableArray(filters);

        var urlGroupBy = new GroupByModel('url', __('URL'));
        var groupBys = [
            new GroupByModel('type', __('Type')),
            new GroupByModel('user_login', __('Username')),
            new GroupByModel('statusCode', __('HTTP Response Code')),
            new GroupByModel('action', __('Firewall Response'), 'enum', ['ok', 'throttled', 'lockedOut', 'blocked', 'blocked:waf']),
            new GroupByModel('ip', __('IP')),
            urlGroupBy
        ];

        self.presetFiltersOptions = ko.observableArray([
            new PresetFilterModel(__('All Hits'), "all", []),
            new PresetFilterModel(__('Humans'), "humans", [new ListingsFilterModel(self, 'type', 'human')]),
            new PresetFilterModel(__('Registered Users'), "users", [new ListingsFilterModel(self, 'userID', '0', '!=')]),
            new PresetFilterModel(__('Crawlers'), "crawlers", [new ListingsFilterModel(self, 'type', 'bot')]),
            new PresetFilterModel(__('Google Crawlers'), "google", [new ListingsFilterModel(self, 'isGoogle', '1')]),
            new PresetFilterModel(__('Pages Not Found'), "404s", [new ListingsFilterModel(self, 'statusCode', '404')]),
            new PresetFilterModel(__('Logins and Logouts'), "logins", [
                new ListingsFilterModel(self, 'action', 'login', 'contains'),
                new ListingsFilterModel(self, 'action', 'logout', 'contains')
            ]),
            //new PresetFilterModel('Top Consumers', "top_consumers", [new ListingsFilterModel(self, 'statusCode', '200')], urlGroupBy),
            //new PresetFilterModel('Top 404s', "top_404s", [new ListingsFilterModel(self, 'statusCode', '404')], urlGroupBy),
            new PresetFilterModel(__('Locked Out'), "lockedOut", [new ListingsFilterModel(self, 'action', 'lockedOut')]),
            new PresetFilterModel(__('Blocked'), "blocked", [new ListingsFilterModel(self, 'action', 'blocked', 'contains')]),
            new PresetFilterModel(__('Blocked By Firewall'), "blocked:waf", [new ListingsFilterModel(self, 'action', 'blocked:waf')])
        ]);

        self.showAdvancedFilters = ko.observable(false);
        self.showAdvancedFilters.subscribe(function(val) {
            if (val && self.filters().length == 0) {
                self.addFilter();
            }
        });

        self.presetFiltersOptionsText = function(item) {
            return item.text();
        };

        self.selectedPresetFilter = ko.observable();
        self.selectedPresetFilter.subscribe(function(item) {
            var clonedFilters = ko.toJS(item.filters());
            var newFilters = [];
            for (var i = 0; i < clonedFilters.length; i++) {
                newFilters.push(new ListingsFilterModel(self, clonedFilters[i].param, clonedFilters[i].value, clonedFilters[i].operator));
            }
            self.filters(newFilters);
            self.groupBy(item.groupBy());
        });

        self.filters.subscribe(function() {
            self.checkQueryAndReloadListings();
        });

        self.addFilter = function() {
            self.filters.push(new ListingsFilterModel(self));
        };

        self.removeFilter = function(item) {
            self.filters.remove(item);
        };

        var currentFilterQuery = '';
        var getURLEncodedFilters = function() {
            var dataString = '';
            ko.utils.arrayForEach(self.filters(), function(filter) {
                if (filter.getValue() !== false) {
                    dataString += filter.urlEncoded() + '&';
                }
            });
            var groupBy = self.groupBy();
            if (groupBy) {
                dataString += 'groupby=' + encodeURIComponent(groupBy.param()) + '&';
            }
            var startDate = self.startDate();
            if (startDate) {
                dataString += 'startDate=' + encodeURIComponent(startDate) + '&';
            }
            var endDate = self.endDate();
            if (endDate) {
                dataString += 'endDate=' + encodeURIComponent(endDate) + '&';
            }
            if (dataString.length > 1) {
                return dataString.substring(0, dataString.length - 1);
            }
            return '';
        };

        self.filterGroupByOptions = ko.observableArray(groupBys);

        self.filterGroupByOptionsText = function(item) {
            return item.text() || item.param();
        };

        self.groupBy = ko.observable();
        self.groupBy.subscribe(function() {
            self.checkQueryAndReloadListings();
        });

        self.startDate = ko.observable();
        self.startDate.subscribe(function() {
            // console.log('start date change ' + self.startDate());
            self.checkQueryAndReloadListings();
        });

        self.endDate = ko.observable();
        self.endDate.subscribe(function() {
            // console.log('end date change ' + self.endDate());
            self.checkQueryAndReloadListings();
        });

        /**
         * Pulls down fresh traffic data and resets the list.
         *
         * @param options
         */
        self.checkQueryAndReloadListings = function(options) {
            if (currentFilterQuery !== getURLEncodedFilters()) {
                self.reloadListings(options);
            }
        };
        self.reloadListings = function(options) {
            pullDownListings(options, function(listings) {
                var groupByKO = self.groupBy();
                var groupBy = '';
                if (groupByKO) {
                    groupBy = groupByKO.param();
                    WFAD.mode = 'liveTraffic_paused';
                }
                else {
                    WFAD.mode = 'liveTraffic';
                }

                var newListings = [];
                for (var i = 0; i < listings.length; i++) {
                    newListings.push(new ListingModel(listings[i], groupBy));
                }
                self.listings(newListings);
            })
        };

        /**
         * Used in the infinite scroll
         */
        self.loadNextListings = function(callback) {
            var lastTimestamp = self.filters[0];
            pullDownListings({
                since: lastTimestamp,
                limit: LISTING_LIMIT,
                offset: self.listings().length
            }, function() {
                self.appendListings.apply(this, arguments);
                typeof callback === 'function' && callback.apply(this, arguments);
            });
        };

        self.getCurrentQueryString = function(options) {
            var queryOptions = {
                since: null,
                limit: LISTING_LIMIT,
                offset: 0
            };
            for (var prop in queryOptions) {
                if (queryOptions.hasOwnProperty(prop) && options && prop in options) {
                    queryOptions[prop] = options[prop];
                }
            }
            currentFilterQuery = getURLEncodedFilters();
            var data = currentFilterQuery;
            for (prop in queryOptions) {
                if (queryOptions.hasOwnProperty(prop)) {
                    var val = queryOptions[prop];
                    if (val === null || val === undefined) {
                        val = '';
                    }
                    data += '&' + encodeURIComponent(prop) + '=' + encodeURIComponent(val);
                }
            }
            return data;
        };

        var pullDownListings = function(options, callback) {
            var data = self.getCurrentQueryString(options);

            WFAD.ajax('wordfence_loadLiveTraffic', data, function(response) {
                if (!response || !response.success) {
                    return;
                }
                callback && callback(response.data, response);
                self.sql(response.sql);
            });
        };

        self.prependListings = function(listings, response) {
            for (var i = listings.length - 1; i >= 0; i--) {
                // Prevent duplicates
                if (self.hasListing(listings[i].id)) {
                    continue;
                }
                var listing = new ListingModel(listings[i]);
                listing.highlighted(true);
                self.listings.unshift(listing);
            }

            //self.listings.sort(function(a, b) {
            //    if (a.ctime() < b.ctime()) {
            //        return 1;
            //    } else if (a.ctime() > b.ctime()) {
            //        return -1;
            //    }
            //    return 0;
            //});
        };

        self.appendListings = function(listings, response) {
            var highlight = 3;
            for (var i = 0; i < listings.length; i++) {
                // Prevent duplicates
                if (self.hasListing(listings[i].id)) {
                    continue;
                }
                var listing = new ListingModel(listings[i]);
                listing.highlighted(highlight-- > 0);
                self.listings.push(listing);
            }

            //self.listings.sort(function(a, b) {
            //    if (a.ctime() < b.ctime()) {
            //        return 1;
            //    } else if (a.ctime() > b.ctime()) {
            //        return -1;
            //    }
            //    return 0;
            //});
        };

        self.whitelistWAFParamKey = function(path, paramKey, failedRules) {
            WFAD.ajax('wordfence_whitelistWAFParamKey', {
                path: path,
                paramKey: paramKey,
                failedRules: failedRules
            }, function(response) {

            });
        };

        self.trimIP = function(ip) {
            if (ip && ip.length > 16) {
                return ip.substring(0, 16) + "\u2026";
            }
            return ip;
        };

        $(window).on('wf-live-traffic-ip-blocked', function(e, ip) {
            ko.utils.arrayForEach(self.listings(), function(listing) {
                if (listing.IP() === ip) {
                    listing.blocked(true);
                }
            });
        }).on('wf-live-traffic-ip-unblocked', function(e, ip) {
            ko.utils.arrayForEach(self.listings(), function(listing) {
                if (listing.IP() === ip) {
                    listing.blocked(false);
                }
            });
        });

        // For debuggering-a-ding
        self.sql = ko.observable('');
    };

    LiveTrafficViewModel.truncateText = function(text, maxLength) {
        maxLength = maxLength || 100;
        if (text && text.length > maxLength) {
            return text.substring(0, Math.round(maxLength)) + "\u2026";
            // return text.substring(0, Math.round(maxLength / 2)) + " ... " + text.substring(text.length - Math.round(maxLength / 2));
        }
        return text;
    };

    var ListingModel = function(data, groupBy) {
        var self = this;

        self.id = ko.observable(0);
        self.ctime = ko.observable(0);
        self.IP = ko.observable('');
        self.jsRun = ko.observable(0);
        self.statusCode = ko.observable(200);
        self.isGoogle = ko.observable(0);
        self.userID = ko.observable(0);
        self.URL = ko.observable('');
        self.referer = ko.observable('');
        self.UA = ko.observable('');
        self.loc = ko.observable();
        self.type = ko.observable('');
        self.blocked = ko.observable(false);
        self.rangeBlocked = ko.observable(false);
        self.ipRangeID = ko.observable(-1);
        self.extReferer = ko.observable();
        self.browser = ko.observable();
        self.user = ko.observable();
        self.hitCount = ko.observable();
        self.username = ko.observable('');

        // New fields/columns
        self.action = ko.observable('');
        self.actionDescription = ko.observable(false);
        self.actionData = ko.observable();

        self.highlighted = ko.observable(false);
        self.showDetails = ko.observable(false);
        self.toggleDetails = function() {
            self.showDetails(!self.showDetails());
        };
        //self.highlighted.subscribe(function(val) {
        //    if (val) {
        //        _classes += ' highlighted';
        //        self.cssClasses(_classes);
        //    } else {
        //        _classes.replace(/  highlighted(\s*|$)/, ' ');
        //        self.cssClasses(_classes);
        //    }
        //});

        for (var prop in data) {
            if (data.hasOwnProperty(prop)) {
                if (prop === 'blocked' || prop === 'rangeBlocked') {
                    data[prop] = !!data[prop];
                }
                self[prop] !== undefined && self[prop](data[prop]);
            }
        }

        if (data['lastHit'] !== undefined) {
            self['ctime'](data['lastHit']);
        }

        self.timestamp = ko.pureComputed(function() {
            var date = new Date(self.ctime() * 1000);
            return date.toLocaleDateString() + ' ' + date.toLocaleTimeString();
        }, self);

        // Use the same format as these update.
        self.timeAgo = ko.pureComputed(function() {
            var serverTime = WFAD.serverMicrotime;
            return $(WFAD.showTimestamp(this.ctime(), serverTime)).text();
        }, self);

        self.displayURL = ko.pureComputed(function() {
            return LiveTrafficViewModel.truncateText(self.URL(), 105);
        });

        self.displayURLShort = ko.pureComputed(function() {
            var a = document.createElement('a');
            if (!self.URL()) {
                return '';
            }
            a.href = self.URL();
            if (a.host !== location.host) {
                return LiveTrafficViewModel.truncateText(self.URL(), 30);
            }
            var url = a.pathname + (typeof a.search === 'string' ? a.search : '');
            return LiveTrafficViewModel.truncateText(url, 30);
        });

        self.firewallAction = ko.pureComputed(function() {
            //Grouped by firewall action listing
            if (groupBy == 'action') {
                switch (self.action()) {
                    case 'lockedOut':
                        return __('Locked out from logging in');
                    case 'blocked:waf-always':
                        return __('Blocked by the Wordfence Application Firewall and plugin settings');
                    case 'blocked:wordfence':
                        return __('Blocked by Wordfence plugin settings');
                    case 'blocked:wfsnrepeat':
                    case 'blocked:wfsn':
                        return __('Blocked by the Wordfence Security Network');
                    case 'blocked:waf':
                        return __('Blocked by the Wordfence Web Application Firewall');
                    case 'cbl:redirect':
                        return __('Redirected by Country Blocking bypass URL');
                    default:
                        return __('Blocked by Wordfence');
                }
            }

            //Standard listing
            var desc = '';
            switch (self.action()) {
                case 'lockedOut':
                    return __('locked out from logging in');

                case 'blocked:waf-always':
                case 'blocked:wordfence':
                case 'blocked:wfsnrepeat':
                    desc = self.actionDescription();
                    if (desc && desc.toLowerCase().indexOf('block') === 0) {
                        return 'b' + desc.substring(1);
                    }
                    return sprintf(__('blocked for %s'), desc);

                case 'blocked:wfsn':
                    return __('blocked by the Wordfence Security Network');

                case 'blocked:waf':
                    var data = self.actionData();
                    if (typeof data === 'object') {
                        var paramKey = data.paramKey ? WFAD.base64_decode(data.paramKey) : null;
                        var paramValue = data.paramKey ? WFAD.base64_decode(data.paramValue) : null;
                        // var category = data.category;

                        var matches = paramKey !== null && paramKey.match(/([a-z0-9_]+\.[a-z0-9_]+)(?:\[(.+?)\](.*))?/i);
                        desc = self.actionDescription();
                        if (matches) {
                            switch (matches[1]) {
                                case 'request.queryString':
                                    desc = sprintf(__('%s in query string: %s'), self.actionDescription(), matches[2] + '=' + LiveTrafficViewModel.truncateText(encodeURIComponent(paramValue)));
                                    break;
                                case 'request.body':
                                    desc = sprintf(__('%s in POST body: %s'), self.actionDescription(), matches[2] + '=' + LiveTrafficViewModel.truncateText(encodeURIComponent(paramValue)));
                                    break;
                                case 'request.cookie':
                                    desc = sprintf(__('%s in cookie: %s'), self.actionDescription(), matches[2] + '=' + LiveTrafficViewModel.truncateText(encodeURIComponent(paramValue)));
                                    break;
                                case 'request.fileNames':
                                    desc = sprintf(__('%s in file: %s'), self.actionDescription(), matches[2] + '=' + LiveTrafficViewModel.truncateText(encodeURIComponent(paramValue)));
                                    break;
                            }
                        }
                        if (desc) {
                            return sprintf(__('blocked by firewall for %s'), desc);
                        }
                        if (data.failedRules == 'blocked') {
                            return __('blocked by real-time IP blocklist');
                        }
                        return __('blocked by firewall');
                    }
                    return sprintf(__('blocked by firewall for %s'), self.actionDescription());
                case 'cbl:redirect':
                    desc = self.actionDescription();
                    return desc;
            }
            return desc;
        });

        self.cssClasses = ko.pureComputed(function() {
            var classes = 'wf-live-traffic-hit-type';
            if (self.statusCode() == 403 || self.statusCode() == 503) {
                classes += ' wfActionBlocked';
            }
            if (self.statusCode() == 404) {
                classes += ' wf404';
            }
            if (self.jsRun() == 1) {
                classes += ' wfHuman';
            }
            if (self.actionData() && self.actionData().learningMode) {
                classes += ' wfWAFLearningMode';
            }
            if (self.action() == 'loginFailValidUsername' || self.action() == 'loginFailInvalidUsername') {
                classes += ' wfFailedLogin';
            }
            // if (self.highlighted()) {
            //     classes += ' highlighted';
            // }
            return classes;
        });

        self.typeIconClass = ko.pureComputed(function() {
            var classes = 'wf-live-traffic-type-icon';
            if (self.statusCode() == 403 || self.statusCode() == 503) {
                classes += ' wf-icon-blocked wf-ion-android-cancel';
            } else if (self.statusCode() == 404 || self.action() == 'loginFailValidUsername' || self.action() == 'loginFailInvalidUsername') {
                classes += ' wf-icon-warning wf-ion-alert-circled';
            } else if (self.jsRun() == 1) {
                classes += ' wf-icon-human wf-ion-ios-person';
            } else {
                // classes += ' wf-ion-soup-can';
                classes += ' wf-ion-bug';
            }
            return classes;
        });

        self.typeText = ko.pureComputed(function() {
            var type = '';
            if (self.action() == 'loginFailValidUsername' || self.action() == 'loginFailInvalidUsername') {
                type = __('Failed Login');
            } else if (self.statusCode() == 403 || self.statusCode() == 503) {
                type = __('Blocked');
            } else if (self.statusCode() == 404) {
                type = __('404 Not Found');
            } else if (self.statusCode() == 302) {
                type = __('Redirected');
            } else if (self.jsRun() == 1) {
                type = __('Human');
            } else {
                type = __('Bot');
            }
            return sprintf(__('Type: %s'), type);
        });

        function slideInDrawer() {
            overlayWrapper.fadeIn(400);
            overlay.css({
                right: '-800px'
            })
            .stop()
            .animate({
                right: 0
            }, 500);
        }

        self.showWhoisOverlay = function() {
            slideInDrawer();
            overlayHeader.html($('#wfActEvent_' + self.id()).html());
            overlayBody.html('').css('opacity', 0);

            WFAD.ajax('wordfence_whois', {
                val: self.IP()
            }, function(result) {
                var whoisHTML = WFAD.completeWhois(result, true);
                overlayBody.stop()
                .animate({
                    opacity: 1
                }, 200)
                .html('<h4 style=\'margin-top:0;\'>' + __('WHOIS LOOKUP') + '</h4>' + whoisHTML);
                $(window).trigger('wf-live-traffic-overlay-bind', self);
            });
        };

        self.showRecentTraffic = function() {
            slideInDrawer();
            overlayHeader.html($('#wfActEvent_' + self.id()).html());
            overlayBody.html('').css('opacity', 0);

            WFAD.ajax('wordfence_recentTraffic', {
                ip: self.IP()
            }, function(result) {
                overlayBody.stop()
                .animate({
                    opacity: 1
                }, 200)
                .html('<h3 style=\'margin-top:0;\'>' + __('Recent Activity') + '</h3>' + result.result);
                $(window).trigger('wf-live-traffic-overlay-bind', self);
                WFAD.avatarLookup();
            });
        };

        /*
            Blocking functions
        */
        self.unblockIP = function() {
            WFAD.unblockIP(self.IP(), function() {
                $(window).trigger('wf-live-traffic-ip-unblocked', self.IP());
            });
        };
        self.unblockNetwork = function() {
            WFAD.unblockNetwork(self.ipRangeID());
        };
        self.blockIP = function() {
            WFAD.blockIP(self.IP(), __('Manual block by administrator'), function() {
                $(window).trigger('wf-live-traffic-ip-blocked', self.IP());
            });
        };
    };

    var ListingsFilterModel = function(viewModel, param, value, operator) {
        var self = this;
        self.viewModel = viewModel;
        self.param = ko.observable('');
        self.value = ko.observable('');
        self.operator = ko.observable('');

        self.param(param);
        self.value(value);
        self.operator(operator || '=');

        var filterChanged = function() {
            self.viewModel && self.viewModel.checkQueryAndReloadListings && self.viewModel.checkQueryAndReloadListings();
        };
        self.param.subscribe(filterChanged);
        self.operator.subscribe(filterChanged);
        self.value.subscribe(function(value) {
            if (value instanceof FilterParamEnumOptionModel && value.operator()) {
                self.selectedFilterOperatorOptionValue(value.operator());
            }
            filterChanged();
        });

        var equalsOperator = new FilterOperatorModel('=');
        var notEqualsOperator = new FilterOperatorModel('!=', '\u2260');
        var containsOperator = new FilterOperatorModel('contains');
        var matchOperator = new FilterOperatorModel('match');
        self.filterOperatorOptions = ko.observableArray([
            equalsOperator,
            notEqualsOperator,
            containsOperator,
            matchOperator
        ]);

        self.filterParamOptions = ko.observableArray([
            new FilterParamModel('type', __('Type'), 'enum', [
                new FilterParamEnumOptionModel('human', __('Human')),
                new FilterParamEnumOptionModel('bot', __('Bot'))
            ]),
            new FilterParamModel('user_login', __('Username')),
            new FilterParamModel('userID', __('User ID')),
            new FilterParamModel('isGoogle', __('Google Bot'), 'bool'),
            new FilterParamModel('ip', __('IP')),
            new FilterParamModel('ua', __('User Agent')),
            new FilterParamModel('referer', __('Referer')),
            new FilterParamModel('url', __('URL')),
            new FilterParamModel('statusCode', __('HTTP Response Code')),
            new FilterParamModel('action', __('Firewall Response'), 'enum', [
                new FilterParamEnumOptionModel('', __('OK')),
                new FilterParamEnumOptionModel('throttled', __('Throttled')),
                new FilterParamEnumOptionModel('lockedOut', __('Locked Out')),
                new FilterParamEnumOptionModel('blocked', __('Blocked'), containsOperator),
                new FilterParamEnumOptionModel('blocked:waf', __('Blocked WAF'))
            ]),
            new FilterParamModel('action', __('Logins'), 'enum', [
                new FilterParamEnumOptionModel('loginOK', __('Logged In')),
                new FilterParamEnumOptionModel('loginFail', __('Failed Login')),
                new FilterParamEnumOptionModel('loginFailInvalidUsername', __('Failed Login: Invalid Username')),
                new FilterParamEnumOptionModel('loginFailValidUsername', __('Failed Login: Valid Username'))
            ]),
            new FilterParamModel('action', __('Security Event'))
        ]);

        self.filterParamOptionsText = function(item) {
            return item.text() || item.param();
        };

        self.selectedFilterParamOptionValue = ko.observable();
        self.selectedFilterParamOptionValue.subscribe(function(item) {
            self.param(item && item.param ? item.param() : '');
        });

        ko.utils.arrayForEach(self.filterParamOptions(), function(item) {
            if (self.param() == item.param()) {
                switch (item.type()) {
                    case 'enum':
                        // console.log(self.param(), item.param(), self.value(), values);
                        switch (self.operator()) {
                            case '=':
                                ko.utils.arrayForEach(item.values(), function(enumOption) {
                                    if (enumOption.value() == self.value()) {
                                        self.selectedFilterParamOptionValue(item);
                                    }
                                });
                                break;
                        }
                        break;

                    default:
                        self.selectedFilterParamOptionValue(item);
                        break;
                }
            }
        });

        self.filterOperatorOptionsText = function(item) {
            return item.text() || item.operator();
        };

        self.selectedFilterOperatorOptionValue = ko.observable();
        self.selectedFilterOperatorOptionValue.subscribe(function(item) {
            self.operator(item.operator());
        });

        ko.utils.arrayForEach(self.filterOperatorOptions(), function(item) {
            if (self.operator() == item.operator()) {
                self.selectedFilterOperatorOptionValue(item);
            }
        });

        self.getValue = function() {
            var value = self.value() instanceof FilterParamEnumOptionModel ? self.value().value() : self.value();
            return (typeof value === 'string' || typeof value === 'number') ? value : false;
        };
        self.urlEncoded = function() {
            var value = self.getValue();
            return 'param[]=' + encodeURIComponent(self.param()) + '&value[]=' + encodeURIComponent(value) +
                '&operator[]=' + encodeURIComponent(self.operator());
        };
    };

    var PresetFilterModel = function(text, value, filters, groupBy) {
        this.text = ko.observable('');
        this.value = ko.observable('');
        this.filters = ko.observableArray(filters);
        this.groupBy = ko.observable(groupBy);

        this.text(text);
        this.value(value);
    };

    var FilterParamModel = function(param, text, type, values) {
        this.text = ko.observable('');
        this.param = ko.observable('');
        this.type = ko.observable('');
        this.values = ko.observableArray(values);

        this.text(text);
        this.param(param);
        this.type(type || 'text');

        this.optionsText = function(item) {
            if (item instanceof FilterParamEnumOptionModel) {
                return item.label() || item.value();
            }
            return item;
        }
    };

    var FilterParamEnumOptionModel = function(value, label, operator) {
        this.value = ko.observable('');
        this.label = ko.observable('');
        this.operator = ko.observable('');

        this.value = ko.observable(value);
        this.label = ko.observable(label);
        this.operator = ko.observable(operator);

        this.toString = function() {
            return this.value();
        }
    };

    var FilterOperatorModel = function(operator, text) {
        this.text = ko.observable('');
        this.operator = ko.observable('');

        this.text(text);
        this.operator(operator);
    };

    var GroupByModel = function(param, text) {
        this.text = ko.observable('');
        this.param = ko.observable('');

        this.text(text);
        this.param(param);
    };

    ko.bindingHandlers.datetimepicker = {
        init: function(element, valueAccessor, allBindingsAccessor) {
            //initialize datepicker with some optional options
            var options = allBindingsAccessor().datepickerOptions || {},
                $el = $(element);

            $el.datetimepicker(options);

            //handle the field changing by registering datepicker's changeDate event
            ko.utils.registerEventHandler(element, "changeDate", function() {
                var observable = valueAccessor();
                observable($el.datetimepicker("getDate"));
            });

            //handle disposal (if KO removes by the template binding)
            ko.utils.domNodeDisposal.addDisposeCallback(element, function() {
                $el.datetimepicker("destroy");
            });

        },
        update: function(element, valueAccessor) {
            var value = ko.utils.unwrapObservable(valueAccessor()),
                $el = $(element);

            //handle date data coming via json from Microsoft
            if (String(value).indexOf('/Date(') == 0) {
                value = new Date(parseInt(value.replace(/\/Date\((.*?)\)\//gi, "$1")));
            }

            var current = $el.datetimepicker("getDate");

            if (value - current !== 0) {
                $el.datetimepicker("setDate", value);
            }
        }
    };

    var overlayWrapper = null,
        overlay = null,
        overlayCloseButton = null,
        overlayHeader = null,
        overlayBody = null;
    $(function() {

        var liveTrafficWrapper = $('#wf-live-traffic');
        $('#wf-lt-preset-filters').wfselect2({
            templateSelection: function(value) {
                return $('<span><em>' + __('Filter Traffic') + '</em>: ' + value.text + '</span>');
            }
        });

        overlayWrapper = $('#wf-live-traffic-util-overlay-wrapper').on('click', function(evt) {
            if (evt.target === this) {
                overlayCloseButton.trigger('click');
            }
        });
        overlay = overlayWrapper.find('.wf-live-traffic-util-overlay');
        overlayCloseButton = overlayWrapper.find('.wf-live-traffic-util-overlay-close').on('click', function() {
            overlayWrapper.fadeOut(250);
            overlay
            .stop()
            .animate({
                right: '-800px'
            }, 250);
            overlayHeader.html('');
            overlayBody.html('').css('opacity', 0);
            $(window).trigger('wf-live-traffic-overlay-unbind');
        });
        overlayHeader = overlayWrapper.find('.wf-live-traffic-util-overlay-header');
        overlayBody = overlayWrapper.find('.wf-live-traffic-util-overlay-body');
        $([overlayHeader, overlayBody]).on('click', function() {
            return false;
        });

        // liveTrafficWrapper.find('#wf-lt-advanced-filters select').wfselect2({
        //
        // });

        WFAD.wfLiveTraffic = new LiveTrafficViewModel();
        ko.applyBindings(WFAD.wfLiveTraffic, liveTrafficWrapper.get(0));
        liveTrafficWrapper.find('form').submit();
        WFAD.mode = 'liveTraffic';

        var legendWrapper = $('#wf-live-traffic-legend-wrapper');
        var placeholder = $('#wf-live-traffic-legend-placeholder');
        var legend = $('#wf-live-traffic-legend');
        var adminBar = $('#wpadminbar');
        var liveTrafficListings = $('#wf-lt-listings');
        var groupedListings = $('div#wf-live-traffic-group-by'); 

        var hasScrolled = false;
        var loadingListings = false;
        $(window).on('scroll', function() {
            var win = $(this);
            var needsSticky = (WFAD.isSmallScreen ? (legendWrapper.offset().top < win.scrollTop() + 10) : (legendWrapper.offset().top < win.scrollTop() + adminBar.outerHeight() + 10));
            if (needsSticky) {
                var legendWidth = legend.width();
                var legendHeight = legend.height();

                legend.addClass('sticky');
                legend.css('width', legendWidth);
                legend.css('height', legendHeight);
                placeholder.addClass('sticky');
                placeholder.css('width', legendWidth);
                placeholder.css('height', legendHeight);
            } else {
                legend.removeClass('sticky');
                legend.css('width', 'auto');
                legend.css('height', 'auto');
                placeholder.removeClass('sticky');
            }

            var firstLTRow = liveTrafficListings.children().filter(':visible').first();
            if ((firstLTRow.length > 0 && firstLTRow.offset().top + firstLTRow.height() < win.scrollTop() + adminBar.outerHeight() + 20) ||
                (groupedListings.filter(':visible').length > 0)) {
                if (WFAD.mode != 'liveTraffic_paused') {
                    WFAD.mode = 'liveTraffic_paused';
                }
            } else {
                if (WFAD.mode != 'liveTraffic') {
                    WFAD.mode = 'liveTraffic';
                }
            }

            // console.log(win.scrollTop() + window.innerHeight, liveTrafficWrapper.outerHeight() + liveTrafficWrapper.offset().top);
            var currentScrollBottom = win.scrollTop() + window.innerHeight;
            var scrollThreshold = liveTrafficWrapper.outerHeight() + liveTrafficWrapper.offset().top;
            if (hasScrolled && !loadingListings && currentScrollBottom >= scrollThreshold) {
                // console.log('infinite scroll');

                loadingListings = true;
                hasScrolled = false;
                WFAD.wfLiveTraffic.loadNextListings(function() {
                    loadingListings = false;
                    WFAD.reverseLookupIPs();
                    WFAD.avatarLookup();
                });
            } else if (currentScrollBottom < scrollThreshold) {
                hasScrolled = true;
                // console.log('no infinite scroll');
            }
        })
        .on('wf-live-traffic-overlay-bind', function(e, item) {
            ko.applyBindings(item, overlayHeader.get(0));
        })
        .on('wf-live-traffic-overlay-unbind', function(e, item) {
            ko.cleanNode(overlayHeader.get(0));
        });

        $([liveTrafficWrapper.find('.wf-filtered-traffic'), overlayWrapper]).tooltip({
            tooltipClass: "wf-tooltip",
            track: true
        });
    });
})
(jQuery);

All system for education purposes only. For more tools: Telegram @jackleet

Mr.X Private Shell

Logo
-
New File | New Folder
Command
SQL