comparison client/digitallibrary/jquery/ui/jquery.ui.button.js @ 756:ccf67eaf97ee jquery

added jQuery ui and svg javascripts
author hertzhaft
date Sun, 06 Feb 2011 22:17:41 +0100
parents
children
comparison
equal deleted inserted replaced
755:4c0cc97a6399 756:ccf67eaf97ee
1 /*
2 * jQuery UI Button 1.8.9
3 *
4 * Copyright 2011, 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 options: {
319 items: ":button, :submit, :reset, :checkbox, :radio, a, :data(button)"
320 },
321
322 _create: function() {
323 this.element.addClass( "ui-buttonset" );
324 },
325
326 _init: function() {
327 this.refresh();
328 },
329
330 _setOption: function( key, value ) {
331 if ( key === "disabled" ) {
332 this.buttons.button( "option", key, value );
333 }
334
335 $.Widget.prototype._setOption.apply( this, arguments );
336 },
337
338 refresh: function() {
339 this.buttons = this.element.find( this.options.items )
340 .filter( ":ui-button" )
341 .button( "refresh" )
342 .end()
343 .not( ":ui-button" )
344 .button()
345 .end()
346 .map(function() {
347 return $( this ).button( "widget" )[ 0 ];
348 })
349 .removeClass( "ui-corner-all ui-corner-left ui-corner-right" )
350 .filter( ":first" )
351 .addClass( "ui-corner-left" )
352 .end()
353 .filter( ":last" )
354 .addClass( "ui-corner-right" )
355 .end()
356 .end();
357 },
358
359 destroy: function() {
360 this.element.removeClass( "ui-buttonset" );
361 this.buttons
362 .map(function() {
363 return $( this ).button( "widget" )[ 0 ];
364 })
365 .removeClass( "ui-corner-left ui-corner-right" )
366 .end()
367 .button( "destroy" );
368
369 $.Widget.prototype.destroy.call( this );
370 }
371 });
372
373 }( jQuery ) );