PageSourceSearch

https://reachx.co/js/ui/jquery.ui.button.js

js reachx.co collected 2026-09-26 00:52:04 UTC 11,821 bytes, 419 lines download raw bytes

1/*!
2 * jQuery UI Button 1.10.2
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/button/
10 *
11 * Depends:
12 *	jquery.ui.core.js
13 *	jquery.ui.widget.js
14 */
15(function( $, undefined ) {
16
17var lastActive, startXPos, startYPos, clickDragged,
18	baseClasses = "ui-button ui-widget ui-state-default ui-corner-all",
19	stateClasses = "ui-state-hover ui-state-active ",
20	typeClasses = "ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",
21	formResetHandler = function() {
22		var buttons = $( this ).find( ":ui-button" );
23		setTimeout(function() {
24			buttons.button( "refresh" );
25		}, 1 );
26	},
27	radioGroup = function( radio ) {
28		var name = radio.name,
29			form = radio.form,
30			radios = $( [] );
31		if ( name ) {
32			name = name.replace( /'/g, "\\'" );
33			if ( form ) {
34				radios = $( form ).find( "[name='" + name + "']" );
35			} else {
36				radios = $( "[name='" + name + "']", radio.ownerDocument )
37					.filter(function() {
38						return !this.form;
39					});
40			}
41		}
42		return radios;
43	};
44
45$.widget( "ui.button", {
46	version: "1.10.2",
47	defaultElement: "<button>",
48	options: {
49		disabled: null,
50		text: true,
51		label: null,
52		icons: {
53			primary: null,
54			secondary: null
55		}
56	},
57	_create: function() {
58		this.element.closest( "form" )
59			.unbind( "reset" + this.eventNamespace )
60			.bind( "reset" + this.eventNamespace, formResetHandler );
61
62		if ( typeof this.options.disabled !== "boolean" ) {
63			this.options.disabled = !!this.element.prop( "disabled" );
64		} else {
65			this.element.prop( "disabled", this.options.disabled );
66		}
67
68		this._determineButtonType();
69		this.hasTitle = !!this.buttonElement.attr( "title" );
70
71		var that = this,
72			options = this.options,
73			toggleButton = this.type === "checkbox" || this.type === "radio",
74			activeClass = !toggleButton ? "ui-state-active" : "",
75			focusClass = "ui-state-focus";
76
77		if ( options.label === null ) {
78			options.label = (this.type === "input" ? this.buttonElement.val() : this.buttonElement.html());
79		}
80
81		this._hoverable( this.buttonElement );
82
83		this.buttonElement
84			.addClass( baseClasses )
85			.attr( "role", "button" )
86			.bind( "mouseenter" + this.eventNamespace, function() {
87				if ( options.disabled ) {
88					return;
89				}
90				if ( this === lastActive ) {
91					$( this ).addClass( "ui-state-active" );
92				}
93			})
94			.bind( "mouseleave" + this.eventNamespace, function() {
95				if ( options.disabled ) {
96					return;
97				}
98				$( this ).removeClass( activeClass );
99			})
100			.bind( "click" + this.eventNamespace, function( event ) {
101				if ( options.disabled ) {
102					event.preventDefault();
103					event.stopImmediatePropagation();
104				}
105			});
106
107		this.element
108			.bind( "focus" + this.eventNamespace, function() {
109				// no need to check disabled, focus won't be triggered anyway
110				that.buttonElement.addClass( focusClass );
111			})
112			.bind( "blur" + this.eventNamespace, function() {
113				that.buttonElement.removeClass( focusClass );
114			});
115
116		if ( toggleButton ) {
117			this.element.bind( "change" + this.eventNamespace, function() {
118				if ( clickDragged ) {
119					return;
120				}
121				that.refresh();
122			});
123			// if mouse moves between mousedown and mouseup (drag) set clickDragged flag
124			// prevents issue where button state changes but checkbox/radio checked state
125			// does not in Firefox (see ticket #6970)
126			this.buttonElement
127				.bind( "mousedown" + this.eventNamespace, function( event ) {
128					if ( options.disabled ) {
129						return;
130					}
131					clickDragged = false;
132					startXPos = event.pageX;
133					startYPos = event.pageY;
134				})
135				.bind( "mouseup" + this.eventNamespace, function( event ) {
136					if ( options.disabled ) {
137						return;
138					}
139					if ( startXPos !== event.pageX || startYPos !== event.pageY ) {
140						clickDragged = true;
141					}
142			});
143		}
144
145		if ( this.type === "checkbox" ) {
146			this.buttonElement.bind( "click" + this.eventNamespace, function() {
147				if ( options.disabled || clickDragged ) {
148					return false;
vendor: 5,512 bytes, lines 149-332
149				}
150			});
151		} else if ( this.type === "radio" ) {
152			this.buttonElement.bind( "click" + this.eventNamespace, function() {
153				if ( options.disabled || clickDragged ) {
154					return false;
155				}
156				$( this ).addClass( "ui-state-active" );
157				that.buttonElement.attr( "aria-pressed", "true" );
158
159				var radio = that.element[ 0 ];
160				radioGroup( radio )
161					.not( radio )
162					.map(function() {
163						return $( this ).button( "widget" )[ 0 ];
164					})
165					.removeClass( "ui-state-active" )
166					.attr( "aria-pressed", "false" );
167			});
168		} else {
169			this.buttonElement
170				.bind( "mousedown" + this.eventNamespace, function() {
171					if ( options.disabled ) {
172						return false;
173					}
174					$( this ).addClass( "ui-state-active" );
175					lastActive = this;
176					that.document.one( "mouseup", function() {
177						lastActive = null;
178					});
179				})
180				.bind( "mouseup" + this.eventNamespace, function() {
181					if ( options.disabled ) {
182						return false;
183					}
184					$( this ).removeClass( "ui-state-active" );
185				})
186				.bind( "keydown" + this.eventNamespace, function(event) {
187					if ( options.disabled ) {
188						return false;
189					}
190					if ( event.keyCode === $.ui.keyCode.SPACE || event.keyCode === $.ui.keyCode.ENTER ) {
191						$( this ).addClass( "ui-state-active" );
192					}
193				})
194				// see #8559, we bind to blur here in case the button element loses
195				// focus between keydown and keyup, it would be left in an "active" state
196				.bind( "keyup" + this.eventNamespace + " blur" + this.eventNamespace, function() {
197					$( this ).removeClass( "ui-state-active" );
198				});
199
200			if ( this.buttonElement.is("a") ) {
201				this.buttonElement.keyup(function(event) {
202					if ( event.keyCode === $.ui.keyCode.SPACE ) {
203						// TODO pass through original event correctly (just as 2nd argument doesn't work)
204						$( this ).click();
205					}
206				});
207			}
208		}
209
210		// TODO: pull out $.Widget's handling for the disabled option into
211		// $.Widget.prototype._setOptionDisabled so it's easy to proxy and can
212		// be overridden by individual plugins
213		this._setOption( "disabled", options.disabled );
214		this._resetButton();
215	},
216
217	_determineButtonType: function() {
218		var ancestor, labelSelector, checked;
219
220		if ( this.element.is("[type=checkbox]") ) {
221			this.type = "checkbox";
222		} else if ( this.element.is("[type=radio]") ) {
223			this.type = "radio";
224		} else if ( this.element.is("input") ) {
225			this.type = "input";
226		} else {
227			this.type = "button";
228		}
229
230		if ( this.type === "checkbox" || this.type === "radio" ) {
231			// we don't search against the document in case the element
232			// is disconnected from the DOM
233			ancestor = this.element.parents().last();
234			labelSelector = "label[for='" + this.element.attr("id") + "']";
235			this.buttonElement = ancestor.find( labelSelector );
236			if ( !this.buttonElement.length ) {
237				ancestor = ancestor.length ? ancestor.siblings() : this.element.siblings();
238				this.buttonElement = ancestor.filter( labelSelector );
239				if ( !this.buttonElement.length ) {
240					this.buttonElement = ancestor.find( labelSelector );
241				}
242			}
243			this.element.addClass( "ui-helper-hidden-accessible" );
244
245			checked = this.element.is( ":checked" );
246			if ( checked ) {
247				this.buttonElement.addClass( "ui-state-active" );
248			}
249			this.buttonElement.prop( "aria-pressed", checked );
250		} else {
251			this.buttonElement = this.element;
252		}
253	},
254
255	widget: function() {
256		return this.buttonElement;
257	},
258
259	_destroy: function() {
260		this.element
261			.removeClass( "ui-helper-hidden-accessible" );
262		this.buttonElement
263			.removeClass( baseClasses + " " + stateClasses + " " + typeClasses )
264			.removeAttr( "role" )
265			.removeAttr( "aria-pressed" )
266			.html( this.buttonElement.find(".ui-button-text").html() );
267
268		if ( !this.hasTitle ) {
269			this.buttonElement.removeAttr( "title" );
270		}
271	},
272
273	_setOption: function( key, value ) {
274		this._super( key, value );
275		if ( key === "disabled" ) {
276			if ( value ) {
277				this.element.prop( "disabled", true );
278			} else {
279				this.element.prop( "disabled", false );
280			}
281			return;
282		}
283		this._resetButton();
284	},
285
286	refresh: function() {
287		//See #8237 & #8828
288		var isDisabled = this.element.is( "input, button" ) ? this.element.is( ":disabled" ) : this.element.hasClass( "ui-button-disabled" );
289
290		if ( isDisabled !== this.options.disabled ) {
291			this._setOption( "disabled", isDisabled );
292		}
293		if ( this.type === "radio" ) {
294			radioGroup( this.element[0] ).each(function() {
295				if ( $( this ).is( ":checked" ) ) {
296					$( this ).button( "widget" )
297						.addClass( "ui-state-active" )
298						.attr( "aria-pressed", "true" );
299				} else {
300					$( this ).button( "widget" )
301						.removeClass( "ui-state-active" )
302						.attr( "aria-pressed", "false" );
303				}
304			});
305		} else if ( this.type === "checkbox" ) {
306			if ( this.element.is( ":checked" ) ) {
307				this.buttonElement
308					.addClass( "ui-state-active" )
309					.attr( "aria-pressed", "true" );
310			} else {
311				this.buttonElement
312					.removeClass( "ui-state-active" )
313					.attr( "aria-pressed", "false" );
314			}
315		}
316	},
317
318	_resetButton: function() {
319		if ( this.type === "input" ) {
320			if ( this.options.label ) {
321				this.element.val( this.options.label );
322			}
323			return;
324		}
325		var buttonElement = this.buttonElement.removeClass( typeClasses ),
326			buttonText = $( "<span></span>", this.document[0] )
327				.addClass( "ui-button-text" )
328				.html( this.options.label )
329				.appendTo( buttonElement.empty() )
330				.text(),
331			icons = this.options.icons,
332			multipleIcons = icons.primary && icons.secondary,
vendor: 2,191 bytes, lines 333-419
333			buttonClasses = [];
334
335		if ( icons.primary || icons.secondary ) {
336			if ( this.options.text ) {
337				buttonClasses.push( "ui-button-text-icon" + ( multipleIcons ? "s" : ( icons.primary ? "-primary" : "-secondary" ) ) );
338			}
339
340			if ( icons.primary ) {
341				buttonElement.prepend( "<span class='ui-button-icon-primary ui-icon " + icons.primary + "'></span>" );
342			}
343
344			if ( icons.secondary ) {
345				buttonElement.append( "<span class='ui-button-icon-secondary ui-icon " + icons.secondary + "'></span>" );
346			}
347
348			if ( !this.options.text ) {
349				buttonClasses.push( multipleIcons ? "ui-button-icons-only" : "ui-button-icon-only" );
350
351				if ( !this.hasTitle ) {
352					buttonElement.attr( "title", $.trim( buttonText ) );
353				}
354			}
355		} else {
356			buttonClasses.push( "ui-button-text-only" );
357		}
358		buttonElement.addClass( buttonClasses.join( " " ) );
359	}
360});
361
362$.widget( "ui.buttonset", {
363	version: "1.10.2",
364	options: {
365		items: "button, input[type=button], input[type=submit], input[type=reset], input[type=checkbox], input[type=radio], a, :data(ui-button)"
366	},
367
368	_create: function() {
369		this.element.addClass( "ui-buttonset" );
370	},
371
372	_init: function() {
373		this.refresh();
374	},
375
376	_setOption: function( key, value ) {
377		if ( key === "disabled" ) {
378			this.buttons.button( "option", key, value );
379		}
380
381		this._super( key, value );
382	},
383
384	refresh: function() {
385		var rtl = this.element.css( "direction" ) === "rtl";
386
387		this.buttons = this.element.find( this.options.items )
388			.filter( ":ui-button" )
389				.button( "refresh" )
390			.end()
391			.not( ":ui-button" )
392				.button()
393			.end()
394			.map(function() {
395				return $( this ).button( "widget" )[ 0 ];
396			})
397				.removeClass( "ui-corner-all ui-corner-left ui-corner-right" )
398				.filter( ":first" )
399					.addClass( rtl ? "ui-corner-right" : "ui-corner-left" )
400				.end()
401				.filter( ":last" )
402					.addClass( rtl ? "ui-corner-left" : "ui-corner-right" )
403				.end()
404			.end();
405	},
406
407	_destroy: function() {
408		this.element.removeClass( "ui-buttonset" );
409		this.buttons
410			.map(function() {
411				return $( this ).button( "widget" )[ 0 ];
412			})
413				.removeClass( "ui-corner-left ui-corner-right" )
414			.end()
415			.button( "destroy" );
416	}
417});
418
419}( 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.