Mercurial > hg > digilib
comparison client/digitallibrary/jquery/ui/jquery.ui.button.js @ 749:4b492b7900fb jquery
added jQuery ui and svg javascripts
| author | hertzhaft |
|---|---|
| date | Sun, 06 Feb 2011 22:17:41 +0100 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 748:fb4ffac2950d | 749:4b492b7900fb |
|---|---|
| 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 | |
| 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 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 ) ); |
