rasputin-jui 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,973 @@
1
+
2
+ (function(exports) {
3
+ /*
4
+ * jQuery UI Autocomplete SC Extension
5
+ */
6
+
7
+ $.widget('ui.sc_autocomplete', $.ui.autocomplete, {
8
+ _renderItem: function(ul, item) {
9
+ var view = this.options.itemViewClass.create({content:item, widget: this});
10
+ view.appendTo(ul);
11
+ return view.$();
12
+ }
13
+ });
14
+
15
+ })({});
16
+
17
+
18
+ (function(exports) {
19
+ if ('undefined' === typeof JUI) {
20
+
21
+ /**
22
+ @namespace
23
+ @name JUI
24
+ @version 1.0.alpha
25
+ */
26
+ JUI = {};
27
+
28
+ // aliases needed to keep minifiers from removing the global context
29
+ if ('undefined' !== typeof window) {
30
+ window.JUI = JUI;
31
+ }
32
+
33
+ }
34
+
35
+ /**
36
+ @static
37
+ @type String
38
+ @default '1.0.alpha'
39
+ @constant
40
+ */
41
+ JUI.VERSION = '1.0.beta.1.pre';
42
+
43
+ })({});
44
+
45
+
46
+ (function(exports) {
47
+
48
+ var get = SC.get, set = SC.set, none = SC.none;
49
+
50
+ /**
51
+ @mixin
52
+ @since SproutCore JUI 1.0
53
+ @extends JUI.Widget
54
+ */
55
+ JUI.Widget = SC.Mixin.create({
56
+
57
+ uiWidget: function() {
58
+ return jQuery.ui[this.get('uiType')];
59
+ }.property().cacheable(),
60
+
61
+ didInsertElement: function() {
62
+ this._super();
63
+ var options = this._gatherOptions();
64
+ this._gatherEvents(options);
65
+
66
+ var ui = get(this, 'uiWidget')(options, get(this, 'element'));
67
+ set(this, 'ui', ui);
68
+ },
69
+
70
+ willDestroyElement: function() {
71
+ var ui = get(this, 'ui');
72
+ if (ui) {
73
+ var observers = this._observers;
74
+ for (var prop in observers) {
75
+ if (observers.hasOwnProperty(prop)) {
76
+ this.removeObserver(prop, observers[prop]);
77
+ }
78
+ }
79
+ ui._destroy();
80
+ }
81
+ },
82
+
83
+ didCreateWidget: SC.K,
84
+
85
+ concatenatedProperties: ['uiEvents', 'uiOptions', 'uiMethods'],
86
+
87
+ uiEvents: ['create'],
88
+ uiOptions: ['disabled'],
89
+ uiMethods: [],
90
+
91
+ _gatherEvents: function(options) {
92
+ var uiEvents = get(this, 'uiEvents');
93
+
94
+ uiEvents.forEach(function(eventType) {
95
+ var eventHandler = eventType === 'create' ? this.didCreateWidget : this[eventType];
96
+ if (eventHandler) {
97
+ options[eventType] = $.proxy(function(event, ui) {
98
+ eventHandler.call(this, event, ui);
99
+ }, this);
100
+ }
101
+ }, this);
102
+ },
103
+
104
+ _gatherOptions: function() {
105
+ var uiOptions = get(this, 'uiOptions'),
106
+ options = {},
107
+ defaultOptions = get(this, 'uiWidget').prototype.options;
108
+
109
+ uiOptions.forEach(function(key) {
110
+ var value = get(this, key),
111
+ uiKey = key.replace(/^_/, '');
112
+ if (!none(value)) {
113
+ options[uiKey] = value;
114
+ } else {
115
+ set(this, key, defaultOptions[uiKey]);
116
+ }
117
+
118
+ var observer = function() {
119
+ var value = get(this, key);
120
+ ui = get(this, 'ui');
121
+ if (ui.options[uiKey] != value) {
122
+ ui._setOption(uiKey, value);
123
+ }
124
+ };
125
+
126
+ this.addObserver(key, observer);
127
+ //this._observers = this._observers || {};
128
+ //this._observers[key] = observer;
129
+ }, this);
130
+
131
+ return options;
132
+ }
133
+ });
134
+
135
+ })({});
136
+
137
+
138
+ (function(exports) {
139
+
140
+ var get = SC.get;
141
+
142
+ /**
143
+ @mixin
144
+ @since SproutCore JUI 1.0
145
+ @extends JUI.TargetSupport
146
+ */
147
+ JUI.TargetSupport = SC.Mixin.create({
148
+
149
+ // @private
150
+ targetObject: function() {
151
+ var target = get(this, 'target');
152
+
153
+ if (SC.typeOf(target) === 'string') {
154
+ return SC.getPath(this, target);
155
+ } else {
156
+ return target;
157
+ }
158
+ }.property('target').cacheable(),
159
+
160
+ // @private
161
+ executeAction: function() {
162
+ var args = SC.$.makeArray(arguments),
163
+ action = args.shift(),
164
+ target = get(this, 'targetObject');
165
+ if (target && action) {
166
+ if (SC.typeOf(action) === 'string') {
167
+ action = target[action];
168
+ }
169
+ action.apply(target, args);
170
+ }
171
+ }
172
+
173
+ });
174
+
175
+ })({});
176
+
177
+
178
+ (function(exports) {
179
+
180
+
181
+
182
+ var get = SC.get;
183
+
184
+ /**
185
+ @class
186
+ @since SproutCore JUI 1.0
187
+ @extends JUI.AutocompleteItem
188
+ */
189
+ JUI.AutocompleteItem = SC.View.extend({
190
+ tagName: 'li',
191
+ defaultTemplate: SC.Handlebars.compile('<a>{{content.label}}</a>'),
192
+ didInsertElement: function() {
193
+ this._super();
194
+ this.$().data('item.autocomplete', {
195
+ value: this.getPath('content.value'),
196
+ label: this.getPath('content.label')
197
+ });
198
+ this.get('widget').menu.refresh();
199
+ }
200
+ });
201
+
202
+ /**
203
+ @class
204
+ @since SproutCore JUI 1.0
205
+ @extends JUI.AutocompleteTextField
206
+ */
207
+ JUI.AutocompleteTextField = SC.TextField.extend(JUI.Widget, JUI.TargetSupport, {
208
+ uiType: 'sc_autocomplete',
209
+ uiOptions: ['_source', 'delay', 'autoFocus', 'position', 'minLength', 'itemViewClass'],
210
+ uiEvents: ['select', 'focus', 'open', 'close'],
211
+
212
+ itemViewClass: JUI.AutocompleteItem,
213
+ requestContent: SC.K,
214
+ content: [],
215
+
216
+ _source: function() {
217
+ var source = this.get('source');
218
+ if (source) {
219
+ this.set('content', source);
220
+ return source;
221
+ } else {
222
+ return $.proxy(this, '_requestContent');
223
+ }
224
+ }.property('source').cacheable(),
225
+
226
+ _requestContent: function (data, callback) {
227
+ this._lastCallback = callback;
228
+ this.requestContent(data);
229
+ },
230
+
231
+ _contentDidChange: function() {
232
+ if (this._lastCallback) {
233
+ this._lastCallback(this.get('content'));
234
+ this._lastCallback = null;
235
+ }
236
+ }.observes('content'),
237
+
238
+ select: function(event, ui) {
239
+ if (ui.item) {
240
+ this.executeAction(get(this, 'action'), ui.item.value);
241
+ event.preventDefault();
242
+ }
243
+ }
244
+ });
245
+
246
+ })({});
247
+
248
+
249
+ (function(exports) {
250
+
251
+ var get = SC.get;
252
+
253
+ /**
254
+ @class
255
+ @since SproutCore JUI 1.0
256
+ @extends JUI.Button
257
+ */
258
+ JUI.Button = SC.Button.extend(JUI.Widget, {
259
+ uiType: 'button',
260
+ uiOptions: ['label'],
261
+
262
+ isActiveBinding: SC.Binding.oneWay('.disabled'),
263
+
264
+ _icons: function() {
265
+ var icons = {};
266
+ icons.primary = get(this, 'icon');
267
+ if (icons.primary) {
268
+ icons.primary = 'ui-icon-'.fmt(icons.primary);
269
+ }
270
+ return icons;
271
+ }.property('icon').cacheable()
272
+ });
273
+
274
+ })({});
275
+
276
+
277
+ (function(exports) {
278
+
279
+ var set = SC.set;
280
+
281
+ /**
282
+ @class
283
+ @since SproutCore JUI 1.0
284
+ @extends JUI.Slider
285
+ */
286
+ JUI.Slider = SC.View.extend(JUI.Widget, {
287
+ uiType: 'slider',
288
+ uiOptions: ['value', 'min', 'max', 'step', 'orientation', 'range'],
289
+ uiEvents: ['slide', 'start', 'stop'],
290
+
291
+ slide: function(event, ui) {
292
+ set(this, 'value', ui.value);
293
+ }
294
+ });
295
+
296
+ })({});
297
+
298
+
299
+ (function(exports) {
300
+
301
+ var set = SC.set;
302
+
303
+ /**
304
+ @class
305
+ @since SproutCore JUI 1.0
306
+ @extends JUI.Spinner
307
+ */
308
+ JUI.Spinner = SC.TextField.extend(JUI.Widget, {
309
+ uiType: 'spinner',
310
+ uiOptions: ['value', 'min', 'max', 'step'],
311
+ uiEvents: ['spin', 'start', 'stop'],
312
+ uiMethods: ['pageDown', 'pageUp', 'stepDown', 'stepUp'],
313
+
314
+ spin: function(event, ui) {
315
+ set(this, 'value', ui.value);
316
+ }
317
+ });
318
+
319
+ })({});
320
+
321
+
322
+ (function(exports) {
323
+
324
+ var get = SC.get, set = SC.set, none = SC.none;
325
+
326
+ /**
327
+ @class
328
+ @since SproutCore JUI 1.0
329
+ @extends JUI.ProgressBar
330
+ */
331
+ JUI.ProgressBar = SC.View.extend(JUI.Widget, {
332
+ uiType: 'progressbar',
333
+ uiOptions: ['_value', 'max'],
334
+ uiEvents: ['change', 'complete'],
335
+
336
+ _value: function(key, value) {
337
+ if (!none(value)) {
338
+ set(this, 'value', parseInt(value));
339
+ }
340
+ return parseInt(get(this, 'value'));
341
+ }.property('value').cacheable()
342
+ });
343
+
344
+ })({});
345
+
346
+
347
+ (function(exports) {
348
+
349
+ var get = SC.get;
350
+
351
+ /**
352
+ @class
353
+ @since SproutCore JUI 1.0
354
+ @extends JUI.Menu
355
+ */
356
+ JUI.Menu = SC.CollectionView.extend(JUI.Widget, {
357
+ uiType: 'menu',
358
+ uiEvents: ['select'],
359
+
360
+ tagName: 'ul',
361
+
362
+ arrayDidChange: function(content, start, removed, added) {
363
+ this._super(content, start, removed, added);
364
+
365
+ var ui = get(this, 'ui');
366
+ if (ui) { ui.refresh(); }
367
+ }
368
+ });
369
+
370
+ })({});
371
+
372
+
373
+ (function(exports) {
374
+ /*
375
+ * jQuery UI Dialog Auto Reposition Extension
376
+ *
377
+ * Copyright 2010, Scott González (http://scottgonzalez.com)
378
+ * Dual licensed under the MIT or GPL Version 2 licenses.
379
+ *
380
+ * http://github.com/scottgonzalez/jquery-ui-extensions
381
+ */
382
+
383
+ $.ui.dialog.prototype.options.autoReposition = true;
384
+ jQuery(window).resize(function() {
385
+ $('.ui-dialog-content:visible').each(function() {
386
+ var dialog = $(this).data('dialog');
387
+ if (dialog.options.autoReposition) {
388
+ dialog.option('position', dialog.options.position);
389
+ }
390
+ });
391
+ });
392
+
393
+ })({});
394
+
395
+
396
+ (function(exports) {
397
+
398
+
399
+
400
+ var get = SC.get, set = SC.set;
401
+
402
+ JUI.DialogButton = SC.Object.extend(JUI.TargetSupport, {
403
+ label: 'OK',
404
+ action: 'close',
405
+ executeAction: function() {
406
+ this._super(get(this, 'action'));
407
+ }
408
+ });
409
+
410
+ /**
411
+ @class
412
+ @since SproutCore JUI 1.0
413
+ @extends JUI.Dialog
414
+ */
415
+ JUI.Dialog = SC.View.extend(JUI.Widget, JUI.TargetSupport, {
416
+ uiType: 'dialog',
417
+ uiEvents: ['beforeClose'],
418
+ uiOptions: ['title', '_buttons', 'position', 'closeOnEscape',
419
+ 'modal', 'draggable', 'resizable', 'autoReposition',
420
+ 'width', 'height', 'maxWidth', 'maxHeight', 'minWidth', 'minHeight'],
421
+
422
+ isOpen: false,
423
+ message: '',
424
+ buttons: [],
425
+
426
+ defaultTemplate: SC.Handlebars.compile('<p>{{message}}</p>'),
427
+
428
+ open: function() {
429
+ if (get(this, 'state') !== 'inDOM') {
430
+ this._insertElementLater(SC.K);
431
+ } else {
432
+ get(this, 'ui').open();
433
+ }
434
+ },
435
+
436
+ close: function() {
437
+ get(this, 'ui').close();
438
+ },
439
+
440
+ didInsertElement: function() {
441
+ this._super();
442
+ get(this, 'ui')._bind({
443
+ dialogopen: $.proxy(this._open, this),
444
+ dialogclose: $.proxy(this._close, this)
445
+ });
446
+ },
447
+
448
+ _buttons: function() {
449
+ return get(this, 'buttons').map(this._buildButton, this);
450
+ }.property('buttons').cacheable(),
451
+
452
+ _buildButton: function(buttonPath) {
453
+ var button = this.getPath(buttonPath);
454
+ if (!button.isInstance) {
455
+ button = button.create({
456
+ target: get(this, 'targetObject') || this
457
+ });
458
+ set(this, buttonPath, button);
459
+ }
460
+ var props = {text: get(button, 'label')};
461
+ props.click = $.proxy(button, 'executeAction')
462
+ return props;
463
+ },
464
+
465
+ _open: function() {
466
+ set(this, 'isOpen', true);
467
+ this.didOpenDialog();
468
+ },
469
+
470
+ _close: function() {
471
+ set(this, 'isOpen', false);
472
+ this.didCloseDialog();
473
+ },
474
+
475
+ didOpenDialog: SC.K,
476
+ didCloseDialog: SC.K
477
+ });
478
+
479
+ JUI.Dialog.close = function() {
480
+ $('.ui-dialog-content:visible').dialog('close');
481
+ };
482
+
483
+ JUI.ModalDialog = JUI.Dialog.extend({
484
+ buttons: ['ok'],
485
+ ok: JUI.DialogButton,
486
+ resizable: false,
487
+ draggable: false,
488
+ modal: true
489
+ });
490
+
491
+ JUI.AlertDialog = JUI.ModalDialog.create({
492
+ open: function(message, title, type) {
493
+ set(this, 'title', title);
494
+ set(this, 'message', message);
495
+ set(this, 'icon', type);
496
+ this._super();
497
+ },
498
+ info: function(message, title) {
499
+ this.open(message, title, 'info');
500
+ },
501
+ error: function(message, title) {
502
+ this.open(message, title, 'error');
503
+ }
504
+ });
505
+
506
+ JUI.ConfirmDialog = JUI.ModalDialog.create({
507
+ buttons: ['yes', 'no'],
508
+ yes: JUI.DialogButton.extend({
509
+ label: 'YES',
510
+ action: 'didConfirm'
511
+ }),
512
+ no: JUI.DialogButton.extend({label: 'NO'}),
513
+ didConfirm: function() {
514
+ get(this, 'answer').resolve();
515
+ this.close();
516
+ },
517
+ didCloseDialog: function() {
518
+ var answer = get(this, 'answer');
519
+ if (answer && !answer.isResolved()) {
520
+ answer.reject();
521
+ }
522
+ set(this, 'answer', null);
523
+ },
524
+ open: function(message, title) {
525
+ var answer = SC.$.Deferred();
526
+ set(this, 'answer', answer);
527
+ set(this, 'title', title);
528
+ set(this, 'message', message);
529
+ this._super();
530
+ return answer.promise();
531
+ }
532
+ });
533
+
534
+ })({});
535
+
536
+
537
+ (function(exports) {
538
+
539
+ var get = SC.get, set = SC.set, none = SC.none;
540
+
541
+ /**
542
+ @class
543
+ @since SproutCore JUI 1.0
544
+ @extends JUI.Datepicker
545
+ */
546
+ JUI.Datepicker = SC.TextField.extend(JUI.Widget, {
547
+ uiType: 'datepicker',
548
+ uiOptions: ['dateFormat', 'maxDate', 'minDate', 'defaultDate'],
549
+ uiEvents: ['onSelect'],
550
+
551
+ date: function(key, value) {
552
+ var ui = get(this, 'ui');
553
+ if (!none(value)) {
554
+ ui.setDate(value);
555
+ }
556
+ return ui.getDate();
557
+ }.property('value').cacheable(),
558
+
559
+ open: function() {
560
+ get(this, 'ui').show();
561
+ },
562
+
563
+ close: function() {
564
+ get(this, 'ui').hide();
565
+ },
566
+
567
+ // @private
568
+ uiWidget: function() {
569
+ var datepicker = function(options, elem) {
570
+ return SC.$(elem).datepicker(options).datepicker('widget');
571
+ };
572
+ datepicker.prototype.options = SC.$.datepicker._defaults;
573
+ return datepicker;
574
+ }.property().cacheable(),
575
+
576
+ // @private
577
+ onSelect: function(dateText, ui) {
578
+ this.select();
579
+ },
580
+
581
+ select: SC.K
582
+ });
583
+
584
+ JUI.Datepicker.formatDate = SC.$.datepicker.formatDate;
585
+ JUI.Datepicker.parseDate = SC.$.datepicker.parseDate;
586
+
587
+ })({});
588
+
589
+
590
+ (function(exports) {
591
+
592
+ var get = SC.get, set = SC.set;
593
+
594
+ /**
595
+ @mixin
596
+ @since SproutCore JUI 1.0
597
+ @extends JUI.Tooltip
598
+ */
599
+ JUI.Tooltip = SC.Mixin.create({
600
+ tooltip: '',
601
+ hasTooltip: false,
602
+
603
+ // @private
604
+ toggleTooltip: function() {
605
+ var flag = get(this, 'hasTooltip'),
606
+ ui = get(this, 'tooltipWidget');
607
+ if (flag && !ui) {
608
+ ui = this.$().tooltip({
609
+ content: get(this, 'tooltipTemplate')
610
+ }).tooltip('widget');
611
+ set(this, 'tooltipWidget', ui);
612
+ } else if (ui) {
613
+ ui._destroy();
614
+ }
615
+ }.observes('hasTooltip'),
616
+
617
+ // @private
618
+ tooltipTemplate: function() {
619
+ return SC.Handlebars.compile(get(this, 'tooltip'));
620
+ }.property('tooltip').cacheable()
621
+
622
+ });
623
+
624
+ })({});
625
+
626
+
627
+ (function(exports) {
628
+
629
+ var get = SC.get, set = SC.set;
630
+
631
+ /**
632
+ @class
633
+ @since SproutCore JUI 1.0
634
+ @extends JUI.SortableCollectionView
635
+ */
636
+ JUI.SortableCollectionView = SC.CollectionView.extend(JUI.Widget, {
637
+ uiType: 'sortable',
638
+ uiEvents: ['start', 'stop'],
639
+
640
+ draggedStartPos: null,
641
+
642
+ start: function(event, ui) {
643
+ set(this, 'dragging', true);
644
+ set(this, 'draggedStartPos', ui.item.index());
645
+ },
646
+
647
+ stop: function(event, ui) {
648
+ var oldIdx = get(this, 'draggedStartPos');
649
+ var newIdx = ui.item.index();
650
+ if (oldIdx != newIdx) {
651
+ var content = get(this, 'content');
652
+ content.beginPropertyChanges();
653
+ var el = content.objectAt(oldIdx);
654
+ content.removeAt(oldIdx);
655
+ content.insertAt(newIdx, el);
656
+ content.endPropertyChanges();
657
+ }
658
+ set(this, 'dragging', false);
659
+ },
660
+
661
+ // @private
662
+ // Overriding these to prevent CollectionView from reapplying content array modifications
663
+ arrayWillChange: function(content, start, removedCount, addedCount) {
664
+ if (get(this, 'dragging')) {
665
+ //this._super(content, 0, 0, 0);
666
+ } else {
667
+ this._super(content, start, removedCount, addedCount);
668
+ }
669
+ },
670
+
671
+ // @private
672
+ arrayDidChange: function(content, start, removedCount, addedCount) {
673
+ if (get(this, 'dragging')) {
674
+ //this._super(content, 0, 0, 0);
675
+ } else {
676
+ this._super(content, start, removedCount, addedCount);
677
+ }
678
+ }
679
+ });
680
+
681
+ })({});
682
+
683
+
684
+ (function(exports) {
685
+
686
+ /**
687
+ @class
688
+ @since SproutCore JUI 1.0
689
+ @extends JUI.ResizableView
690
+ */
691
+ JUI.ResizableView = SC.View.extend(JUI.Widget, {
692
+ uiType: 'resizable',
693
+ uiEvents: ['start', 'stop', 'resize'],
694
+ uiOptions: ['aspectRatio', 'maxHeight', 'maxWidth', 'minHeight', 'minWidth', 'containment', 'autoHide']
695
+ });
696
+
697
+ })({});
698
+
699
+
700
+ (function(exports) {
701
+ /*!
702
+ * jQuery UI Throbber
703
+ *
704
+ * Copyright (c) 2011 Paul Chavard
705
+ * Licensed under the MIT license
706
+ *
707
+ * Author: Paul Chavard [paul at chavard dot net]
708
+ * Version: 0.5.0
709
+ *
710
+ * Credits: Felix Gnass [fgnass at neteye dot de]
711
+ *
712
+ */
713
+
714
+ (function($, undefined) {
715
+
716
+ $.widget('ui.throbber', {
717
+ options: {
718
+ segments: 12,
719
+ space: 3,
720
+ length: 7,
721
+ width: 4,
722
+ speed: 1.2,
723
+ align: 'center',
724
+ valign: 'center',
725
+ padding: 4,
726
+ autoStart: false,
727
+ outside: true
728
+ },
729
+
730
+ _create: function() {
731
+ this.options = $.extend({color: this.element.css('color')}, this.options);
732
+ this._prepare();
733
+ if (this.options.autoStart) {
734
+ this._activate();
735
+ }
736
+ },
737
+
738
+ _setOption: function(key, value) {
739
+ this.options[key] = value;
740
+
741
+ if (key === 'disabled') {
742
+ if (this.throbber) {
743
+ clearInterval(this.interval);
744
+ this.throbber.remove();
745
+ }
746
+ if (value === false) {
747
+ this._activate();
748
+ }
749
+ }
750
+
751
+ return this;
752
+ },
753
+
754
+ _activate: function() {
755
+ var options = this.options;
756
+ this.throbber = this._render().css('position', 'absolute').prependTo(options.outside ? 'body' : this.element);
757
+ var h = this.element.outerHeight() - this.throbber.height();
758
+ var w = this.element.outerWidth() - this.throbber.width();
759
+ var margin = {
760
+ top: options.valign == 'top' ? options.padding : options.valign == 'bottom' ? h - options.padding : Math.floor(h / 2),
761
+ left: options.align == 'left' ? options.padding : options.align == 'right' ? w - options.padding : Math.floor(w / 2)
762
+ };
763
+ var offset = this.element.offset();
764
+ if (options.outside) {
765
+ this.throbber.css({top: offset.top + 'px', left: offset.left + 'px'});
766
+ } else {
767
+ margin.top -= this.throbber.offset().top - offset.top;
768
+ margin.left -= this.throbber.offset().left - offset.left;
769
+ }
770
+ this.throbber.css({marginTop: margin.top + 'px', marginLeft: margin.left + 'px'});
771
+ this._animate(options.segments, Math.round(10 / options.speed) / 10);
772
+ },
773
+
774
+ _prepare: function() {
775
+ if ($.ui.throbber.renderMethod) {
776
+ this.renderMethod = $.ui.throbber.renderMethod;
777
+ this.animateMethod = $.ui.throbber.animateMethod;
778
+ return;
779
+ }
780
+ if (document.createElementNS && document.createElementNS( "http://www.w3.org/2000/svg", "svg").createSVGRect) {
781
+ $.ui.throbber.renderMethod = 'SVG';
782
+ if (document.createElement('div').style.WebkitAnimationName !== undefined) {
783
+ $.ui.throbber.animateMethod = 'CSS';
784
+ } else {
785
+ $.ui.throbber.animateMethod = 'SVG';
786
+ }
787
+ } else if (this._prepareVML()) {
788
+ $.ui.throbber.renderMethod = $.ui.throbber.animateMethod = 'VML';
789
+ } else {
790
+ $.ui.throbber.renderMethod = $.ui.throbber.animateMethod = 'DOM';
791
+ }
792
+ this.renderMethod = $.ui.throbber.renderMethod;
793
+ this.animateMethod = $.ui.throbber.animateMethod;
794
+ },
795
+
796
+ _prepareVML: function() {
797
+ var s = $('<shape>').css('behavior', 'url(#default#VML)');
798
+ var ok = false;
799
+ $('body').append(s);
800
+ if (s.get(0).adj) {
801
+ // VML support detected. Insert CSS rules for group, shape and stroke.
802
+ var sheet = document.createStyleSheet();
803
+ $.each(['group', 'shape', 'stroke'], function() {
804
+ sheet.addRule(this, "behavior:url(#default#VML);");
805
+ });
806
+ ok = true;
807
+ }
808
+ $(s).remove();
809
+ return ok;
810
+ },
811
+
812
+ _getOpacity: function(i) {
813
+ var steps = this.options.steps || this.options.segments-1;
814
+ var end = this.options.opacity !== undefined ? this.options.opacity : 1/steps;
815
+ return 1 - Math.min(i, steps) * (1 - end) / steps;
816
+ },
817
+
818
+ _render: function() {
819
+ return this['_render'+this.renderMethod]();
820
+ },
821
+
822
+ _renderDOM: function() {
823
+ return $('<div>').addClass('ui-throbber');
824
+ },
825
+
826
+ _renderSVG: function() {
827
+ var o = this.options;
828
+ var innerRadius = o.width*2 + o.space;
829
+ var r = (innerRadius + o.length + Math.ceil(o.width / 2) + 1);
830
+
831
+ var el = svg().width(r*2).height(r*2);
832
+
833
+ var g = svg('g', {
834
+ 'stroke-width': o.width,
835
+ 'stroke-linecap': 'round',
836
+ stroke: o.color
837
+ }).appendTo(svg('g', {transform: 'translate('+ r +','+ r +')'}).appendTo(el));
838
+
839
+ for (var i = 0; i < o.segments; i++) {
840
+ g.append(svg('line', {
841
+ x1: 0,
842
+ y1: innerRadius,
843
+ x2: 0,
844
+ y2: innerRadius + o.length,
845
+ transform: 'rotate(' + (360 / o.segments * i) + ', 0, 0)',
846
+ opacity: this._getOpacity(i)
847
+ }));
848
+ }
849
+ return $('<div>').append(el).width(2*r).height(2*r);
850
+ },
851
+
852
+ _renderVML: function() {
853
+ var o = this.options;
854
+ var innerRadius = o.width*2 + o.space;
855
+ var r = (innerRadius + o.length + Math.ceil(o.width / 2) + 1);
856
+ var s = r*2;
857
+ var c = -Math.ceil(s/2);
858
+
859
+ var el = $('<group>', {coordsize: s + ' ' + s, coordorigin: c + ' ' + c}).css({top: c, left: c, width: s, height: s});
860
+ for (var i = 0; i < o.segments; i++) {
861
+ el.append($('<shape>', {path: 'm ' + innerRadius + ',0 l ' + (innerRadius + o.length) + ',0'}).css({
862
+ width: s,
863
+ height: s,
864
+ rotation: (360 / o.segments * i) + 'deg'
865
+ }).append($('<stroke>', {color: o.color, weight: o.width + 'px', endcap: 'round', opacity: this._getOpacity(i)})));
866
+ }
867
+ return $('<group>', {coordsize: s + ' ' + s}).css({width: s, height: s, overflow: 'hidden'}).append(el);
868
+ },
869
+
870
+ _animate: function(steps, duration) {
871
+ this['_animate'+this.animateMethod](steps, duration);
872
+ },
873
+
874
+ _animateCSS: function(steps, duration) {
875
+ if (!animations[steps]) {
876
+ var name = 'spin' + steps;
877
+ var rule = '@-webkit-keyframes '+ name +' {';
878
+ for (var i=0; i < steps; i++) {
879
+ var p1 = Math.round(100000 / steps * i) / 1000;
880
+ var p2 = Math.round(100000 / steps * (i+1) - 1) / 1000;
881
+ var value = '% { -webkit-transform:rotate(' + Math.round(360 / steps * i) + 'deg); }\n';
882
+ rule += p1 + value + p2 + value;
883
+ }
884
+ rule += '100% { -webkit-transform:rotate(100deg); }\n}';
885
+ document.styleSheets[0].insertRule(rule);
886
+ animations[steps] = name;
887
+ }
888
+ this.throbber.css('-webkit-animation', animations[steps] + ' ' + duration +'s linear infinite');
889
+ },
890
+
891
+ _animateSVG: function(steps, duration) {
892
+ var rotation = 0;
893
+ var g = this.throbber.find('g g').get(0);
894
+ this.interval = setInterval(function() {
895
+ g.setAttributeNS(null, 'transform', 'rotate(' + (++rotation % steps * (360 / steps)) + ')');
896
+ }, duration * 1000 / steps);
897
+ },
898
+
899
+ _animateVML: function(steps, duration) {
900
+ var rotation = 0;
901
+ var g = this.throbber.get(0);
902
+ this.interval = setInterval(function() {
903
+ g.style.rotation = ++rotation % steps * (360 / steps);
904
+ }, duration * 1000 / steps);
905
+ },
906
+
907
+ _animateDOM: function(steps, duration) {}
908
+
909
+ });
910
+
911
+ /**
912
+ * Utility function to create elements in the SVG namespace.
913
+ */
914
+ function svg(tag, attr) {
915
+ var el = document.createElementNS("http://www.w3.org/2000/svg", tag || 'svg');
916
+ if (attr) {
917
+ $.each(attr, function(k, v) {
918
+ el.setAttributeNS(null, k, v);
919
+ });
920
+ }
921
+ return $(el);
922
+ }
923
+
924
+ var animations = {};
925
+
926
+ })(jQuery);
927
+
928
+ })({});
929
+
930
+
931
+ (function(exports) {
932
+
933
+
934
+ /*
935
+ * JUI.Throbber
936
+ */
937
+
938
+ JUI.Throbber = SC.View.extend(JUI.Widget, {
939
+ uiType: 'throbber',
940
+ uiOptions: ['segments', 'space', 'length', 'width',
941
+ 'speed', 'align', 'valign', 'padding', 'autoStart', 'outside']
942
+ });
943
+
944
+ })({});
945
+
946
+
947
+ (function(exports) {
948
+
949
+
950
+
951
+
952
+
953
+
954
+
955
+
956
+
957
+
958
+
959
+
960
+ })({});
961
+
962
+
963
+ (function(exports) {
964
+ // ==========================================================================
965
+ // Project: SproutCore JUI
966
+ // Copyright: ©2011 Paul Chavard
967
+ // License: Licensed under MIT license (see license.js)
968
+ // ==========================================================================
969
+
970
+ //require('jquery-ui');
971
+
972
+
973
+ })({});