PageSourceSearch

https://www.kinenote.com/main/common/js/vendor/jquery.ui.accordion.js

js kinenote.com collected 2026-10-02 05:48:00 UTC 15,540 bytes, 572 lines download raw bytes

vendor: 15,540 bytes, lines 1-572
1/*!
2 * jQuery UI Accordion 1.10.3
3 * http://jqueryui.com
4 *
5 * Copyright 2013 jQuery Foundation and other contributors
6 * Released under the MIT license.
7 * http://jquery.org/license
8 *
9 * http://api.jqueryui.com/accordion/
10 *
11 * Depends:
12 *	jquery.ui.core.js
13 *	jquery.ui.widget.js
14 */
15(function( $, undefined ) {
16
17var uid = 0,
18	hideProps = {},
19	showProps = {};
20
21hideProps.height = hideProps.paddingTop = hideProps.paddingBottom =
22	hideProps.borderTopWidth = hideProps.borderBottomWidth = "hide";
23showProps.height = showProps.paddingTop = showProps.paddingBottom =
24	showProps.borderTopWidth = showProps.borderBottomWidth = "show";
25
26$.widget( "ui.accordion", {
27	version: "1.10.3",
28	options: {
29		active: 0,
30		animate: {},
31		collapsible: false,
32		event: "click",
33		header: "> li > :first-child,> :not(li):even",
34		heightStyle: "auto",
35		icons: {
36			activeHeader: "ui-icon-triangle-1-s",
37			header: "ui-icon-triangle-1-e"
38		},
39
40		// callbacks
41		activate: null,
42		beforeActivate: null
43	},
44
45	_create: function() {
46		var options = this.options;
47		this.prevShow = this.prevHide = $();
48		this.element.addClass( "ui-accordion ui-widget ui-helper-reset" )
49			// ARIA
50			.attr( "role", "tablist" );
51
52		// don't allow collapsible: false and active: false / null
53		if ( !options.collapsible && (options.active === false || options.active == null) ) {
54			options.active = 0;
55		}
56
57		this._processPanels();
58		// handle negative values
59		if ( options.active < 0 ) {
60			options.active += this.headers.length;
61		}
62		this._refresh();
63	},
64
65	_getCreateEventData: function() {
66		return {
67			header: this.active,
68			panel: !this.active.length ? $() : this.active.next(),
69			content: !this.active.length ? $() : this.active.next()
70		};
71	},
72
73	_createIcons: function() {
74		var icons = this.options.icons;
75		if ( icons ) {
76			$( "<span>" )
77				.addClass( "ui-accordion-header-icon ui-icon " + icons.header )
78				.prependTo( this.headers );
79			this.active.children( ".ui-accordion-header-icon" )
80				.removeClass( icons.header )
81				.addClass( icons.activeHeader );
82			this.headers.addClass( "ui-accordion-icons" );
83		}
84	},
85
86	_destroyIcons: function() {
87		this.headers
88			.removeClass( "ui-accordion-icons" )
89			.children( ".ui-accordion-header-icon" )
90				.remove();
91	},
92
93	_destroy: function() {
94		var contents;
95
96		// clean up main element
97		this.element
98			.removeClass( "ui-accordion ui-widget ui-helper-reset" )
99			.removeAttr( "role" );
100
101		// clean up headers
102		this.headers
103			.removeClass( "ui-accordion-header ui-accordion-header-active ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top" )
104			.removeAttr( "role" )
105			.removeAttr( "aria-selected" )
106			.removeAttr( "aria-controls" )
107			.removeAttr( "tabIndex" )
108			.each(function() {
109				if ( /^ui-accordion/.test( this.id ) ) {
110					this.removeAttribute( "id" );
111				}
112			});
113		this._destroyIcons();
114
115		// clean up content panels
116		contents = this.headers.next()
117			.css( "display", "" )
118			.removeAttr( "role" )
119			.removeAttr( "aria-expanded" )
120			.removeAttr( "aria-hidden" )
121			.removeAttr( "aria-labelledby" )
122			.removeClass( "ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-state-disabled" )
123			.each(function() {
124				if ( /^ui-accordion/.test( this.id ) ) {
125					this.removeAttribute( "id" );
126				}
127			});
128		if ( this.options.heightStyle !== "content" ) {
129			contents.css( "height", "" );
130		}
131	},
132
133	_setOption: function( key, value ) {
134		if ( key === "active" ) {
135			// _activate() will handle invalid values and update this.options
136			this._activate( value );
137			return;
138		}
139
140		if ( key === "event" ) {
141			if ( this.options.event ) {
142				this._off( this.headers, this.options.event );
143			}
144			this._setupEvents( value );
145		}
146
147		this._super( key, value );
148
149		// setting collapsible: false while collapsed; open first panel
150		if ( key === "collapsible" && !value && this.options.active === false ) {
151			this._activate( 0 );
152		}
153
154		if ( key === "icons" ) {
155			this._destroyIcons();
156			if ( value ) {
157				this._createIcons();
158			}
159		}
160
161		// #5332 - opacity doesn't cascade to positioned elements in IE
162		// so we need to add the disabled class to the headers and panels
163		if ( key === "disabled" ) {
164			this.headers.add( this.headers.next() )
165				.toggleClass( "ui-state-disabled", !!value );
166		}
167	},
168
169	_keydown: function( event ) {
170		/*jshint maxcomplexity:15*/
171		if ( event.altKey || event.ctrlKey ) {
172			return;
173		}
174
175		var keyCode = $.ui.keyCode,
176			length = this.headers.length,
177			currentIndex = this.headers.index( event.target ),
178			toFocus = false;
179
180		switch ( event.keyCode ) {
181			case keyCode.RIGHT:
182			case keyCode.DOWN:
183				toFocus = this.headers[ ( currentIndex + 1 ) % length ];
184				break;
185			case keyCode.LEFT:
186			case keyCode.UP:
187				toFocus = this.headers[ ( currentIndex - 1 + length ) % length ];
188				break;
189			case keyCode.SPACE:
190			case keyCode.ENTER:
191				this._eventHandler( event );
192				break;
193			case keyCode.HOME:
194				toFocus = this.headers[ 0 ];
195				break;
196			case keyCode.END:
197				toFocus = this.headers[ length - 1 ];
198				break;
199		}
200
201		if ( toFocus ) {
202			$( event.target ).attr( "tabIndex", -1 );
203			$( toFocus ).attr( "tabIndex", 0 );
204			toFocus.focus();
205			event.preventDefault();
206		}
207	},
208
209	_panelKeyDown : function( event ) {
210		if ( event.keyCode === $.ui.keyCode.UP && event.ctrlKey ) {
211			$( event.currentTarget ).prev().focus();
212		}
213	},
214
215	refresh: function() {
216		var options = this.options;
217		this._processPanels();
218
219		// was collapsed or no panel
220		if ( ( options.active === false && options.collapsible === true ) || !this.headers.length ) {
221			options.active = false;
222			this.active = $();
223		// active false only when collapsible is true
224		} else if ( options.active === false ) {
225			this._activate( 0 );
226		// was active, but active panel is gone
227		} else if ( this.active.length && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {
228			// all remaining panel are disabled
229			if ( this.headers.length === this.headers.find(".ui-state-disabled").length ) {
230				options.active = false;
231				this.active = $();
232			// activate previous panel
233			} else {
234				this._activate( Math.max( 0, options.active - 1 ) );
235			}
236		// was active, active panel still exists
237		} else {
238			// make sure active index is correct
239			options.active = this.headers.index( this.active );
240		}
241
242		this._destroyIcons();
243
244		this._refresh();
245	},
246
247	_processPanels: function() {
248		this.headers = this.element.find( this.options.header )
249			.addClass( "ui-accordion-header ui-helper-reset ui-state-default ui-corner-all" );
250
251		this.headers.next()
252			.addClass( "ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom" )
253			.filter(":not(.ui-accordion-content-active)")
254			.hide();
255	},
256
257	_refresh: function() {
258		var maxHeight,
259			options = this.options,
260			heightStyle = options.heightStyle,
261			parent = this.element.parent(),
262			accordionId = this.accordionId = "ui-accordion-" +
263				(this.element.attr( "id" ) || ++uid);
264
265		this.active = this._findActive( options.active )
266			.addClass( "ui-accordion-header-active ui-state-active ui-corner-top" )
267			.removeClass( "ui-corner-all" );
268		this.active.next()
269			.addClass( "ui-accordion-content-active" )
270			.show();
271
272		this.headers
273			.attr( "role", "tab" )
274			.each(function( i ) {
275				var header = $( this ),
276					headerId = header.attr( "id" ),
277					panel = header.next(),
278					panelId = panel.attr( "id" );
279				if ( !headerId ) {
280					headerId = accordionId + "-header-" + i;
281					header.attr( "id", headerId );
282				}
283				if ( !panelId ) {
284					panelId = accordionId + "-panel-" + i;
285					panel.attr( "id", panelId );
286				}
287				header.attr( "aria-controls", panelId );
288				panel.attr( "aria-labelledby", headerId );
289			})
290			.next()
291				.attr( "role", "tabpanel" );
292
293		this.headers
294			.not( this.active )
295			.attr({
296				"aria-selected": "false",
297				tabIndex: -1
298			})
299			.next()
300				.attr({
301					"aria-expanded": "false",
302					"aria-hidden": "true"
303				})
304				.hide();
305
306		// make sure at least one header is in the tab order
307		if ( !this.active.length ) {
308			this.headers.eq( 0 ).attr( "tabIndex", 0 );
309		} else {
310			this.active.attr({
311				"aria-selected": "true",
312				tabIndex: 0
313			})
314			.next()
315				.attr({
316					"aria-expanded": "true",
317					"aria-hidden": "false"
318				});
319		}
320
321		this._createIcons();
322
323		this._setupEvents( options.event );
324
325		if ( heightStyle === "fill" ) {
326			maxHeight = parent.height();
327			this.element.siblings( ":visible" ).each(function() {
328				var elem = $( this ),
329					position = elem.css( "position" );
330
331				if ( position === "absolute" || position === "fixed" ) {
332					return;
333				}
334				maxHeight -= elem.outerHeight( true );
335			});
336
337			this.headers.each(function() {
338				maxHeight -= $( this ).outerHeight( true );
339			});
340
341			this.headers.next()
342				.each(function() {
343					$( this ).height( Math.max( 0, maxHeight -
344						$( this ).innerHeight() + $( this ).height() ) );
345				})
346				.css( "overflow", "auto" );
347		} else if ( heightStyle === "auto" ) {
348			maxHeight = 0;
349			this.headers.next()
350				.each(function() {
351					maxHeight = Math.max( maxHeight, $( this ).css( "height", "" ).height() );
352				})
353				.height( maxHeight );
354		}
355	},
356
357	_activate: function( index ) {
358		var active = this._findActive( index )[ 0 ];
359
360		// trying to activate the already active panel
361		if ( active === this.active[ 0 ] ) {
362			return;
363		}
364
365		// trying to collapse, simulate a click on the currently active header
366		active = active || this.active[ 0 ];
367
368		this._eventHandler({
369			target: active,
370			currentTarget: active,
371			preventDefault: $.noop
372		});
373	},
374
375	_findActive: function( selector ) {
376		return typeof selector === "number" ? this.headers.eq( selector ) : $();
377	},
378
379	_setupEvents: function( event ) {
380		var events = {
381			keydown: "_keydown"
382		};
383		if ( event ) {
384			$.each( event.split(" "), function( index, eventName ) {
385				events[ eventName ] = "_eventHandler";
386			});
387		}
388
389		this._off( this.headers.add( this.headers.next() ) );
390		this._on( this.headers, events );
391		this._on( this.headers.next(), { keydown: "_panelKeyDown" });
392		this._hoverable( this.headers );
393		this._focusable( this.headers );
394	},
395
396	_eventHandler: function( event ) {
397		var options = this.options,
398			active = this.active,
399			clicked = $( event.currentTarget ),
400			clickedIsActive = clicked[ 0 ] === active[ 0 ],
401			collapsing = clickedIsActive && options.collapsible,
402			toShow = collapsing ? $() : clicked.next(),
403			toHide = active.next(),
404			eventData = {
405				oldHeader: active,
406				oldPanel: toHide,
407				newHeader: collapsing ? $() : clicked,
408				newPanel: toShow
409			};
410
411		event.preventDefault();
412
413		if (
414				// click on active header, but not collapsible
415				( clickedIsActive && !options.collapsible ) ||
416				// allow canceling activation
417				( this._trigger( "beforeActivate", event, eventData ) === false ) ) {
418			return;
419		}
420
421		options.active = collapsing ? false : this.headers.index( clicked );
422
423		// when the call to ._toggle() comes after the class changes
424		// it causes a very odd bug in IE 8 (see #6720)
425		this.active = clickedIsActive ? $() : clicked;
426		this._toggle( eventData );
427
428		// switch classes
429		// corner classes on the previously active header stay after the animation
430		active.removeClass( "ui-accordion-header-active ui-state-active" );
431		if ( options.icons ) {
432			active.children( ".ui-accordion-header-icon" )
433				.removeClass( options.icons.activeHeader )
434				.addClass( options.icons.header );
435		}
436
437		if ( !clickedIsActive ) {
438			clicked
439				.removeClass( "ui-corner-all" )
440				.addClass( "ui-accordion-header-active ui-state-active ui-corner-top" );
441			if ( options.icons ) {
442				clicked.children( ".ui-accordion-header-icon" )
443					.removeClass( options.icons.header )
444					.addClass( options.icons.activeHeader );
445			}
446
447			clicked
448				.next()
449				.addClass( "ui-accordion-content-active" );
450		}
451	},
452
453	_toggle: function( data ) {
454		var toShow = data.newPanel,
455			toHide = this.prevShow.length ? this.prevShow : data.oldPanel;
456
457		// handle activating a panel during the animation for another activation
458		this.prevShow.add( this.prevHide ).stop( true, true );
459		this.prevShow = toShow;
460		this.prevHide = toHide;
461
462		if ( this.options.animate ) {
463			this._animate( toShow, toHide, data );
464		} else {
465			toHide.hide();
466			toShow.show();
467			this._toggleComplete( data );
468		}
469
470		toHide.attr({
471			"aria-expanded": "false",
472			"aria-hidden": "true"
473		});
474		toHide.prev().attr( "aria-selected", "false" );
475		// if we're switching panels, remove the old header from the tab order
476		// if we're opening from collapsed state, remove the previous header from the tab order
477		// if we're collapsing, then keep the collapsing header in the tab order
478		if ( toShow.length && toHide.length ) {
479			toHide.prev().attr( "tabIndex", -1 );
480		} else if ( toShow.length ) {
481			this.headers.filter(function() {
482				return $( this ).attr( "tabIndex" ) === 0;
483			})
484			.attr( "tabIndex", -1 );
485		}
486
487		toShow
488			.attr({
489				"aria-expanded": "true",
490				"aria-hidden": "false"
491			})
492			.prev()
493				.attr({
494					"aria-selected": "true",
495					tabIndex: 0
496				});
497	},
498
499	_animate: function( toShow, toHide, data ) {
500		var total, easing, duration,
501			that = this,
502			adjust = 0,
503			down = toShow.length &&
504				( !toHide.length || ( toShow.index() < toHide.index() ) ),
505			animate = this.options.animate || {},
506			options = down && animate.down || animate,
507			complete = function() {
508				that._toggleComplete( data );
509			};
510
511		if ( typeof options === "number" ) {
512			duration = options;
513		}
514		if ( typeof options === "string" ) {
515			easing = options;
516		}
517		// fall back from options to animation in case of partial down settings
518		easing = easing || options.easing || animate.easing;
519		duration = duration || options.duration || animate.duration;
520
521		if ( !toHide.length ) {
522			return toShow.animate( showProps, duration, easing, complete );
523		}
524		if ( !toShow.length ) {
525			return toHide.animate( hideProps, duration, easing, complete );
526		}
527
528		total = toShow.show().outerHeight();
529		toHide.animate( hideProps, {
530			duration: duration,
531			easing: easing,
532			step: function( now, fx ) {
533				fx.now = Math.round( now );
534			}
535		});
536		toShow
537			.hide()
538			.animate( showProps, {
539				duration: duration,
540				easing: easing,
541				complete: complete,
542				step: function( now, fx ) {
543					fx.now = Math.round( now );
544					if ( fx.prop !== "height" ) {
545						adjust += fx.now;
546					} else if ( that.options.heightStyle !== "content" ) {
547						fx.now = Math.round( total - toHide.outerHeight() - adjust );
548						adjust = 0;
549					}
550				}
551			});
552	},
553
554	_toggleComplete: function( data ) {
555		var toHide = data.oldPanel;
556
557		toHide
558			.removeClass( "ui-accordion-content-active" )
559			.prev()
560				.removeClass( "ui-corner-top" )
561				.addClass( "ui-corner-all" );
562
563		// Work around for rendering bug in IE (#5421)
564		if ( toHide.length ) {
565			toHide.parent()[0].className = toHide.parent()[0].className;
566		}
567
568		this._trigger( "activate", null, data );
569	}
570});
571
572})( 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.