Projet

Général

Profil

Paste
Télécharger (11,5 ko) Statistiques
| Branche: | Révision:

root / drupal7 / sites / all / modules / jquery_update / replace / ui / ui / jquery.ui.button.js @ 503b3f7b

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

    
17
var 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;
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,
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 ) );