summaryrefslogtreecommitdiff
path: root/src/jquery.ui.waitbutton.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/jquery.ui.waitbutton.js')
-rw-r--r--src/jquery.ui.waitbutton.js149
1 files changed, 149 insertions, 0 deletions
diff --git a/src/jquery.ui.waitbutton.js b/src/jquery.ui.waitbutton.js
new file mode 100644
index 0000000..0225378
--- /dev/null
+++ b/src/jquery.ui.waitbutton.js
@@ -0,0 +1,149 @@
+/*!
+ * Copyright (c) 2013 Ben Olson (https://github.com/bseth99/jquery-ui-extensions)
+ * jQuery UI WaitButton @VERSION
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.widget.js
+ * jquery.ui.button.js
+ */
+ (function ( $, undefined ) {
+ $.widget( "ui.waitbutton", $.ui.button, {
+
+ version: "@VERSION",
+
+ // Keep button prefix instead of waitbutton
+ // otherwise waiting event is waitbuttonwaiting
+ // which is weird.
+ widgetEventPrefix: "button",
+
+ options: {
+ waitLabel: null,
+ waitIcon: 'ui-icon-waiting'
+ },
+
+ _saved: null,
+
+ _create: function() {
+
+ this._super();
+
+ this.element.addClass('ui-wait-button');
+ this._saved = {};
+
+ this._saveOptions();
+
+ },
+
+ _init: function() {
+
+ this._super();
+
+ this.disable();
+ this._toggleWaitState();
+ this._initWaitClick();
+
+ },
+
+ _initWaitClick: function() {
+
+ /**
+ * channel clicks through waiting event instead
+ * base button does not listen to click -
+ * it listens to mousedown/up. This prevents any external
+ * listeners from firing when we want to use the callback
+ * provided by the waiting event.
+ */
+ this.element.off( 'click' );
+
+ this.element.one( 'click', $.proxy( this, '_toggleWaitState' ) );
+ },
+
+ _toggleWaitState: function() {
+
+ var event;
+
+ if ( this.options.disabled ) {
+
+ this._setOptions({
+ disabled: false,
+ label: this._saved.label,
+ icons: { primary: this._saved.icon }
+ });
+
+ } else {
+
+ this._saveOptions();
+
+ this._setOptions({
+ disabled: true,
+ label: this.options.waitLabel || this.options.label,
+ icons: { primary: this.options.waitIcon }
+ });
+
+ event = arguments[0] || (new jQuery.Event( 'click', { target: this.element } ) );
+
+ /* channel clicks through waiting event instead */
+ event.preventDefault();
+ event.stopPropagation();
+ event.stopImmediatePropagation();
+
+ this._trigger( 'waiting', event, { done: $.proxy( this, '_waitComplete' ) } );
+ }
+
+ },
+
+ _waitComplete: function() {
+
+ // Juggle arguments
+ var label = (arguments[0] && typeof( arguments[0] ) == 'string' ? arguments[0] : null),
+ enable = (label ? arguments[1] : arguments[0]);
+
+ // Determine next state - either return to start or
+ // use a different label and/or leave in disabled state
+
+ if ( typeof( enable ) == 'undefined' ) enable = true;
+
+ this._toggleWaitState();
+ if ( enable ) {
+ this._initWaitClick();
+ } else {
+ this.disable();
+ }
+
+ if ( label ) {
+ this._setOption( 'label', label );
+ }
+ },
+
+ _saveOptions: function() {
+
+ this._saved.icon = this.options.icons.primary;
+ this._saved.label = this.options.label;
+
+ }
+
+ });
+
+})(jQuery);