source: pro-violet-viettel/www/deploy/20150304/assets/js/jquery.ui.widget.js @ 804

Last change on this file since 804 was 780, checked in by dungnv, 10 years ago
File size: 15.0 KB
Line 
1/*
2 * jQuery UI Widget 1.10.1+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
22var 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}));
Note: See TracBrowser for help on using the repository browser.