PageSourceSearch

https://krokom.se/download/18.737fc4451643b8af77b1cb5/1744292316422/lp-toggle.js

js krokom.se collected 2026-10-02 11:05:54 UTC 4,355 bytes, 212 lines download raw bytes

1var lp = (function(exports, $) {
2  var toggle = exports.toggle = exports.toggle || {};
3
4  var Event = function(thisObj) {
5    var handlers = [];
6
7    return function curried_event() {
8      var args = Array.prototype.slice.call(arguments);
9      if (args.length === 1 && typeof args[0] === "function") {
10        handlers.push(arguments[0]);
11      } else {
12        for (var i = 0; i < handlers.length; i++) {
13          handlers[i].apply(thisObj, args);
14        }
15      }
16
17      return thisObj;
18    };
19  };
20
21  var Toggler = function($elem, $target) {
22    var isOpen = false;
23    var name = $elem.selector;
24    var effect = 'slide';
25    var effects = {
26      'slide': ['slideDown', 'slideUp'],
27      'fade': ['fadeIn', 'fadeOut']
28    };
29
30    //
31    // Events :)
32    this.change = Event(this);
33    this.opened = Event(this);
34    this.closed = Event(this);
35
36    this.$elem = $elem;
37    this.$target = $target;
38
39    this.isOpen = function() {
40      return isOpen;
41    };
42
43    this.toggle = function() {
44      var that = this;
45      if (!isOpen) {
46        this.open();
47      } else {
48        this.close();
49      }
50
51      return this;
52    };
53
54    this.open = function() {
55      if (isOpen) return this;
56
57      var that = this;
58
59
60      var openEffect = effects[effect][0];
61      if ($.isFunction(openEffect)) {
62        openEffect($target, function() {
63          that.opened();
64        });
65      } else {
66        $target[openEffect]('fast', function() {
67          that.opened();
68        });
69      }
70
71      isOpen = true;
72      this.change(isOpen);
73
74      //
75      // update aria
76      $elem.attr('aria-expanded', 'true');
77      $target.attr('aria-hidden', 'false');
78
79      return this;
80    };
81
82    this.close = function() {
83      if (!isOpen) return this;
84
85      var that = this;
86
87      var closeEffect = effects[effect][1];
88      if ($.isFunction(closeEffect)) {
89        closeEffect($target, function() {
90          that.closed();
91        });
92      } else {
93        $target[closeEffect]('fast', function() {
94          that.closed();
95        });
96      }
97
98      isOpen = false;
99      this.change(isOpen);
100
101      //
102      // update aria
103      $elem.attr('aria-expanded', 'false');
104      $target.attr('aria-hidden', 'true');
105
106      return this;
107    };
108
109    this.name = function(val) {
110      if (typeof val === 'undefined') {
111        return name;
112      }
113
114      name = val;
115      return this;
116    };
117
118    this.effect = function(val) {
119      if (typeof val === 'undefined') {
120        return effect;
121      }
122
123      if (val in effects) {
124        effect = val;
125      }
126
127      return this;
128    };
129
130    var that = this;
131    $elem.on('click', function() {
132      that.toggle();
133      return false;
134    });
135
136    $target.hide();
137
138    //
139    // Setup aria
140    var targetId = $target.attr('id');
141    if (!targetId) {
142      targetId = 'lp-toggle-target-' + toggle.togglers.length;
143      $target.attr('id', targetId);
144    }
145
146    $elem.attr('aria-expanded', 'false');
147    $elem.attr('aria-controls', targetId);
148
149    $target.attr('aria-hidden', 'true');
150  };
151
152  toggle.togglers = [];
153  toggle.setup = function(elem, target) {
154    if (typeof elem === 'string') {
155      elem = $(elem);
156    }
157
158    if (typeof target === 'string') {
159      target = $(target);
160    }
161
162    if (elem.data('lp-toggler')) {
163      return elem.data('lp-toggler');
164    }
165
166    var toggler = new Toggler(elem, target);
167    elem.data('lp-toggler', toggler);
168
169    toggle.togglers.push(toggler);
170
171    return toggler;
172  };
173
174  toggle.get = function(name) {
175    for (var i = 0; i < toggle.togglers.length; i++) {
176      if (toggle.togglers[i].name() == name) {
177        return toggle.togglers[i];
178      }
179    }
180
181    return null;
182  };
183
184  toggle.group = function() {
185    var togglers = $.map(Array.prototype.slice.call(arguments), function(item) {
186      if (typeof item === 'string') {
187        return toggle.get(item);
188      } else {
189        return item;
190      }
191    });
192
193    var closeAllBut = function(togglerToSkip) {
194      for (var i = 0; i < togglers.length; i++) {
195        if (togglers[i].name() != togglerToSkip.name()) {
196          togglers[i].close();
197        }
198      }
199    };
200
201    for (var i = 0; i < togglers.length; i++) {
202      var toggler = togglers[i];
203      toggler.change(function(isOpen) {
204        if (isOpen) {
205          closeAllBut(this);
206        }
207      });
208    }
209  };
210
211  return exports;
212}(lp || {}, jQuery));

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.