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

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

Update jQuery to 1.5 and jQuery UI to 1.8.9

File size: 9.7 KB
Line 
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
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                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 ) );
Note: See TracBrowser for help on using the repository browser.