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

Last change on this file since 9559 was 9559, checked in by patdenice, 13 years ago

Update jQuery UI to 1.8.10.
Improve jquery ui management in template class.

File size: 9.8 KB
Line 
1/*
2 * jQuery UI Button 1.8.10
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
16var 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                        buttonClasses = []; 
295
296                if ( icons.primary || icons.secondary ) {
297                        buttonClasses.push( "ui-button-text-icon" + ( multipleIcons ? "s" : ( icons.primary ? "-primary" : "-secondary" ) ) );
298
299                        if ( icons.primary ) {
300                                buttonElement.prepend( "<span class='ui-button-icon-primary ui-icon " + icons.primary + "'></span>" );
301                        }
302
303                        if ( icons.secondary ) {
304                                buttonElement.append( "<span class='ui-button-icon-secondary ui-icon " + icons.secondary + "'></span>" );
305                        }
306
307                        if ( !this.options.text ) {
308                                buttonClasses.push( multipleIcons ? "ui-button-icons-only" : "ui-button-icon-only" );
309                                buttonElement.removeClass( "ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary" );
310
311                                if ( !this.hasTitle ) {
312                                        buttonElement.attr( "title", buttonText );
313                                }
314                        }
315                } else {
316                        buttonClasses.push( "ui-button-text-only" );
317                }
318                buttonElement.addClass( buttonClasses.join( " " ) );
319        }
320});
321
322$.widget( "ui.buttonset", {
323        options: {
324                items: ":button, :submit, :reset, :checkbox, :radio, a, :data(button)"
325        },
326
327        _create: function() {
328                this.element.addClass( "ui-buttonset" );
329        },
330       
331        _init: function() {
332                this.refresh();
333        },
334
335        _setOption: function( key, value ) {
336                if ( key === "disabled" ) {
337                        this.buttons.button( "option", key, value );
338                }
339
340                $.Widget.prototype._setOption.apply( this, arguments );
341        },
342       
343        refresh: function() {
344                this.buttons = this.element.find( this.options.items )
345                        .filter( ":ui-button" )
346                                .button( "refresh" )
347                        .end()
348                        .not( ":ui-button" )
349                                .button()
350                        .end()
351                        .map(function() {
352                                return $( this ).button( "widget" )[ 0 ];
353                        })
354                                .removeClass( "ui-corner-all ui-corner-left ui-corner-right" )
355                                .filter( ":first" )
356                                        .addClass( "ui-corner-left" )
357                                .end()
358                                .filter( ":last" )
359                                        .addClass( "ui-corner-right" )
360                                .end()
361                        .end();
362        },
363
364        destroy: function() {
365                this.element.removeClass( "ui-buttonset" );
366                this.buttons
367                        .map(function() {
368                                return $( this ).button( "widget" )[ 0 ];
369                        })
370                                .removeClass( "ui-corner-left ui-corner-right" )
371                        .end()
372                        .button( "destroy" );
373
374                $.Widget.prototype.destroy.call( this );
375        }
376});
377
378}( jQuery ) );
Note: See TracBrowser for help on using the repository browser.