Project

General

Profile

1
/*
2
 * jQuery UI Button 1.8.6
3
 *
4
 * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
5
 * Dual licensed under the MIT or GPL Version 2 licenses.
6
 * http://jquery.org/license
7
 *
8
 * http://docs.jquery.com/UI/Button
9
 *
10
 * Depends:
11
 *	jquery.ui.core.js
12
 *	jquery.ui.widget.js
13
 */
14
(function( $, undefined ) {
15

    
16
var lastActive,
17
	baseClasses = "ui-button ui-widget ui-state-default ui-corner-all",
18
	stateClasses = "ui-state-hover ui-state-active ",
19
	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",
20
	formResetHandler = function( event ) {
21
		$( ":ui-button", event.target.form ).each(function() {
22
			var inst = $( this ).data( "button" );
23
			setTimeout(function() {
24
				inst.refresh();
25
			}, 1 );
26
		});
27
	},
28
	radioGroup = function( radio ) {
29
		var name = radio.name,
30
			form = radio.form,
31
			radios = $( [] );
32
		if ( name ) {
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
	options: {
47
		disabled: null,
48
		text: true,
49
		label: null,
50
		icons: {
51
			primary: null,
52
			secondary: null
53
		}
54
	},
55
	_create: function() {
56
		this.element.closest( "form" )
57
			.unbind( "reset.button" )
58
			.bind( "reset.button", formResetHandler );
59

    
60
		if ( typeof this.options.disabled !== "boolean" ) {
61
			this.options.disabled = this.element.attr( "disabled" );
62
		}
63

    
64
		this._determineButtonType();
65
		this.hasTitle = !!this.buttonElement.attr( "title" );
66

    
67
		var self = this,
68
			options = this.options,
69
			toggleButton = this.type === "checkbox" || this.type === "radio",
70
			hoverClass = "ui-state-hover" + ( !toggleButton ? " ui-state-active" : "" ),
71
			focusClass = "ui-state-focus";
72

    
73
		if ( options.label === null ) {
74
			options.label = this.buttonElement.html();
75
		}
76

    
77
		if ( this.element.is( ":disabled" ) ) {
78
			options.disabled = true;
79
		}
80

    
81
		this.buttonElement
82
			.addClass( baseClasses )
83
			.attr( "role", "button" )
84
			.bind( "mouseenter.button", function() {
85
				if ( options.disabled ) {
86
					return;
87
				}
88
				$( this ).addClass( "ui-state-hover" );
89
				if ( this === lastActive ) {
90
					$( this ).addClass( "ui-state-active" );
91
				}
92
			})
93
			.bind( "mouseleave.button", function() {
94
				if ( options.disabled ) {
95
					return;
96
				}
97
				$( this ).removeClass( hoverClass );
98
			})
99
			.bind( "focus.button", function() {
100
				// no need to check disabled, focus won't be triggered anyway
101
				$( this ).addClass( focusClass );
102
			})
103
			.bind( "blur.button", function() {
104
				$( this ).removeClass( focusClass );
105
			});
106

    
107
		if ( toggleButton ) {
108
			this.element.bind( "change.button", function() {
109
				self.refresh();
110
			});
111
		}
112

    
113
		if ( this.type === "checkbox" ) {
114
			this.buttonElement.bind( "click.button", function() {
115
				if ( options.disabled ) {
116
					return false;
117
				}
118
				$( this ).toggleClass( "ui-state-active" );
119
				self.buttonElement.attr( "aria-pressed", self.element[0].checked );
120
			});
121
		} else if ( this.type === "radio" ) {
122
			this.buttonElement.bind( "click.button", function() {
123
				if ( options.disabled ) {
124
					return false;
125
				}
126
				$( this ).addClass( "ui-state-active" );
127
				self.buttonElement.attr( "aria-pressed", true );
128

    
129
				var radio = self.element[ 0 ];
130
				radioGroup( radio )
131
					.not( radio )
132
					.map(function() {
133
						return $( this ).button( "widget" )[ 0 ];
134
					})
135
					.removeClass( "ui-state-active" )
136
					.attr( "aria-pressed", false );
137
			});
138
		} else {
139
			this.buttonElement
140
				.bind( "mousedown.button", function() {
141
					if ( options.disabled ) {
142
						return false;
143
					}
144
					$( this ).addClass( "ui-state-active" );
145
					lastActive = this;
146
					$( document ).one( "mouseup", function() {
147
						lastActive = null;
148
					});
149
				})
150
				.bind( "mouseup.button", function() {
151
					if ( options.disabled ) {
152
						return false;
153
					}
154
					$( this ).removeClass( "ui-state-active" );
155
				})
156
				.bind( "keydown.button", function(event) {
157
					if ( options.disabled ) {
158
						return false;
159
					}
160
					if ( event.keyCode == $.ui.keyCode.SPACE || event.keyCode == $.ui.keyCode.ENTER ) {
161
						$( this ).addClass( "ui-state-active" );
162
					}
163
				})
164
				.bind( "keyup.button", function() {
165
					$( this ).removeClass( "ui-state-active" );
166
				});
167

    
168
			if ( this.buttonElement.is("a") ) {
169
				this.buttonElement.keyup(function(event) {
170
					if ( event.keyCode === $.ui.keyCode.SPACE ) {
171
						// TODO pass through original event correctly (just as 2nd argument doesn't work)
172
						$( this ).click();
173
					}
174
				});
175
			}
176
		}
177

    
178
		// TODO: pull out $.Widget's handling for the disabled option into
179
		// $.Widget.prototype._setOptionDisabled so it's easy to proxy and can
180
		// be overridden by individual plugins
181
		this._setOption( "disabled", options.disabled );
182
	},
183

    
184
	_determineButtonType: function() {
185
		
186
		if ( this.element.is(":checkbox") ) {
187
			this.type = "checkbox";
188
		} else {
189
			if ( this.element.is(":radio") ) {
190
				this.type = "radio";
191
			} else {
192
				if ( this.element.is("input") ) {
193
					this.type = "input";
194
				} else {
195
					this.type = "button";
196
				}
197
			}
198
		}
199
		
200
		if ( this.type === "checkbox" || this.type === "radio" ) {
201
			// we don't search against the document in case the element
202
			// is disconnected from the DOM
203
			this.buttonElement = this.element.parents().last()
204
				.find( "label[for=" + this.element.attr("id") + "]" );
205
			this.element.addClass( "ui-helper-hidden-accessible" );
206

    
207
			var checked = this.element.is( ":checked" );
208
			if ( checked ) {
209
				this.buttonElement.addClass( "ui-state-active" );
210
			}
211
			this.buttonElement.attr( "aria-pressed", checked );
212
		} else {
213
			this.buttonElement = this.element;
214
		}
215
	},
216

    
217
	widget: function() {
218
		return this.buttonElement;
219
	},
220

    
221
	destroy: function() {
222
		this.element
223
			.removeClass( "ui-helper-hidden-accessible" );
224
		this.buttonElement
225
			.removeClass( baseClasses + " " + stateClasses + " " + typeClasses )
226
			.removeAttr( "role" )
227
			.removeAttr( "aria-pressed" )
228
			.html( this.buttonElement.find(".ui-button-text").html() );
229

    
230
		if ( !this.hasTitle ) {
231
			this.buttonElement.removeAttr( "title" );
232
		}
233

    
234
		$.Widget.prototype.destroy.call( this );
235
	},
236

    
237
	_setOption: function( key, value ) {
238
		$.Widget.prototype._setOption.apply( this, arguments );
239
		if ( key === "disabled" ) {
240
			if ( value ) {
241
				this.element.attr( "disabled", true );
242
			} else {
243
				this.element.removeAttr( "disabled" );
244
			}
245
		}
246
		this._resetButton();
247
	},
248

    
249
	refresh: function() {
250
		var isDisabled = this.element.is( ":disabled" );
251
		if ( isDisabled !== this.options.disabled ) {
252
			this._setOption( "disabled", isDisabled );
253
		}
254
		if ( this.type === "radio" ) {
255
			radioGroup( this.element[0] ).each(function() {
256
				if ( $( this ).is( ":checked" ) ) {
257
					$( this ).button( "widget" )
258
						.addClass( "ui-state-active" )
259
						.attr( "aria-pressed", true );
260
				} else {
261
					$( this ).button( "widget" )
262
						.removeClass( "ui-state-active" )
263
						.attr( "aria-pressed", false );
264
				}
265
			});
266
		} else if ( this.type === "checkbox" ) {
267
			if ( this.element.is( ":checked" ) ) {
268
				this.buttonElement
269
					.addClass( "ui-state-active" )
270
					.attr( "aria-pressed", true );
271
			} else {
272
				this.buttonElement
273
					.removeClass( "ui-state-active" )
274
					.attr( "aria-pressed", false );
275
			}
276
		}
277
	},
278

    
279
	_resetButton: function() {
280
		if ( this.type === "input" ) {
281
			if ( this.options.label ) {
282
				this.element.val( this.options.label );
283
			}
284
			return;
285
		}
286
		var buttonElement = this.buttonElement.removeClass( typeClasses ),
287
			buttonText = $( "<span></span>" )
288
				.addClass( "ui-button-text" )
289
				.html( this.options.label )
290
				.appendTo( buttonElement.empty() )
291
				.text(),
292
			icons = this.options.icons,
293
			multipleIcons = icons.primary && icons.secondary;
294
		if ( icons.primary || icons.secondary ) {
295
			buttonElement.addClass( "ui-button-text-icon" +
296
				( multipleIcons ? "s" : ( icons.primary ? "-primary" : "-secondary" ) ) );
297
			if ( icons.primary ) {
298
				buttonElement.prepend( "<span class='ui-button-icon-primary ui-icon " + icons.primary + "'></span>" );
299
			}
300
			if ( icons.secondary ) {
301
				buttonElement.append( "<span class='ui-button-icon-secondary ui-icon " + icons.secondary + "'></span>" );
302
			}
303
			if ( !this.options.text ) {
304
				buttonElement
305
					.addClass( multipleIcons ? "ui-button-icons-only" : "ui-button-icon-only" )
306
					.removeClass( "ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary" );
307
				if ( !this.hasTitle ) {
308
					buttonElement.attr( "title", buttonText );
309
				}
310
			}
311
		} else {
312
			buttonElement.addClass( "ui-button-text-only" );
313
		}
314
	}
315
});
316

    
317
$.widget( "ui.buttonset", {
318
	_create: function() {
319
		this.element.addClass( "ui-buttonset" );
320
	},
321
	
322
	_init: function() {
323
		this.refresh();
324
	},
325

    
326
	_setOption: function( key, value ) {
327
		if ( key === "disabled" ) {
328
			this.buttons.button( "option", key, value );
329
		}
330

    
331
		$.Widget.prototype._setOption.apply( this, arguments );
332
	},
333
	
334
	refresh: function() {
335
		this.buttons = this.element.find( ":button, :submit, :reset, :checkbox, :radio, a, :data(button)" )
336
			.filter( ":ui-button" )
337
				.button( "refresh" )
338
			.end()
339
			.not( ":ui-button" )
340
				.button()
341
			.end()
342
			.map(function() {
343
				return $( this ).button( "widget" )[ 0 ];
344
			})
345
				.removeClass( "ui-corner-all ui-corner-left ui-corner-right" )
346
				.filter( ":visible" )
347
					.filter( ":first" )
348
						.addClass( "ui-corner-left" )
349
					.end()
350
					.filter( ":last" )
351
						.addClass( "ui-corner-right" )
352
					.end()
353
				.end()
354
			.end();
355
	},
356

    
357
	destroy: function() {
358
		this.element.removeClass( "ui-buttonset" );
359
		this.buttons
360
			.map(function() {
361
				return $( this ).button( "widget" )[ 0 ];
362
			})
363
				.removeClass( "ui-corner-left ui-corner-right" )
364
			.end()
365
			.button( "destroy" );
366

    
367
		$.Widget.prototype.destroy.call( this );
368
	}
369
});
370

    
371
}( jQuery ) );
(18-18/32)