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.