]> git.mxchange.org Git - quix0rs-gnu-social.git/blob - js/ui/jquery.ui.button.js
f0a5deca3fa3cc9a9c3c832ce56d1314c213e8d8
[quix0rs-gnu-social.git] / js / ui / jquery.ui.button.js
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
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                         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 ) );