PageSourceSearch

https://aforeignaffair.com/invar/ssi-common/jscript/lity.js

js aforeignaffair.com collected 2026-10-04 02:35:09 UTC 24,666 bytes, 807 lines download raw bytes

vendor: 18,023 bytes, lines 1-649
1/*! Lity - v2.2.2 - 2017-07-17
2* http://sorgalla.com/lity/
3* Copyright (c) 2015-2017 Jan Sorgalla; Licensed MIT */
4(function(window, factory) {
5    if (typeof define === 'function' && define.amd) {
6        define(['jquery'], function($) {
7            return factory(window, $);
8        });
9    } else if (typeof module === 'object' && typeof module.exports === 'object') {
10        module.exports = factory(window, require('jquery'));
11    } else {
12        window.lity = factory(window, window.jQuery || window.Zepto);
13    }
14}(typeof window !== "undefined" ? window : this, function(window, $) {
15    'use strict';
16
17    var document = window.document;
18
19    var _win = $(window);
20    var _deferred = $.Deferred;
21    var _html = $('html');
22    var _instances = [];
23
24    var _attrAriaHidden = 'aria-hidden';
25    var _dataAriaHidden = 'lity-' + _attrAriaHidden;
26
27    var _focusableElementsSelector = 'a[href],area[href],input:not([disabled]),select:not([disabled]),textarea:not([disabled]),button:not([disabled]),iframe,object,embed,[contenteditable],[tabindex]:not([tabindex^="-"])';
28
29    var _defaultOptions = {
30        esc: true,
31        handler: null,
32        handlers: {
33            image: imageHandler,
34            inline: inlineHandler,
35            youtube: youtubeHandler,
36            vimeo: vimeoHandler,
37            googlemaps: googlemapsHandler,
38            facebookvideo: facebookvideoHandler,
39            iframe: iframeHandler
40        },
41        template: '<div class="lity" role="dialog" aria-label="Dialog Window (Press escape to close)" tabindex="-1"><div class="lity-wrap" data-lity-close role="document"><div class="lity-loader" aria-hidden="true">Loading...</div><div class="lity-container"><div class="lity-content"></div><button class="lity-close" type="button" aria-label="Close (Press escape to close)" data-lity-close>&times;</button></div></div></div>'
42    };
43
44    var _imageRegexp = /(^data:image\/)|(\.(png|jpe?g|gif|svg|webp|bmp|ico|tiff?)(\?\S*)?$)/i;
45    var _youtubeRegex = /(youtube(-nocookie)?\.com|youtu\.be)\/(watch\?v=|v\/|u\/|embed\/?)?([\w-]{11})(.*)?/i;
46    var _vimeoRegex =  /(vimeo(pro)?.com)\/(?:[^\d]+)?(\d+)\??(.*)?$/;
47    var _googlemapsRegex = /((maps|www)\.)?google\.([^\/\?]+)\/?((maps\/?)?\?)(.*)/i;
48    var _facebookvideoRegex = /(facebook\.com)\/([a-z0-9_-]*)\/videos\/([0-9]*)(.*)?$/i;
49
50    var _transitionEndEvent = (function() {
51        var el = document.createElement('div');
52
53        var transEndEventNames = {
54            WebkitTransition: 'webkitTransitionEnd',
55            MozTransition: 'transitionend',
56            OTransition: 'oTransitionEnd otransitionend',
57            transition: 'transitionend'
58        };
59
60        for (var name in transEndEventNames) {
61            if (el.style[name] !== undefined) {
62                return transEndEventNames[name];
63            }
64        }
65
66        return false;
67    })();
68
69    function transitionEnd(element) {
70        var deferred = _deferred();
71
72        if (!_transitionEndEvent || !element.length) {
73            deferred.resolve();
74        } else {
75            element.one(_transitionEndEvent, deferred.resolve);
76            setTimeout(deferred.resolve, 500);
77        }
78
79        return deferred.promise();
80    }
81
82    function settings(currSettings, key, value) {
83        if (arguments.length === 1) {
84            return $.extend({}, currSettings);
85        }
86
87        if (typeof key === 'string') {
88            if (typeof value === 'undefined') {
89                return typeof currSettings[key] === 'undefined'
90                    ? null
91                    : currSettings[key];
92            }
93
94            currSettings[key] = value;
95        } else {
96            $.extend(currSettings, key);
97        }
98
99        return this;
100    }
101
102    function parseQueryParams(params) {
103        var pairs = decodeURI(params.split('#')[0]).split('&');
104        var obj = {}, p;
105
106        for (var i = 0, n = pairs.length; i < n; i++) {
107            if (!pairs[i]) {
108                continue;
109            }
110
111            p = pairs[i].split('=');
112            obj[p[0]] = p[1];
113        }
114
115        return obj;
116    }
117
118    function appendQueryParams(url, params) {
119        return url + (url.indexOf('?') > -1 ? '&' : '?') + $.param(params);
120    }
121
122    function transferHash(originalUrl, newUrl) {
123        var pos = originalUrl.indexOf('#');
124
125        if (-1 === pos) {
126            return newUrl;
127        }
128
129        if (pos > 0) {
130            originalUrl = originalUrl.substr(pos);
131        }
132
133        return newUrl + originalUrl;
134    }
135
136    function error(msg) {
137        return $('<span class="lity-error"/>').append(msg);
138    }
139
140    function imageHandler(target, instance) {
141        var desc = (instance.opener() && instance.opener().data('lity-desc')) || 'Image with no description';
142        var img = $('<img src="' + target + '" alt="' + desc + '"/>');
143        var deferred = _deferred();
144        var failed = function() {
145            deferred.reject(error('Failed loading image'));
146        };
147
148        img
149            .on('load', function() {
150                if (this.naturalWidth === 0) {
151                    return failed();
152                }
153
154                deferred.resolve(img);
155            })
156            .on('error', failed)
157        ;
158
159        return deferred.promise();
160    }
161
162    imageHandler.test = function(target) {
163        return _imageRegexp.test(target);
164    };
165
166    function inlineHandler(target, instance) {
167        var el, placeholder, hasHideClass;
168
169        try {
170            el = $(target);
171        } catch (e) {
172            return false;
173        }
174
175        if (!el.length) {
176            return false;
177        }
178
179        placeholder = $('<i style="display:none !important"/>');
180        hasHideClass = el.hasClass('lity-hide');
181
182        instance
183            .element()
184            .one('lity:remove', function() {
185                placeholder
186                    .before(el)
187                    .remove()
188                ;
189
190                if (hasHideClass && !el.closest('.lity-content').length) {
191                    el.addClass('lity-hide');
192                }
193            })
194        ;
195
196        return el
197            .removeClass('lity-hide')
198            .after(placeholder)
199        ;
200    }
201
202    function youtubeHandler(target) {
203        var matches = _youtubeRegex.exec(target);
204
205        if (!matches) {
206            return false;
207        }
208
209        return iframeHandler(
210            transferHash(
211                target,
212                appendQueryParams(
213                    'https://www.youtube' + (matches[2] || '') + '.com/embed/' + matches[4],
214                    $.extend(
215                        {
216                            autoplay: 1,
217                            rel: 0
218                        },
219                        parseQueryParams(matches[5] || '')
220                    )
221                )
222            )
223        );
224    }
225
226    function vimeoHandler(target) {
227        var matches = _vimeoRegex.exec(target);
228
229        if (!matches) {
230            return false;
231        }
232
233        return iframeHandler(
234            transferHash(
235                target,
236                appendQueryParams(
237                    'https://player.vimeo.com/video/' + matches[3],
238                    $.extend(
239                        {
240                            autoplay: 1
241                        },
242                        parseQueryParams(matches[4] || '')
243                    )
244                )
245            )
246        );
247    }
248
249    function facebookvideoHandler(target) {
250        var matches = _facebookvideoRegex.exec(target);
251
252        if (!matches) {
253            return false;
254        }
255
256        if (0 !== target.indexOf('http')) {
257            target = 'https:' + target;
258        }
259
260        return iframeHandler(
261            transferHash(
262                target,
263                appendQueryParams(
264                    'https://www.facebook.com/plugins/video.php?href=' + target,
265                    $.extend(
266                        {
267                            autoplay: 1
268                        },
269                        parseQueryParams(matches[4] || '')
270                    )
271                )
272            )
273        );
274    }
275
276    function googlemapsHandler(target) {
277        var matches = _googlemapsRegex.exec(target);
278
279        if (!matches) {
280            return false;
281        }
282
283        return iframeHandler(
284            transferHash(
285                target,
286                appendQueryParams(
287                    'https://www.google.' + matches[3] + '/maps?' + matches[6],
288                    {
289                        output: matches[6].indexOf('layer=c') > 0 ? 'svembed' : 'embed'
290                    }
291                )
292            )
293        );
294    }
295
296    function iframeHandler(target) {
297        return '<div class="lity-iframe-container"><iframe frameborder="0" allowfullscreen src="' + target + '"/></div>';
298    }
299
300    function winHeight() {
301        return document.documentElement.clientHeight
302            ? document.documentElement.clientHeight
303            : Math.round(_win.height());
304    }
305
306    function keydown(e) {
307        var current = currentInstance();
308
309        if (!current) {
310            return;
311        }
312
313        // ESC key
314        if (e.keyCode === 27 && !!current.options('esc')) {
315            current.close();
316        }
317
318        // TAB key
319        if (e.keyCode === 9) {
320            handleTabKey(e, current);
321        }
322    }
323
324    function handleTabKey(e, instance) {
325        var focusableElements = instance.element().find(_focusableElementsSelector);
326        var focusedIndex = focusableElements.index(document.activeElement);
327
328        if (e.shiftKey && focusedIndex <= 0) {
329            focusableElements.get(focusableElements.length - 1).focus();
330            e.preventDefault();
331        } else if (!e.shiftKey && focusedIndex === focusableElements.length - 1) {
332            focusableElements.get(0).focus();
333            e.preventDefault();
334        }
335    }
336
337    function resize() {
338        $.each(_instances, function(i, instance) {
339            instance.resize();
340        });
341    }
342
343    function registerInstance(instanceToRegister) {
344        if (1 === _instances.unshift(instanceToRegister)) {
345            _html.addClass('lity-active');
346
347            _win
348                .on({
349                    resize: resize,
350                    keydown: keydown
351                })
352            ;
353        }
354
355        $('body > *').not(instanceToRegister.element())
356            .addClass('lity-hidden')
357            .each(function() {
358                var el = $(this);
359
360                if (undefined !== el.data(_dataAriaHidden)) {
361                    return;
362                }
363
364                el.data(_dataAriaHidden, el.attr(_attrAriaHidden) || null);
365            })
366            .attr(_attrAriaHidden, 'true')
367        ;
368    }
369
370    function removeInstance(instanceToRemove) {
371        var show;
372
373        instanceToRemove
374            .element()
375            .attr(_attrAriaHidden, 'true')
376        ;
377
378        if (1 === _instances.length) {
379            _html.removeClass('lity-active');
380
381            _win
382                .off({
383                    resize: resize,
384                    keydown: keydown
385                })
386            ;
387        }
388
389        _instances = $.grep(_instances, function(instance) {
390            return instanceToRemove !== instance;
391        });
392
393        if (!!_instances.length) {
394            show = _instances[0].element();
395        } else {
396            show = $('.lity-hidden');
397        }
398
399        show
400            .removeClass('lity-hidden')
401            .each(function() {
402                var el = $(this), oldAttr = el.data(_dataAriaHidden);
403
404                if (!oldAttr) {
405                    el.removeAttr(_attrAriaHidden);
406                } else {
407                    el.attr(_attrAriaHidden, oldAttr);
408                }
409
410                el.removeData(_dataAriaHidden);
411            })
412        ;
413    }
414
415    function currentInstance() {
416        if (0 === _instances.length) {
417            return null;
418        }
419
420        return _instances[0];
421    }
422
423    function factory(target, instance, handlers, preferredHandler) {
424        var handler = 'inline', content;
425
426        var currentHandlers = $.extend({}, handlers);
427
428        if (preferredHandler && currentHandlers[preferredHandler]) {
429            content = currentHandlers[preferredHandler](target, instance);
430            handler = preferredHandler;
431        } else {
432            // Run inline and iframe handlers after all other handlers
433            $.each(['inline', 'iframe'], function(i, name) {
434                delete currentHandlers[name];
435
436                currentHandlers[name] = handlers[name];
437            });
438
439            $.each(currentHandlers, function(name, currentHandler) {
440                // Handler might be "removed" by setting callback to null
441                if (!currentHandler) {
442                    return true;
443                }
444
445                if (
446                    currentHandler.test &&
447                    !currentHandler.test(target, instance)
448                ) {
449                    return true;
450                }
451
452                content = currentHandler(target, instance);
453
454                if (false !== content) {
455                    handler = name;
456                    return false;
457                }
458            });
459        }
460
461        return {handler: handler, content: content || ''};
462    }
463
464    function Lity(target, options, opener, activeElement) {
465        var self = this;
466        var result;
467        var isReady = false;
468        var isClosed = false;
469        var element;
470        var content;
471
472        options = $.extend(
473            {},
474            _defaultOptions,
475            options
476        );
477
478        element = $(options.template);
479
480        // -- API --
481
482        self.element = function() {
483            return element;
484        };
485
486        self.opener = function() {
487            return opener;
488        };
489
490        self.options  = $.proxy(settings, self, options);
491        self.handlers = $.proxy(settings, self, options.handlers);
492
493        self.resize = function() {
494            if (!isReady || isClosed) {
495                return;
496            }
497
498            content
499                .css('max-height', winHeight() + 'px')
500                .trigger('lity:resize', [self])
501            ;
502        };
503
504        self.close = function() {
505            if (!isReady || isClosed) {
506                return;
507            }
508
509            isClosed = true;
510
511            removeInstance(self);
512
513            var deferred = _deferred();
514
515            // We return focus only if the current focus is inside this instance
516            if (
517                activeElement &&
518                (
519                    document.activeElement === element[0] ||
520                    $.contains(element[0], document.activeElement)
521                )
522            ) {
523                try {
524                    activeElement.focus();
525                } catch (e) {
526                    // Ignore exceptions, eg. for SVG elements which can't be
527                    // focused in IE11
528                }
529            }
530
531            content.trigger('lity:close', [self]);
532
533            element
534                .removeClass('lity-opened')
535                .addClass('lity-closed')
536            ;
537
538            transitionEnd(content.add(element))
539                .always(function() {
540                    content.trigger('lity:remove', [self]);
541                    element.remove();
542                    element = undefined;
543                    deferred.resolve();
544                })
545            ;
546
547            return deferred.promise();
548        };
549
550        // -- Initialization --
551
552        result = factory(target, self, options.handlers, options.handler);
553
554        element
555            .attr(_attrAriaHidden, 'false')
556            .addClass('lity-loading lity-opened lity-' + result.handler)
557            .appendTo('body')
558            .focus()
559            .on('click', '[data-lity-close]', function(e) {
560                if ($(e.target).is('[data-lity-close]')) {
561                    self.close();
562                }
563            })
564            .trigger('lity:open', [self])
565        ;
566
567        registerInstance(self);
568
569        $.when(result.content)
570            .always(ready)
571        ;
572
573        function ready(result) {
574            content = $(result)
575                .css('max-height', winHeight() + 'px')
576            ;
577
578            element
579                .find('.lity-loader')
580                .each(function() {
581                    var loader = $(this);
582
583                    transitionEnd(loader)
584                        .always(function() {
585                            loader.remove();
586                        })
587                    ;
588                })
589            ;
590
591            element
592                .removeClass('lity-loading')
593                .find('.lity-content')
594                .empty()
595                .append(content)
596            ;
597
598            isReady = true;
599
600            content
601                .trigger('lity:ready', [self])
602            ;
603        }
604    }
605
606    function lity(target, options, opener) {
607        if (!target.preventDefault) {
608            opener = $(opener);
609        } else {
610            target.preventDefault();
611            opener = $(this);
612            target = opener.data('lity-target') || opener.attr('href') || opener.attr('src');
613        }
614
615        var instance = new Lity(
616            target,
617            $.extend(
618                {},
619                opener.data('lity-options') || opener.data('lity'),
620                options
621            ),
622            opener,
623            document.activeElement
624        );
625
626        if (!target.preventDefault) {
627            return instance;
628        }
629    }
630
631    lity.version  = '2.2.2';
632    lity.options  = $.proxy(settings, lity, _defaultOptions);
633    lity.handlers = $.proxy(settings, lity, _defaultOptions.handlers);
634    lity.current  = currentInstance;
635
636    $(document).on('click.lity', '[data-lity]', lity);
637
638    return lity;
639}));
640
641
642
643
644
645
646
647
648/* ============================================================================================================================ */
649
650/* modification of content on different links */
651
652document.addEventListener("DOMContentLoaded", function() {
653    var currentURL = window.location.pathname;
654
655    // Array of pages where the issue occurs
656    var jobPagesParents = [
657        "/women/professions/accountant/",
658        "/women/professions/accounting-assistant/",
659        "/women/professions/actress/",
660        "/women/professions/administration/",
661        "/women/professions/administrative-assistant/",
662        "/women/professions/administrator/",
663        "/women/professions/architect/",
664        "/women/professions/artist/",
665        "/women/professions/assistant/",
666        "/women/professions/auxiliary-nurse/",
667        "/women/professions/economist/",
668        "/women/professions/engineer/",
669        "/women/professions/english-teacher/",
670        "/women/professions/entrepreneur/",
671        "/women/professions/interior-designer/",
672        "/women/professions/office-clerk/",
673        "/women/professions/office-lady/",
674        "/women/professions/office-manager/",
675        "/women/professions/office-staff/",
676        "/women/professions/office-worker/",
677        "/women/professions/officer/",
678        "/women/professions/online-seller/",
679        "/women/professions/operator/",
680        "/women/professions/owner/",
681        // Add more job pages here
682    ];
683
684    // Array of pages where the h1 text needs to change
685    var h1ChangeParents = [
686        "/women/professions/babysitter/",
687        "/women/professions/beautician/",
688        "/women/professions/beauty-master/",
689        "/women/professions/business-administration/",
690        "/women/professions/business-administrator/",
691        "/women/professions/business-consultant/",
692        "/women/professions/business-owner/",
693        "/women/professions/call-center-agent/",
694        "/women/professions/cashier/",
695        "/women/professions/chef/",
696        "/women/professions/choreographer/",
697        "/women/professions/clerk/",
698        "/women/professions/clothes-designer/",
699        "/women/professions/consultant/",
700        "/women/professions/cook/",
701        "/women/professions/cosmetologist/",
702        "/women/professions/customer-service-representative/",
703        "/women/professions/dance-teacher/",
704        "/women/professions/dancer/",
705        "/women/professions/dental-assistant/",
706        "/women/professions/dentist/",
707        "/women/professions/designer/",
708        "/women/professions/direct-selling/",
709        "/women/professions/director/",
710        "/women/professions/doctor/",
711        "/women/professions/factory-worker/",
712        "/women/professions/fashion-designer/",
713        "/women/professions/financer/",
714        "/women/professions/fitness-trainer/",
715        "/women/professions/flight-attendant/",
716        "/women/professions/florist/",
717        "/women/professions/freelancer/",
718        "/women/professions/graphics-designer/",
719        "/women/professions/hair-stylist/",
720        "/women/professions/hairdresser/",
721        "/women/professions/hostess/",
722        "/women/professions/housekeeping/",
723        "/women/professions/hr-manager/",
724        "/women/professions/journalist/",
725        "/women/professions/lashmaker/",
726        "/women/professions/lawyer/",
727        "/women/professions/lecturer/",
728        "/women/professions/machine-operator/",
729        "/women/professions/management/",
730        "/women/professions/manager/",
731        "/women/professions/manicurist/",
732        "/women/professions/marketer/",
733        "/women/professions/marketing/",
734        "/women/professions/marketing-manager/",
735        "/women/professions/massage-therapist/",
736        "/women/professions/masseur/",
737        "/women/professions/merchant/",
738        "/women/professions/model/",
739        "/women/professions/music-teacher/",
740        "/women/professions/nail-artist/",
741        "/women/professions/nail-master/",
742        "/women/professions/nanny/",
743        "/women/professions/nurse/",
744        "/women/professions/nursing-assistant/",
745        "/women/professions/nutritionist/",
746        "/women/professions/pharmacist/",
747        "/women/professions/photographer/",
748        "/women/professions/physiotherapist/",
749        "/women/professions/production-operator/",
750        "/women/professions/production-worker/",
751        "/women/professions/project-manager/",
752        "/women/professions/promodiser/",
753        "/women/professions/psychologist/",
754        "/women/professions/public-accountant/",
755        "/women/professions/real-estate-agent/",
756        "/women/professions/realtor/",
757        "/women/professions/receptionist/",
758        "/women/professions/sales/",
759        "/women/professions/sales-assistant/",
760        "/women/professions/sales-associate/",
761        "/women/professions/sales-clerk/",
762        "/women/professions/sales-consultant/",
763        "/women/professions/sales-executive/",
764        "/women/professions/sales-lady/",
765        "/women/professions/sales-manager/",
766        "/women/professions/sales-promoter/",
767        "/women/professions/sales-representative/",
768        "/women/professions/seamstress/",
769        "/women/professions/secretary/",
770        "/women/professions/self-employed/",
771        "/women/professions/seller/",
772        "/women/professions/service-crew/",
773        "/women/professions/singer/",
774        "/women/professions/social-communicator/",
775        "/women/professions/social-worker/",
776        "/women/professions/stewardess/",
777        "/women/professions/stylist/",
778        "/women/professions/supervisor/",
779        "/women/professions/teacher/",
780        "/women/professions/therapist/",
781        "/women/professions/tour-guide/",
782        "/women/professions/translator/",
783        "/women/professions/travel-agent/",
784        "/women/professions/veterinarian/",
785        "/women/professions/waitress/",
786        "/women/professions/barista/",
787        "/women/professions/caregiver/",
788        // Add more pages that require the h1 change here
789    ];
790
791    // Check if the current page matches any of the parent folders for the div text change
792    if (jobPagesParents.some(parent => currentURL.startsWith(parent))) {
793        var textDiv = document.querySelector(".prof-indexes");
794        var newText = textDiv.innerHTML.replace("as a ", "as an ");
795        textDiv.innerHTML = newText;
796    }
797    // Check if the current page matches any of the parent folders for the h1 text change
798    if (h1ChangeParents.some(parent => currentURL.startsWith(parent))) {
799        var h1Text = document.querySelector(".women-section h1");
800        var updatedH1 = h1Text.innerHTML.replace("Working As An", "Working As A");
801        h1Text.innerHTML = updatedH1;
802    }
803});
804
805
806
807/* end code snippet */ 

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.