scala-news-reader

rss/atom news reader in scala

git clone https://9o.is/git/scala-news-reader.git

jquery.ui.widget.js

(15323B)


      1 /*
      2  * jQuery UI Widget 1.10.3+amd
      3  * https://github.com/blueimp/jQuery-File-Upload
      4  *
      5  * Copyright 2013 jQuery Foundation and other contributors
      6  * Released under the MIT license.
      7  * http://jquery.org/license
      8  *
      9  * http://api.jqueryui.com/jQuery.widget/
     10  */
     11 
     12 (function (factory) {
     13     if (typeof define === "function" && define.amd) {
     14         // Register as an anonymous AMD module:
     15         define(["jquery"], factory);
     16     } else {
     17         // Browser globals:
     18         factory(jQuery);
     19     }
     20 }(function( $, undefined ) {
     21 
     22 var uuid = 0,
     23 	slice = Array.prototype.slice,
     24 	_cleanData = $.cleanData;
     25 $.cleanData = function( elems ) {
     26 	for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
     27 		try {
     28 			$( elem ).triggerHandler( "remove" );
     29 		// http://bugs.jquery.com/ticket/8235
     30 		} catch( e ) {}
     31 	}
     32 	_cleanData( elems );
     33 };
     34 
     35 $.widget = function( name, base, prototype ) {
     36 	var fullName, existingConstructor, constructor, basePrototype,
     37 		// proxiedPrototype allows the provided prototype to remain unmodified
     38 		// so that it can be used as a mixin for multiple widgets (#8876)
     39 		proxiedPrototype = {},
     40 		namespace = name.split( "." )[ 0 ];
     41 
     42 	name = name.split( "." )[ 1 ];
     43 	fullName = namespace + "-" + name;
     44 
     45 	if ( !prototype ) {
     46 		prototype = base;
     47 		base = $.Widget;
     48 	}
     49 
     50 	// create selector for plugin
     51 	$.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) {
     52 		return !!$.data( elem, fullName );
     53 	};
     54 
     55 	$[ namespace ] = $[ namespace ] || {};
     56 	existingConstructor = $[ namespace ][ name ];
     57 	constructor = $[ namespace ][ name ] = function( options, element ) {
     58 		// allow instantiation without "new" keyword
     59 		if ( !this._createWidget ) {
     60 			return new constructor( options, element );
     61 		}
     62 
     63 		// allow instantiation without initializing for simple inheritance
     64 		// must use "new" keyword (the code above always passes args)
     65 		if ( arguments.length ) {
     66 			this._createWidget( options, element );
     67 		}
     68 	};
     69 	// extend with the existing constructor to carry over any static properties
     70 	$.extend( constructor, existingConstructor, {
     71 		version: prototype.version,
     72 		// copy the object used to create the prototype in case we need to
     73 		// redefine the widget later
     74 		_proto: $.extend( {}, prototype ),
     75 		// track widgets that inherit from this widget in case this widget is
     76 		// redefined after a widget inherits from it
     77 		_childConstructors: []
     78 	});
     79 
     80 	basePrototype = new base();
     81 	// we need to make the options hash a property directly on the new instance
     82 	// otherwise we'll modify the options hash on the prototype that we're
     83 	// inheriting from
     84 	basePrototype.options = $.widget.extend( {}, basePrototype.options );
     85 	$.each( prototype, function( prop, value ) {
     86 		if ( !$.isFunction( value ) ) {
     87 			proxiedPrototype[ prop ] = value;
     88 			return;
     89 		}
     90 		proxiedPrototype[ prop ] = (function() {
     91 			var _super = function() {
     92 					return base.prototype[ prop ].apply( this, arguments );
     93 				},
     94 				_superApply = function( args ) {
     95 					return base.prototype[ prop ].apply( this, args );
     96 				};
     97 			return function() {
     98 				var __super = this._super,
     99 					__superApply = this._superApply,
    100 					returnValue;
    101 
    102 				this._super = _super;
    103 				this._superApply = _superApply;
    104 
    105 				returnValue = value.apply( this, arguments );
    106 
    107 				this._super = __super;
    108 				this._superApply = __superApply;
    109 
    110 				return returnValue;
    111 			};
    112 		})();
    113 	});
    114 	constructor.prototype = $.widget.extend( basePrototype, {
    115 		// TODO: remove support for widgetEventPrefix
    116 		// always use the name + a colon as the prefix, e.g., draggable:start
    117 		// don't prefix for widgets that aren't DOM-based
    118 		widgetEventPrefix: existingConstructor ? basePrototype.widgetEventPrefix : name
    119 	}, proxiedPrototype, {
    120 		constructor: constructor,
    121 		namespace: namespace,
    122 		widgetName: name,
    123 		widgetFullName: fullName
    124 	});
    125 
    126 	// If this widget is being redefined then we need to find all widgets that
    127 	// are inheriting from it and redefine all of them so that they inherit from
    128 	// the new version of this widget. We're essentially trying to replace one
    129 	// level in the prototype chain.
    130 	if ( existingConstructor ) {
    131 		$.each( existingConstructor._childConstructors, function( i, child ) {
    132 			var childPrototype = child.prototype;
    133 
    134 			// redefine the child widget using the same prototype that was
    135 			// originally used, but inherit from the new version of the base
    136 			$.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto );
    137 		});
    138 		// remove the list of existing child constructors from the old constructor
    139 		// so the old child constructors can be garbage collected
    140 		delete existingConstructor._childConstructors;
    141 	} else {
    142 		base._childConstructors.push( constructor );
    143 	}
    144 
    145 	$.widget.bridge( name, constructor );
    146 };
    147 
    148 $.widget.extend = function( target ) {
    149 	var input = slice.call( arguments, 1 ),
    150 		inputIndex = 0,
    151 		inputLength = input.length,
    152 		key,
    153 		value;
    154 	for ( ; inputIndex < inputLength; inputIndex++ ) {
    155 		for ( key in input[ inputIndex ] ) {
    156 			value = input[ inputIndex ][ key ];
    157 			if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {
    158 				// Clone objects
    159 				if ( $.isPlainObject( value ) ) {
    160 					target[ key ] = $.isPlainObject( target[ key ] ) ?
    161 						$.widget.extend( {}, target[ key ], value ) :
    162 						// Don't extend strings, arrays, etc. with objects
    163 						$.widget.extend( {}, value );
    164 				// Copy everything else by reference
    165 				} else {
    166 					target[ key ] = value;
    167 				}
    168 			}
    169 		}
    170 	}
    171 	return target;
    172 };
    173 
    174 $.widget.bridge = function( name, object ) {
    175 	var fullName = object.prototype.widgetFullName || name;
    176 	$.fn[ name ] = function( options ) {
    177 		var isMethodCall = typeof options === "string",
    178 			args = slice.call( arguments, 1 ),
    179 			returnValue = this;
    180 
    181 		// allow multiple hashes to be passed on init
    182 		options = !isMethodCall && args.length ?
    183 			$.widget.extend.apply( null, [ options ].concat(args) ) :
    184 			options;
    185 
    186 		if ( isMethodCall ) {
    187 			this.each(function() {
    188 				var methodValue,
    189 					instance = $.data( this, fullName );
    190 				if ( !instance ) {
    191 					return $.error( "cannot call methods on " + name + " prior to initialization; " +
    192 						"attempted to call method '" + options + "'" );
    193 				}
    194 				if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) {
    195 					return $.error( "no such method '" + options + "' for " + name + " widget instance" );
    196 				}
    197 				methodValue = instance[ options ].apply( instance, args );
    198 				if ( methodValue !== instance && methodValue !== undefined ) {
    199 					returnValue = methodValue && methodValue.jquery ?
    200 						returnValue.pushStack( methodValue.get() ) :
    201 						methodValue;
    202 					return false;
    203 				}
    204 			});
    205 		} else {
    206 			this.each(function() {
    207 				var instance = $.data( this, fullName );
    208 				if ( instance ) {
    209 					instance.option( options || {} )._init();
    210 				} else {
    211 					$.data( this, fullName, new object( options, this ) );
    212 				}
    213 			});
    214 		}
    215 
    216 		return returnValue;
    217 	};
    218 };
    219 
    220 $.Widget = function( /* options, element */ ) {};
    221 $.Widget._childConstructors = [];
    222 
    223 $.Widget.prototype = {
    224 	widgetName: "widget",
    225 	widgetEventPrefix: "",
    226 	defaultElement: "<div>",
    227 	options: {
    228 		disabled: false,
    229 
    230 		// callbacks
    231 		create: null
    232 	},
    233 	_createWidget: function( options, element ) {
    234 		element = $( element || this.defaultElement || this )[ 0 ];
    235 		this.element = $( element );
    236 		this.uuid = uuid++;
    237 		this.eventNamespace = "." + this.widgetName + this.uuid;
    238 		this.options = $.widget.extend( {},
    239 			this.options,
    240 			this._getCreateOptions(),
    241 			options );
    242 
    243 		this.bindings = $();
    244 		this.hoverable = $();
    245 		this.focusable = $();
    246 
    247 		if ( element !== this ) {
    248 			$.data( element, this.widgetFullName, this );
    249 			this._on( true, this.element, {
    250 				remove: function( event ) {
    251 					if ( event.target === element ) {
    252 						this.destroy();
    253 					}
    254 				}
    255 			});
    256 			this.document = $( element.style ?
    257 				// element within the document
    258 				element.ownerDocument :
    259 				// element is window or document
    260 				element.document || element );
    261 			this.window = $( this.document[0].defaultView || this.document[0].parentWindow );
    262 		}
    263 
    264 		this._create();
    265 		this._trigger( "create", null, this._getCreateEventData() );
    266 		this._init();
    267 	},
    268 	_getCreateOptions: $.noop,
    269 	_getCreateEventData: $.noop,
    270 	_create: $.noop,
    271 	_init: $.noop,
    272 
    273 	destroy: function() {
    274 		this._destroy();
    275 		// we can probably remove the unbind calls in 2.0
    276 		// all event bindings should go through this._on()
    277 		this.element
    278 			.unbind( this.eventNamespace )
    279 			// 1.9 BC for #7810
    280 			// TODO remove dual storage
    281 			.removeData( this.widgetName )
    282 			.removeData( this.widgetFullName )
    283 			// support: jquery <1.6.3
    284 			// http://bugs.jquery.com/ticket/9413
    285 			.removeData( $.camelCase( this.widgetFullName ) );
    286 		this.widget()
    287 			.unbind( this.eventNamespace )
    288 			.removeAttr( "aria-disabled" )
    289 			.removeClass(
    290 				this.widgetFullName + "-disabled " +
    291 				"ui-state-disabled" );
    292 
    293 		// clean up events and states
    294 		this.bindings.unbind( this.eventNamespace );
    295 		this.hoverable.removeClass( "ui-state-hover" );
    296 		this.focusable.removeClass( "ui-state-focus" );
    297 	},
    298 	_destroy: $.noop,
    299 
    300 	widget: function() {
    301 		return this.element;
    302 	},
    303 
    304 	option: function( key, value ) {
    305 		var options = key,
    306 			parts,
    307 			curOption,
    308 			i;
    309 
    310 		if ( arguments.length === 0 ) {
    311 			// don't return a reference to the internal hash
    312 			return $.widget.extend( {}, this.options );
    313 		}
    314 
    315 		if ( typeof key === "string" ) {
    316 			// handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
    317 			options = {};
    318 			parts = key.split( "." );
    319 			key = parts.shift();
    320 			if ( parts.length ) {
    321 				curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );
    322 				for ( i = 0; i < parts.length - 1; i++ ) {
    323 					curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};
    324 					curOption = curOption[ parts[ i ] ];
    325 				}
    326 				key = parts.pop();
    327 				if ( value === undefined ) {
    328 					return curOption[ key ] === undefined ? null : curOption[ key ];
    329 				}
    330 				curOption[ key ] = value;
    331 			} else {
    332 				if ( value === undefined ) {
    333 					return this.options[ key ] === undefined ? null : this.options[ key ];
    334 				}
    335 				options[ key ] = value;
    336 			}
    337 		}
    338 
    339 		this._setOptions( options );
    340 
    341 		return this;
    342 	},
    343 	_setOptions: function( options ) {
    344 		var key;
    345 
    346 		for ( key in options ) {
    347 			this._setOption( key, options[ key ] );
    348 		}
    349 
    350 		return this;
    351 	},
    352 	_setOption: function( key, value ) {
    353 		this.options[ key ] = value;
    354 
    355 		if ( key === "disabled" ) {
    356 			this.widget()
    357 				.toggleClass( this.widgetFullName + "-disabled ui-state-disabled", !!value )
    358 				.attr( "aria-disabled", value );
    359 			this.hoverable.removeClass( "ui-state-hover" );
    360 			this.focusable.removeClass( "ui-state-focus" );
    361 		}
    362 
    363 		return this;
    364 	},
    365 
    366 	enable: function() {
    367 		return this._setOption( "disabled", false );
    368 	},
    369 	disable: function() {
    370 		return this._setOption( "disabled", true );
    371 	},
    372 
    373 	_on: function( suppressDisabledCheck, element, handlers ) {
    374 		var delegateElement,
    375 			instance = this;
    376 
    377 		// no suppressDisabledCheck flag, shuffle arguments
    378 		if ( typeof suppressDisabledCheck !== "boolean" ) {
    379 			handlers = element;
    380 			element = suppressDisabledCheck;
    381 			suppressDisabledCheck = false;
    382 		}
    383 
    384 		// no element argument, shuffle and use this.element
    385 		if ( !handlers ) {
    386 			handlers = element;
    387 			element = this.element;
    388 			delegateElement = this.widget();
    389 		} else {
    390 			// accept selectors, DOM elements
    391 			element = delegateElement = $( element );
    392 			this.bindings = this.bindings.add( element );
    393 		}
    394 
    395 		$.each( handlers, function( event, handler ) {
    396 			function handlerProxy() {
    397 				// allow widgets to customize the disabled handling
    398 				// - disabled as an array instead of boolean
    399 				// - disabled class as method for disabling individual parts
    400 				if ( !suppressDisabledCheck &&
    401 						( instance.options.disabled === true ||
    402 							$( this ).hasClass( "ui-state-disabled" ) ) ) {
    403 					return;
    404 				}
    405 				return ( typeof handler === "string" ? instance[ handler ] : handler )
    406 					.apply( instance, arguments );
    407 			}
    408 
    409 			// copy the guid so direct unbinding works
    410 			if ( typeof handler !== "string" ) {
    411 				handlerProxy.guid = handler.guid =
    412 					handler.guid || handlerProxy.guid || $.guid++;
    413 			}
    414 
    415 			var match = event.match( /^(\w+)\s*(.*)$/ ),
    416 				eventName = match[1] + instance.eventNamespace,
    417 				selector = match[2];
    418 			if ( selector ) {
    419 				delegateElement.delegate( selector, eventName, handlerProxy );
    420 			} else {
    421 				element.bind( eventName, handlerProxy );
    422 			}
    423 		});
    424 	},
    425 
    426 	_off: function( element, eventName ) {
    427 		eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) + this.eventNamespace;
    428 		element.unbind( eventName ).undelegate( eventName );
    429 	},
    430 
    431 	_delay: function( handler, delay ) {
    432 		function handlerProxy() {
    433 			return ( typeof handler === "string" ? instance[ handler ] : handler )
    434 				.apply( instance, arguments );
    435 		}
    436 		var instance = this;
    437 		return setTimeout( handlerProxy, delay || 0 );
    438 	},
    439 
    440 	_hoverable: function( element ) {
    441 		this.hoverable = this.hoverable.add( element );
    442 		this._on( element, {
    443 			mouseenter: function( event ) {
    444 				$( event.currentTarget ).addClass( "ui-state-hover" );
    445 			},
    446 			mouseleave: function( event ) {
    447 				$( event.currentTarget ).removeClass( "ui-state-hover" );
    448 			}
    449 		});
    450 	},
    451 
    452 	_focusable: function( element ) {
    453 		this.focusable = this.focusable.add( element );
    454 		this._on( element, {
    455 			focusin: function( event ) {
    456 				$( event.currentTarget ).addClass( "ui-state-focus" );
    457 			},
    458 			focusout: function( event ) {
    459 				$( event.currentTarget ).removeClass( "ui-state-focus" );
    460 			}
    461 		});
    462 	},
    463 
    464 	_trigger: function( type, event, data ) {
    465 		var prop, orig,
    466 			callback = this.options[ type ];
    467 
    468 		data = data || {};
    469 		event = $.Event( event );
    470 		event.type = ( type === this.widgetEventPrefix ?
    471 			type :
    472 			this.widgetEventPrefix + type ).toLowerCase();
    473 		// the original event may come from any element
    474 		// so we need to reset the target on the new event
    475 		event.target = this.element[ 0 ];
    476 
    477 		// copy original event properties over to the new event
    478 		orig = event.originalEvent;
    479 		if ( orig ) {
    480 			for ( prop in orig ) {
    481 				if ( !( prop in event ) ) {
    482 					event[ prop ] = orig[ prop ];
    483 				}
    484 			}
    485 		}
    486 
    487 		this.element.trigger( event, data );
    488 		return !( $.isFunction( callback ) &&
    489 			callback.apply( this.element[0], [ event ].concat( data ) ) === false ||
    490 			event.isDefaultPrevented() );
    491 	}
    492 };
    493 
    494 $.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) {
    495 	$.Widget.prototype[ "_" + method ] = function( element, options, callback ) {
    496 		if ( typeof options === "string" ) {
    497 			options = { effect: options };
    498 		}
    499 		var hasOptions,
    500 			effectName = !options ?
    501 				method :
    502 				options === true || typeof options === "number" ?
    503 					defaultEffect :
    504 					options.effect || defaultEffect;
    505 		options = options || {};
    506 		if ( typeof options === "number" ) {
    507 			options = { duration: options };
    508 		}
    509 		hasOptions = !$.isEmptyObject( options );
    510 		options.complete = callback;
    511 		if ( options.delay ) {
    512 			element.delay( options.delay );
    513 		}
    514 		if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {
    515 			element[ method ]( options );
    516 		} else if ( effectName !== method && element[ effectName ] ) {
    517 			element[ effectName ]( options.duration, options.easing, callback );
    518 		} else {
    519 			element.queue(function( next ) {
    520 				$( this )[ method ]();
    521 				if ( callback ) {
    522 					callback.call( element[ 0 ] );
    523 				}
    524 				next();
    525 			});
    526 		}
    527 	};
    528 });
    529 
    530 }));