source: trunk/themes/default/js/ui/jquery.ui.button.js @ 20824

Last change on this file since 20824 was 20824, checked in by rvelices, 11 years ago

upgraded jquery ui from 1.9.0 to 1.10.1

File size: 11.5 KB
Line 
1/*!
2 * jQuery UI Button 1.10.1
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.1",
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.1",
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 ) );
Note: See TracBrowser for help on using the repository browser.