webshims-rails 1.12.5 → 1.12.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/lib/webshims-rails/version.rb +2 -2
  3. data/vendor/assets/javascripts/webshims/polyfiller.js +111 -132
  4. data/vendor/assets/javascripts/webshims/shims/combos/1.js +40 -37
  5. data/vendor/assets/javascripts/webshims/shims/combos/10.js +217 -36
  6. data/vendor/assets/javascripts/webshims/shims/combos/11.js +151 -29
  7. data/vendor/assets/javascripts/webshims/shims/combos/12.js +70 -93
  8. data/vendor/assets/javascripts/webshims/shims/combos/13.js +70 -93
  9. data/vendor/assets/javascripts/webshims/shims/combos/14.js +90 -13
  10. data/vendor/assets/javascripts/webshims/shims/combos/15.js +202 -59
  11. data/vendor/assets/javascripts/webshims/shims/combos/16.js +208 -70
  12. data/vendor/assets/javascripts/webshims/shims/combos/17.js +151 -29
  13. data/vendor/assets/javascripts/webshims/shims/combos/18.js +155 -30
  14. data/vendor/assets/javascripts/webshims/shims/combos/19.js +79 -20
  15. data/vendor/assets/javascripts/webshims/shims/combos/2.js +109 -47
  16. data/vendor/assets/javascripts/webshims/shims/combos/20.js +79 -20
  17. data/vendor/assets/javascripts/webshims/shims/combos/21.js +80 -87
  18. data/vendor/assets/javascripts/webshims/shims/combos/22.js +66 -83
  19. data/vendor/assets/javascripts/webshims/shims/combos/23.js +4 -10
  20. data/vendor/assets/javascripts/webshims/shims/combos/25.js +79 -20
  21. data/vendor/assets/javascripts/webshims/shims/combos/26.js +66 -7
  22. data/vendor/assets/javascripts/webshims/shims/combos/28.js +100 -25
  23. data/vendor/assets/javascripts/webshims/shims/combos/3.js +192 -47
  24. data/vendor/assets/javascripts/webshims/shims/combos/30.js +193 -49
  25. data/vendor/assets/javascripts/webshims/shims/combos/31.js +103 -36
  26. data/vendor/assets/javascripts/webshims/shims/combos/32.js +5 -3
  27. data/vendor/assets/javascripts/webshims/shims/combos/33.js +1 -2
  28. data/vendor/assets/javascripts/webshims/shims/combos/34.js +2048 -0
  29. data/vendor/assets/javascripts/webshims/shims/combos/4.js +156 -20
  30. data/vendor/assets/javascripts/webshims/shims/combos/5.js +151 -29
  31. data/vendor/assets/javascripts/webshims/shims/combos/6.js +152 -31
  32. data/vendor/assets/javascripts/webshims/shims/combos/7.js +199 -60
  33. data/vendor/assets/javascripts/webshims/shims/combos/8.js +197 -58
  34. data/vendor/assets/javascripts/webshims/shims/combos/9.js +218 -38
  35. data/vendor/assets/javascripts/webshims/shims/combos/97.js +1004 -0
  36. data/vendor/assets/javascripts/webshims/shims/combos/98.js +1283 -0
  37. data/vendor/assets/javascripts/webshims/shims/combos/99.js +204 -1248
  38. data/vendor/assets/javascripts/webshims/shims/dom-extend.js +66 -7
  39. data/vendor/assets/javascripts/webshims/shims/es5.js +4 -1
  40. data/vendor/assets/javascripts/webshims/shims/form-combat.js +3 -3
  41. data/vendor/assets/javascripts/webshims/shims/form-core.js +36 -27
  42. data/vendor/assets/javascripts/webshims/shims/form-datalist.js +1 -2
  43. data/vendor/assets/javascripts/webshims/shims/form-fixrangechange.js +137 -0
  44. data/vendor/assets/javascripts/webshims/shims/form-message.js +90 -13
  45. data/vendor/assets/javascripts/webshims/shims/form-number-date-ui.js +129 -15
  46. data/vendor/assets/javascripts/webshims/shims/form-shim-extend.js +9 -10
  47. data/vendor/assets/javascripts/webshims/shims/form-shim-extend2.js +886 -985
  48. data/vendor/assets/javascripts/webshims/shims/form-validation.js +78 -174
  49. data/vendor/assets/javascripts/webshims/shims/form-validators.js +39 -26
  50. data/vendor/assets/javascripts/webshims/shims/forms-picker.js +45 -17
  51. data/vendor/assets/javascripts/webshims/shims/geolocation.js +10 -3
  52. data/vendor/assets/javascripts/webshims/shims/jme/b.js +71 -246
  53. data/vendor/assets/javascripts/webshims/shims/jme/c.js +133 -1002
  54. data/vendor/assets/javascripts/webshims/shims/jme/controls.css +62 -23
  55. data/vendor/assets/javascripts/webshims/shims/jme/controls.scss +73 -10
  56. data/vendor/assets/javascripts/webshims/shims/jme/mediacontrols-lazy.js +1117 -0
  57. data/vendor/assets/javascripts/webshims/shims/jme/p.js +603 -0
  58. data/vendor/assets/javascripts/webshims/shims/jpicker/jpicker.css +5 -2
  59. data/vendor/assets/javascripts/webshims/shims/mediaelement-core.js +4 -10
  60. data/vendor/assets/javascripts/webshims/shims/mediaelement-jaris.js +4 -1
  61. data/vendor/assets/javascripts/webshims/shims/range-ui.js +22 -14
  62. data/vendor/assets/javascripts/webshims/shims/styles/forms-ext.css +29 -344
  63. data/vendor/assets/javascripts/webshims/shims/styles/forms-picker.css +362 -0
  64. data/vendor/assets/javascripts/webshims/shims/styles/scss/forms-ext.scss +6 -483
  65. data/vendor/assets/javascripts/webshims/shims/styles/scss/forms-picker.scss +488 -0
  66. data/vendor/assets/javascripts/webshims/shims/styles/scss/shim-ext.scss +2 -0
  67. data/vendor/assets/javascripts/webshims/shims/styles/scss/shim.scss +10 -2
  68. data/vendor/assets/javascripts/webshims/shims/styles/shim.css +6 -2
  69. data/vendor/assets/javascripts/webshims/shims/swf/JarisFLVPlayer.swf +0 -0
  70. data/vendor/assets/javascripts/webshims/shims/track-ui.js +8 -1
  71. data/vendor/assets/javascripts/webshims/shims/track.js +66 -83
  72. metadata +12 -5
  73. data/vendor/assets/javascripts/webshims/shims/$ajax.js +0 -862
  74. data/vendor/assets/javascripts/webshims/shims/combos/24.js +0 -2087
@@ -0,0 +1,603 @@
1
+ webshims.ready('jme DOM', function(){
2
+ "use strict";
3
+ var webshims = window.webshims;
4
+ var $ = webshims.$;
5
+ var jme = $.jme;
6
+ var listId = 0;
7
+ var btnStructure = '<button class="{%class%}" type="button" aria-label="{%text%}"></button>';
8
+
9
+ function PlaylistList(data){
10
+ this._data = data;
11
+ this.lists = {};
12
+
13
+ this.on('showcontrolschange', this._updateControlsClass);
14
+ }
15
+
16
+ $.extend(PlaylistList.prototype, {
17
+ on: function(){
18
+ $.fn.on.apply($(this), arguments);
19
+ },
20
+ off: function(){
21
+ $.fn.off.apply($(this), arguments);
22
+ },
23
+ _getListId: function(list){
24
+ var id;
25
+ if(typeof list == 'string'){
26
+ id = list;
27
+ } else {
28
+ id = list.id;
29
+ }
30
+ return id;
31
+ },
32
+ _updateControlsClass: function(){
33
+ this._data.player[this.getShowcontrolsList() ? 'addClass' : 'removeClass']('has-playlist');
34
+ },
35
+ add: function(list, opts){
36
+
37
+ list = new Playlist(list, this, opts);
38
+ if(!list.id){
39
+ listId++;
40
+ list.id = 'list-'+listId;
41
+ }
42
+ this.lists[list.id] = list;
43
+
44
+ if(list.options.showcontrols){
45
+ this._data.player.addClass('has-playlist');
46
+ }
47
+
48
+ return list;
49
+ },
50
+ remove: function(list){
51
+ var id = this._getListId(list);
52
+ if(this.lists[id]){
53
+ this.lists[id]._remove();
54
+ delete this.lists[id];
55
+ }
56
+ if(!this.getShowcontrolsList()){
57
+ this._data.player.removeClass('has-playlist');
58
+ }
59
+ },
60
+ getAutoplayList: function(){
61
+ var clist = null;
62
+ $.each(this.lists, function(id, list){
63
+ if(list.options.autoplay){
64
+ clist = list;
65
+ return false;
66
+ }
67
+ });
68
+ return clist;
69
+ },
70
+ getShowcontrolsList: function(){
71
+ var clist = null;
72
+ $.each(this.lists, function(id, list){
73
+ if(list.options.showcontrols){
74
+ clist = list;
75
+ return false;
76
+ }
77
+ });
78
+ return clist;
79
+ }
80
+
81
+ });
82
+
83
+ function Playlist(list, parent, opts){
84
+ this.list = list || [];
85
+ this.playlists = parent;
86
+ this.media = parent._data.media;
87
+ this.player = parent._data.player;
88
+ this.options = $.extend(true, {}, Playlist.defaults, opts);
89
+ this.options.itemTmpl = this.options.itemTmpl.trim();
90
+
91
+ this.deferred = $.Deferred();
92
+ this._selectedIndex = -1;
93
+ this._selectedItem = null;
94
+ this.$rendered = null;
95
+
96
+ this._detectListType();
97
+
98
+ this.autoplay(this.options.autoplay);
99
+
100
+ this.deferred.done(function(){
101
+ this._addEvents(this);
102
+ if(this.options.defaultSelected == 'auto' && !this.media.jmeProp('srces').length){
103
+ this.options.defaultSelected = 0;
104
+ }
105
+ if(this.list[this.options.defaultSelected]){
106
+ this.selectedIndex(this.options.defaultSelected);
107
+ }
108
+ this._fire('addlist');
109
+ });
110
+ }
111
+
112
+ Playlist.getText = function($elem){
113
+ return $elem.attr('content') || ($elem.text() || '').trim();
114
+ };
115
+ Playlist.getUrl = function($elem){
116
+ return $elem.attr('content') || $elem.attr('url') || $elem.attr('href') || $elem.attr('src') || ($elem.text() || '').trim();
117
+ };
118
+
119
+ Playlist.defaults = {
120
+ loop: false,
121
+ autoplay: false,
122
+ defaultSelected: 'auto',
123
+ addItemEvents: true,
124
+ showcontrols: true,
125
+ ajax: {},
126
+ itemTmpl: '<li class="list-item">' +
127
+ '<% if(typeof poster == "string" && poster) {%><img src="<%=poster%>" /><% }%>' +
128
+ '<h3><%=title%></h3>' +
129
+ '<% if(typeof description == "string" && description) {%><div class="item-description"><%=description%></div><% }%>' +
130
+ '</li>',
131
+ renderer: function(item, template){
132
+ return $.jme.tmpl(template, item);
133
+ },
134
+ mapDom: function(element){
135
+
136
+ return {
137
+ title: Playlist.getText($('[itemprop="name"], h1, h2, h3, h4, h5, h6, a', element)),
138
+ srces: $('[itemprop="contentUrl"], a[type^="video"], a[type^="audio"]', element).map(function(){
139
+ var tmp;
140
+ var src = {src: Playlist.getUrl($(this))};
141
+ if(this.nodeName.toLowerCase() == 'a'){
142
+ tmp = $.prop(this, 'type');
143
+ } else {
144
+ tmp = Playlist.getText($('[itemprop="encodingFormat"]', element));
145
+ }
146
+ if(tmp){
147
+ src.type = tmp;
148
+ }
149
+ tmp = $.attr(this, 'data-media');
150
+ if(tmp){
151
+ src.media = tmp;
152
+ }
153
+ return src;
154
+ }).get(),
155
+ tracks: $('a[type="text/vtt"]').map(mapTrackUrl).get(),
156
+ poster: Playlist.getUrl($('[itemprop="thumbnailUrl"], a[type^="image"], img', element)) || null,
157
+ description: Playlist.getText($('[itemprop="description"], .item-description, p', element)) || null
158
+ };
159
+ },
160
+ mapUrl: function(opts, callback){
161
+ $.ajax($.extend(opts, {
162
+ success: function(data){
163
+ var list;
164
+ if($.isArray(data)){
165
+ list = data;
166
+ } else if(data.responseData && data.responseData.feed){
167
+ data = data.responseData.feed;
168
+ list = (data.entries || []).map(mapJsonFeed);
169
+ } else {
170
+ list = [];
171
+ $('item', data).each(function(){
172
+ var srces = $('enclosure, media\\:content', this)
173
+ .filter('[type^="video"], [type^="audio"]')
174
+ .map(mapUrl)
175
+ .get()
176
+ ;
177
+ if(srces.length){
178
+ list.push({
179
+ title: $('title', this).html(),
180
+ srces: srces,
181
+ publishedDate: $('pubDate', this).html() || null,
182
+ description: $('description', this).text() || null,
183
+ poster: Playlist.getUrl($('itunes\\:image, media\\:thumbnail, enclosure[type^="image"], media\\:content[type^="image"]', this)) || null,
184
+ author: $('itunes\\:author', this).html() || null,
185
+ duration: $('itunes\\:duration', this).html() || null,
186
+ tracks: $('media\\:subTitle', this).map(mapTrackUrl).get() || null
187
+ });
188
+ }
189
+ });
190
+ }
191
+ if(list != data){
192
+ list.fullData = data;
193
+ }
194
+ callback(list);
195
+ }
196
+ }));
197
+ }
198
+ };
199
+
200
+ function mapJsonFeed(item){
201
+ item.description = item.description || item.content;
202
+ item.srces = [];
203
+ (item.mediaGroups || []).forEach(function(mediagroup){
204
+ (mediagroup.contents || []).forEach(function(itemSrc){
205
+ itemSrc.src = itemSrc.src || itemSrc.url;
206
+ item.srces.push(itemSrc);
207
+ });
208
+ });
209
+ return item;
210
+ }
211
+
212
+ function mapTrackUrl(){
213
+ return {
214
+ src: $.attr(this, 'href'),
215
+ srclang: $.attr(this, 'lang'),
216
+ label: $.attr(this, 'data-label')
217
+ };
218
+ }
219
+
220
+ function mapUrl(){
221
+ return {
222
+ src: $.attr(this, 'url') || $.attr(this, 'href'),
223
+ type: $.attr(this, 'type')
224
+ };
225
+ }
226
+
227
+ function filterNode(){
228
+ return this.nodeType == 1;
229
+ }
230
+
231
+ $.extend(Playlist.prototype, {
232
+ on: function(){
233
+ $.fn.on.apply($(this), arguments);
234
+ },
235
+ off: function(){
236
+ $.fn.off.apply($(this), arguments);
237
+ },
238
+ _detectListType: function(){
239
+ var fullData;
240
+ if(typeof this.list == 'string'){
241
+ this._createListFromUrl();
242
+ return;
243
+ }
244
+ if(this.list.nodeName || (this.list.length > 0 && this.list[0].nodeName)){
245
+ this._createListFromDom();
246
+ } else if(this.list.responseData && this.list.responseData.feed){
247
+ fullData = this.list.responseData.feed;
248
+ this.list = (fullData.entries || []).map(mapJsonFeed);
249
+ this.list.fullData = fullData;
250
+ }
251
+ this.deferred.resolveWith(this);
252
+
253
+ },
254
+ _createListFromUrl: function(){
255
+ var that = this;
256
+ this.options.ajax.url = this.list;
257
+ this.options.mapUrl(this.options.ajax, function(list){
258
+ that.list = list;
259
+ that.deferred.resolveWith(that);
260
+ });
261
+ },
262
+ _createListFromDom: function(){
263
+ var that = this;
264
+
265
+ this.$rendered = $(this.list).eq(0);
266
+ this.list = [];
267
+
268
+ if(this.$rendered){
269
+ this._addDomList();
270
+ this.list = this.$rendered.children().map(function(){
271
+ return that._createItemFromDom(this);
272
+ }).get();
273
+ }
274
+ },
275
+ _createItemFromDom: function(dom){
276
+ var item = this.options.mapDom(dom);
277
+ this._addItemData(item, dom);
278
+ return item;
279
+ },
280
+ _fire: function(evt, extra){
281
+ var evt = $.Event(evt);
282
+ $(this).triggerHandler(evt, extra);
283
+ $(this.playlists).triggerHandler(evt, $.merge([{list: this}], extra || []));
284
+ if(this.$rendered){
285
+ this.$rendered.triggerHandler(evt, extra);
286
+ }
287
+ },
288
+ _addDomList: function(){
289
+ this.$rendered
290
+ .attr({
291
+ 'data-autoplay': this.options.autoplay,
292
+ 'data-loop': this.options.loop
293
+ })
294
+ .addClass('media-playlist')
295
+ .data('playlist', this)
296
+ ;
297
+ },
298
+ _addItemData: function(item, dom){
299
+ var that = this;
300
+ item.$item = $(dom).data('itemData', item);
301
+
302
+ if(item == this._selectedItem){
303
+ item.$item.addClass('selected-item');
304
+ }
305
+ if(this.options.addItemEvents){
306
+ item.$item.on('click.playlist', function(e){
307
+ if(that.options.addItemEvents){
308
+ that.playItem(item, e);
309
+ return false;
310
+ }
311
+ });
312
+ }
313
+ },
314
+ _addEvents: function(that){
315
+ var o = that.options;
316
+ var onEnded = function(e){
317
+ if(o.autoplay){
318
+ that.playNext(e);
319
+ }
320
+ };
321
+ this.media.on('ended', onEnded);
322
+ this._remove = function(){
323
+ that.media.off('ended', onEnded);
324
+ that.autoplay(false);
325
+
326
+ if(that.$rendered){
327
+ that.$rendered.remove();
328
+ }
329
+
330
+ that._fire('removelist');
331
+ };
332
+ },
333
+ _remove: function(){
334
+ this._fire('removelist');
335
+ },
336
+ render: function(callback){
337
+ if(this.$rendered){
338
+ callback(this.$rendered, this.player, this);
339
+ } else {
340
+ this.deferred.done(function(){
341
+ var nodeName;
342
+ var that = this;
343
+ var items = [];
344
+ if(!this.$rendered){
345
+ $.each(this.list, function(i, item){
346
+ var domItem = $($.parseHTML(that.options.renderer(item, that.options.itemTmpl))).filter(filterNode)[0];
347
+ that._addItemData(item, domItem);
348
+ items.push(domItem);
349
+ });
350
+ nodeName = (items[0] && items[0].nodeName || '').toLowerCase();
351
+
352
+ switch (nodeName){
353
+ case 'li':
354
+ this.$rendered = $.parseHTML('<ul />');
355
+ break;
356
+ case 'option':
357
+ this.$rendered = $.parseHTML('<select />');
358
+ break;
359
+ default:
360
+ this.$rendered = $.parseHTML('<div />');
361
+ break;
362
+ }
363
+ this.$rendered = $(this.$rendered).html(items);
364
+ this._addDomList();
365
+ }
366
+ callback(this.$rendered, this.player, this);
367
+ });
368
+ }
369
+ },
370
+ /*
371
+
372
+ addItem: function(item, pos){
373
+
374
+ },
375
+ removeItem: function(item){
376
+
377
+ },
378
+ */
379
+ _loadItem: function(item){
380
+ var media = this.media;
381
+ media.attr('poster', item.poster || '');
382
+
383
+ $('track', media).remove();
384
+
385
+ $.each(item.tracks || [], function(i, track){
386
+ $('<track />').attr(track).appendTo(media);
387
+ });
388
+
389
+ media.jmeProp('srces', item.srces);
390
+ },
391
+ _getItem: function(item){
392
+ if(item && (item.nodeName || item.jquery || typeof item == 'string')){
393
+ item = $(item).data('itemData');
394
+ }
395
+ return item;
396
+ },
397
+ playItem: function(item, e){
398
+ var media;
399
+ this.selectedItem(item, e);
400
+ if(item){
401
+ media = this.media.play();
402
+ setTimeout(function(){
403
+ media.play();
404
+ }, 9);
405
+ }
406
+ },
407
+ selectedIndex: function(index, e){
408
+ if(arguments.length){
409
+ this.selectedItem(this.list[index], e);
410
+ } else {
411
+ return this._selectedIndex;
412
+ }
413
+ },
414
+
415
+ selectedItem: function(item, e){
416
+ var oldItem, found;
417
+
418
+ if(arguments.length){
419
+ found = -1;
420
+ item = this._getItem(item);
421
+ if(item){
422
+ $.each(this.list, function(i){
423
+ if(item == this){
424
+ found = i;
425
+ return false;
426
+ }
427
+ });
428
+ }
429
+
430
+ if(found >= 0){
431
+ this._loadItem(this.list[found]);
432
+ }
433
+
434
+ if(found != this._selectedIndex){
435
+ oldItem = this._selectedItem || null;
436
+ if(oldItem && oldItem.$item){
437
+ oldItem.$item.removeClass('selected-item');
438
+ }
439
+ this._selectedItem = this.list[found] || null;
440
+ this._selectedIndex = found;
441
+ if(this._selectedItem && this._selectedItem.$item){
442
+ this._selectedItem.$item.addClass('selected-item');
443
+ }
444
+ if(oldItem !== this._selectedItem){
445
+ this._fire('itemchange', [{oldItem: oldItem, from: e || null}]);
446
+ }
447
+ }
448
+
449
+ } else {
450
+ return this._selectedItem;
451
+ }
452
+ },
453
+ playNext: function(){
454
+ var item = this.getNext();
455
+ if(item){
456
+ this.playItem(item);
457
+ }
458
+ },
459
+ playPrev: function(){
460
+ var item = this.getPrev();
461
+ if(item){
462
+ this.playItem(item);
463
+ }
464
+ },
465
+ getNext: function(){
466
+ var index = this._selectedIndex + 1;
467
+ return this.list[index] || (this.options.loop ? this.list[0] : null);
468
+ },
469
+ getPrev: function(){
470
+ var index = this._selectedIndex - 1;
471
+ return this.list[index] || (this.options.loop ? this.list[this.list.length - 1] : null);
472
+ }
473
+ });
474
+
475
+ [{name: 'autoplay', fn: 'getAutoplayList'}, {name: 'showcontrols', fn: 'getShowcontrolsList'}, {name: 'loop'}].forEach(function(desc){
476
+ Playlist.prototype[desc.name] = function(value){
477
+ var curList;
478
+ if(arguments.length){
479
+ value = !!value;
480
+
481
+ if(value && desc.fn){
482
+ curList = this.playlists[desc.fn]();
483
+ if(curList && curList != this){
484
+ curList[desc.name](false);
485
+ }
486
+ }
487
+
488
+ if(this.options[desc.name] != value){
489
+ this.options[desc.name] = value;
490
+ if(this.$rendered){
491
+ this.$rendered.attr('data-'+desc.name, value);
492
+ }
493
+ this._fire(desc.name+'change');
494
+ }
495
+ } else {
496
+ return this.options[desc.name];
497
+ }
498
+ }
499
+ });
500
+
501
+ jme.defineProp('playlists', {
502
+ writable: false,
503
+ get: function(elem){
504
+ var data = $.jme.data(elem);
505
+
506
+ if(elem != data.player[0]){return null;}
507
+ if(!data.playlists){
508
+ data.playlists = new PlaylistList(data);
509
+ }
510
+ return data.playlists;
511
+ }
512
+ });
513
+
514
+ jme.defineMethod('addPlaylist', function(list, options){
515
+ var playlists = $.jme.prop(this, 'playlists');
516
+ if(playlists && playlists.add){
517
+ return playlists.add(list, options);
518
+ }
519
+ return null;
520
+ });
521
+
522
+ [
523
+ {name: 'playlist-prev', text: 'previous', get: 'getPrev', play: 'playPrev'},
524
+ {name: 'playlist-next', text: 'next', get: 'getNext', play: 'playNext'}
525
+ ]
526
+ .forEach(function(desc){
527
+ $.jme.registerPlugin(desc.name, {
528
+ structure: btnStructure,
529
+ text: desc.text,
530
+ _create: function(control, media, base){
531
+ var cList;
532
+ var playlists = base.jmeProp('playlists');
533
+
534
+ function itemChange(){
535
+ var item = cList[desc.get]();
536
+ if(item){
537
+ control.prop({'disabled': false, title: item.title});
538
+ } else {
539
+ control.prop({'disabled': true, title: ''});
540
+ }
541
+ }
542
+
543
+ function listchange(){
544
+ var newClist = playlists.getShowcontrolsList();
545
+ if(newClist != cList){
546
+ if(cList){
547
+ cList.off('itemchange', itemChange);
548
+ }
549
+ cList = newClist;
550
+ if(cList){
551
+ cList.on('itemchange', itemChange);
552
+ itemChange();
553
+ }
554
+ }
555
+ }
556
+
557
+ control.on('click', function(){
558
+ if(cList){
559
+ cList[desc.play]();
560
+ }
561
+ });
562
+
563
+ playlists.on({
564
+ 'addlist removelist showcontrolschange':listchange
565
+ });
566
+ listchange();
567
+ }
568
+ });
569
+ })
570
+ ;
571
+
572
+
573
+ // Simple JavaScript Templating
574
+ (function() {
575
+ var cache = {};
576
+ $.jme.tmpl = function tmpl(str, data) {
577
+ // Figure out if we're getting a template, or if we need to
578
+ // load the template - and be sure to cache the result.
579
+ if(!cache[str]){
580
+ cache[str] = new Function("obj",
581
+ "var p=[],print=function(){p.push.apply(p,arguments);};" +
582
+
583
+ // Introduce the data as local variables using with(){}
584
+ "with(obj){p.push('" +
585
+
586
+ // Convert the template into pure JavaScript
587
+ str.replace(/[\r\t\n]/g, " ")
588
+ .replace(/'(?=[^%]*%>)/g,"\t")
589
+ .split("'").join("\\'")
590
+ .split("\t").join("'")
591
+ .replace(/<%=(.+?)%>/g, "',$1,'")
592
+ .split("<%").join("');")
593
+ .split("%>").join("p.push('")
594
+ + "');}return p.join('');");
595
+ }
596
+
597
+ // Provide some basic currying to the user
598
+ return data ? cache[str](data) : cache[str];
599
+ };
600
+ })();
601
+ $.jme.Playlist = Playlist;
602
+ webshims.isReady('playlist', true);
603
+ });