Code Duplication    Length = 686-686 lines in 2 locations

public/lib/semantic/semantic.js 1 location

@@ 8209-8894 (lines=686) @@
8206
 *
8207
 */
8208
8209
;(function ($, window, document, undefined) {
8210
8211
"use strict";
8212
8213
window = (typeof window != 'undefined' && window.Math == Math)
8214
  ? window
8215
  : (typeof self != 'undefined' && self.Math == Math)
8216
    ? self
8217
    : Function('return this')()
8218
;
8219
8220
$.fn.embed = function(parameters) {
8221
8222
  var
8223
    $allModules     = $(this),
8224
8225
    moduleSelector  = $allModules.selector || '',
8226
8227
    time            = new Date().getTime(),
8228
    performance     = [],
8229
8230
    query           = arguments[0],
8231
    methodInvoked   = (typeof query == 'string'),
8232
    queryArguments  = [].slice.call(arguments, 1),
8233
8234
    returnedValue
8235
  ;
8236
8237
  $allModules
8238
    .each(function() {
8239
      var
8240
        settings        = ( $.isPlainObject(parameters) )
8241
          ? $.extend(true, {}, $.fn.embed.settings, parameters)
8242
          : $.extend({}, $.fn.embed.settings),
8243
8244
        selector        = settings.selector,
8245
        className       = settings.className,
8246
        sources         = settings.sources,
8247
        error           = settings.error,
8248
        metadata        = settings.metadata,
8249
        namespace       = settings.namespace,
8250
        templates       = settings.templates,
8251
8252
        eventNamespace  = '.' + namespace,
8253
        moduleNamespace = 'module-' + namespace,
8254
8255
        $window         = $(window),
8256
        $module         = $(this),
8257
        $placeholder    = $module.find(selector.placeholder),
8258
        $icon           = $module.find(selector.icon),
8259
        $embed          = $module.find(selector.embed),
8260
8261
        element         = this,
8262
        instance        = $module.data(moduleNamespace),
8263
        module
8264
      ;
8265
8266
      module = {
8267
8268
        initialize: function() {
8269
          module.debug('Initializing embed');
8270
          module.determine.autoplay();
8271
          module.create();
8272
          module.bind.events();
8273
          module.instantiate();
8274
        },
8275
8276
        instantiate: function() {
8277
          module.verbose('Storing instance of module', module);
8278
          instance = module;
8279
          $module
8280
            .data(moduleNamespace, module)
8281
          ;
8282
        },
8283
8284
        destroy: function() {
8285
          module.verbose('Destroying previous instance of embed');
8286
          module.reset();
8287
          $module
8288
            .removeData(moduleNamespace)
8289
            .off(eventNamespace)
8290
          ;
8291
        },
8292
8293
        refresh: function() {
8294
          module.verbose('Refreshing selector cache');
8295
          $placeholder = $module.find(selector.placeholder);
8296
          $icon        = $module.find(selector.icon);
8297
          $embed       = $module.find(selector.embed);
8298
        },
8299
8300
        bind: {
8301
          events: function() {
8302
            if( module.has.placeholder() ) {
8303
              module.debug('Adding placeholder events');
8304
              $module
8305
                .on('click' + eventNamespace, selector.placeholder, module.createAndShow)
8306
                .on('click' + eventNamespace, selector.icon, module.createAndShow)
8307
              ;
8308
            }
8309
          }
8310
        },
8311
8312
        create: function() {
8313
          var
8314
            placeholder = module.get.placeholder()
8315
          ;
8316
          if(placeholder) {
8317
            module.createPlaceholder();
8318
          }
8319
          else {
8320
            module.createAndShow();
8321
          }
8322
        },
8323
8324
        createPlaceholder: function(placeholder) {
8325
          var
8326
            icon  = module.get.icon(),
8327
            url   = module.get.url(),
8328
            embed = module.generate.embed(url)
8329
          ;
8330
          placeholder = placeholder || module.get.placeholder();
8331
          $module.html( templates.placeholder(placeholder, icon) );
8332
          module.debug('Creating placeholder for embed', placeholder, icon);
8333
        },
8334
8335
        createEmbed: function(url) {
8336
          module.refresh();
8337
          url = url || module.get.url();
8338
          $embed = $('<div/>')
8339
            .addClass(className.embed)
8340
            .html( module.generate.embed(url) )
8341
            .appendTo($module)
8342
          ;
8343
          settings.onCreate.call(element, url);
8344
          module.debug('Creating embed object', $embed);
8345
        },
8346
8347
        changeEmbed: function(url) {
8348
          $embed
8349
            .html( module.generate.embed(url) )
8350
          ;
8351
        },
8352
8353
        createAndShow: function() {
8354
          module.createEmbed();
8355
          module.show();
8356
        },
8357
8358
        // sets new embed
8359
        change: function(source, id, url) {
8360
          module.debug('Changing video to ', source, id, url);
8361
          $module
8362
            .data(metadata.source, source)
8363
            .data(metadata.id, id)
8364
          ;
8365
          if(url) {
8366
            $module.data(metadata.url, url);
8367
          }
8368
          else {
8369
            $module.removeData(metadata.url);
8370
          }
8371
          if(module.has.embed()) {
8372
            module.changeEmbed();
8373
          }
8374
          else {
8375
            module.create();
8376
          }
8377
        },
8378
8379
        // clears embed
8380
        reset: function() {
8381
          module.debug('Clearing embed and showing placeholder');
8382
          module.remove.active();
8383
          module.remove.embed();
8384
          module.showPlaceholder();
8385
          settings.onReset.call(element);
8386
        },
8387
8388
        // shows current embed
8389
        show: function() {
8390
          module.debug('Showing embed');
8391
          module.set.active();
8392
          settings.onDisplay.call(element);
8393
        },
8394
8395
        hide: function() {
8396
          module.debug('Hiding embed');
8397
          module.showPlaceholder();
8398
        },
8399
8400
        showPlaceholder: function() {
8401
          module.debug('Showing placeholder image');
8402
          module.remove.active();
8403
          settings.onPlaceholderDisplay.call(element);
8404
        },
8405
8406
        get: {
8407
          id: function() {
8408
            return settings.id || $module.data(metadata.id);
8409
          },
8410
          placeholder: function() {
8411
            return settings.placeholder || $module.data(metadata.placeholder);
8412
          },
8413
          icon: function() {
8414
            return (settings.icon)
8415
              ? settings.icon
8416
              : ($module.data(metadata.icon) !== undefined)
8417
                ? $module.data(metadata.icon)
8418
                : module.determine.icon()
8419
            ;
8420
          },
8421
          source: function(url) {
8422
            return (settings.source)
8423
              ? settings.source
8424
              : ($module.data(metadata.source) !== undefined)
8425
                ? $module.data(metadata.source)
8426
                : module.determine.source()
8427
            ;
8428
          },
8429
          type: function() {
8430
            var source = module.get.source();
8431
            return (sources[source] !== undefined)
8432
              ? sources[source].type
8433
              : false
8434
            ;
8435
          },
8436
          url: function() {
8437
            return (settings.url)
8438
              ? settings.url
8439
              : ($module.data(metadata.url) !== undefined)
8440
                ? $module.data(metadata.url)
8441
                : module.determine.url()
8442
            ;
8443
          }
8444
        },
8445
8446
        determine: {
8447
          autoplay: function() {
8448
            if(module.should.autoplay()) {
8449
              settings.autoplay = true;
8450
            }
8451
          },
8452
          source: function(url) {
8453
            var
8454
              matchedSource = false
8455
            ;
8456
            url = url || module.get.url();
8457
            if(url) {
8458
              $.each(sources, function(name, source) {
8459
                if(url.search(source.domain) !== -1) {
8460
                  matchedSource = name;
8461
                  return false;
8462
                }
8463
              });
8464
            }
8465
            return matchedSource;
8466
          },
8467
          icon: function() {
8468
            var
8469
              source = module.get.source()
8470
            ;
8471
            return (sources[source] !== undefined)
8472
              ? sources[source].icon
8473
              : false
8474
            ;
8475
          },
8476
          url: function() {
8477
            var
8478
              id     = settings.id     || $module.data(metadata.id),
8479
              source = settings.source || $module.data(metadata.source),
8480
              url
8481
            ;
8482
            url = (sources[source] !== undefined)
8483
              ? sources[source].url.replace('{id}', id)
8484
              : false
8485
            ;
8486
            if(url) {
8487
              $module.data(metadata.url, url);
8488
            }
8489
            return url;
8490
          }
8491
        },
8492
8493
8494
        set: {
8495
          active: function() {
8496
            $module.addClass(className.active);
8497
          }
8498
        },
8499
8500
        remove: {
8501
          active: function() {
8502
            $module.removeClass(className.active);
8503
          },
8504
          embed: function() {
8505
            $embed.empty();
8506
          }
8507
        },
8508
8509
        encode: {
8510
          parameters: function(parameters) {
8511
            var
8512
              urlString = [],
8513
              index
8514
            ;
8515
            for (index in parameters) {
8516
              urlString.push( encodeURIComponent(index) + '=' + encodeURIComponent( parameters[index] ) );
8517
            }
8518
            return urlString.join('&amp;');
8519
          }
8520
        },
8521
8522
        generate: {
8523
          embed: function(url) {
8524
            module.debug('Generating embed html');
8525
            var
8526
              source = module.get.source(),
8527
              html,
8528
              parameters
8529
            ;
8530
            url = module.get.url(url);
8531
            if(url) {
8532
              parameters = module.generate.parameters(source);
8533
              html       = templates.iframe(url, parameters);
8534
            }
8535
            else {
8536
              module.error(error.noURL, $module);
8537
            }
8538
            return html;
8539
          },
8540
          parameters: function(source, extraParameters) {
8541
            var
8542
              parameters = (sources[source] && sources[source].parameters !== undefined)
8543
                ? sources[source].parameters(settings)
8544
                : {}
8545
            ;
8546
            extraParameters = extraParameters || settings.parameters;
8547
            if(extraParameters) {
8548
              parameters = $.extend({}, parameters, extraParameters);
8549
            }
8550
            parameters = settings.onEmbed(parameters);
8551
            return module.encode.parameters(parameters);
8552
          }
8553
        },
8554
8555
        has: {
8556
          embed: function() {
8557
            return ($embed.length > 0);
8558
          },
8559
          placeholder: function() {
8560
            return settings.placeholder || $module.data(metadata.placeholder);
8561
          }
8562
        },
8563
8564
        should: {
8565
          autoplay: function() {
8566
            return (settings.autoplay === 'auto')
8567
              ? (settings.placeholder || $module.data(metadata.placeholder) !== undefined)
8568
              : settings.autoplay
8569
            ;
8570
          }
8571
        },
8572
8573
        is: {
8574
          video: function() {
8575
            return module.get.type() == 'video';
8576
          }
8577
        },
8578
8579
        setting: function(name, value) {
8580
          module.debug('Changing setting', name, value);
8581
          if( $.isPlainObject(name) ) {
8582
            $.extend(true, settings, name);
8583
          }
8584
          else if(value !== undefined) {
8585
            if($.isPlainObject(settings[name])) {
8586
              $.extend(true, settings[name], value);
8587
            }
8588
            else {
8589
              settings[name] = value;
8590
            }
8591
          }
8592
          else {
8593
            return settings[name];
8594
          }
8595
        },
8596
        internal: function(name, value) {
8597
          if( $.isPlainObject(name) ) {
8598
            $.extend(true, module, name);
8599
          }
8600
          else if(value !== undefined) {
8601
            module[name] = value;
8602
          }
8603
          else {
8604
            return module[name];
8605
          }
8606
        },
8607
        debug: function() {
8608
          if(!settings.silent && settings.debug) {
8609
            if(settings.performance) {
8610
              module.performance.log(arguments);
8611
            }
8612
            else {
8613
              module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
8614
              module.debug.apply(console, arguments);
8615
            }
8616
          }
8617
        },
8618
        verbose: function() {
8619
          if(!settings.silent && settings.verbose && settings.debug) {
8620
            if(settings.performance) {
8621
              module.performance.log(arguments);
8622
            }
8623
            else {
8624
              module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
8625
              module.verbose.apply(console, arguments);
8626
            }
8627
          }
8628
        },
8629
        error: function() {
8630
          if(!settings.silent) {
8631
            module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
8632
            module.error.apply(console, arguments);
8633
          }
8634
        },
8635
        performance: {
8636
          log: function(message) {
8637
            var
8638
              currentTime,
8639
              executionTime,
8640
              previousTime
8641
            ;
8642
            if(settings.performance) {
8643
              currentTime   = new Date().getTime();
8644
              previousTime  = time || currentTime;
8645
              executionTime = currentTime - previousTime;
8646
              time          = currentTime;
8647
              performance.push({
8648
                'Name'           : message[0],
8649
                'Arguments'      : [].slice.call(message, 1) || '',
8650
                'Element'        : element,
8651
                'Execution Time' : executionTime
8652
              });
8653
            }
8654
            clearTimeout(module.performance.timer);
8655
            module.performance.timer = setTimeout(module.performance.display, 500);
8656
          },
8657
          display: function() {
8658
            var
8659
              title = settings.name + ':',
8660
              totalTime = 0
8661
            ;
8662
            time = false;
8663
            clearTimeout(module.performance.timer);
8664
            $.each(performance, function(index, data) {
8665
              totalTime += data['Execution Time'];
8666
            });
8667
            title += ' ' + totalTime + 'ms';
8668
            if(moduleSelector) {
8669
              title += ' \'' + moduleSelector + '\'';
8670
            }
8671
            if($allModules.length > 1) {
8672
              title += ' ' + '(' + $allModules.length + ')';
8673
            }
8674
            if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
8675
              console.groupCollapsed(title);
8676
              if(console.table) {
8677
                console.table(performance);
8678
              }
8679
              else {
8680
                $.each(performance, function(index, data) {
8681
                  console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
8682
                });
8683
              }
8684
              console.groupEnd();
8685
            }
8686
            performance = [];
8687
          }
8688
        },
8689
        invoke: function(query, passedArguments, context) {
8690
          var
8691
            object = instance,
8692
            maxDepth,
8693
            found,
8694
            response
8695
          ;
8696
          passedArguments = passedArguments || queryArguments;
8697
          context         = element         || context;
8698
          if(typeof query == 'string' && object !== undefined) {
8699
            query    = query.split(/[\. ]/);
8700
            maxDepth = query.length - 1;
8701
            $.each(query, function(depth, value) {
8702
              var camelCaseValue = (depth != maxDepth)
8703
                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
8704
                : query
8705
              ;
8706
              if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
8707
                object = object[camelCaseValue];
8708
              }
8709
              else if( object[camelCaseValue] !== undefined ) {
8710
                found = object[camelCaseValue];
8711
                return false;
8712
              }
8713
              else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
8714
                object = object[value];
8715
              }
8716
              else if( object[value] !== undefined ) {
8717
                found = object[value];
8718
                return false;
8719
              }
8720
              else {
8721
                module.error(error.method, query);
8722
                return false;
8723
              }
8724
            });
8725
          }
8726
          if ( $.isFunction( found ) ) {
8727
            response = found.apply(context, passedArguments);
8728
          }
8729
          else if(found !== undefined) {
8730
            response = found;
8731
          }
8732
          if($.isArray(returnedValue)) {
8733
            returnedValue.push(response);
8734
          }
8735
          else if(returnedValue !== undefined) {
8736
            returnedValue = [returnedValue, response];
8737
          }
8738
          else if(response !== undefined) {
8739
            returnedValue = response;
8740
          }
8741
          return found;
8742
        }
8743
      };
8744
8745
      if(methodInvoked) {
8746
        if(instance === undefined) {
8747
          module.initialize();
8748
        }
8749
        module.invoke(query);
8750
      }
8751
      else {
8752
        if(instance !== undefined) {
8753
          instance.invoke('destroy');
8754
        }
8755
        module.initialize();
8756
      }
8757
    })
8758
  ;
8759
  return (returnedValue !== undefined)
8760
    ? returnedValue
8761
    : this
8762
  ;
8763
};
8764
8765
$.fn.embed.settings = {
8766
8767
  name        : 'Embed',
8768
  namespace   : 'embed',
8769
8770
  silent      : false,
8771
  debug       : false,
8772
  verbose     : false,
8773
  performance : true,
8774
8775
  icon     : false,
8776
  source   : false,
8777
  url      : false,
8778
  id       : false,
8779
8780
  // standard video settings
8781
  autoplay  : 'auto',
8782
  color     : '#444444',
8783
  hd        : true,
8784
  brandedUI : false,
8785
8786
  // additional parameters to include with the embed
8787
  parameters: false,
8788
8789
  onDisplay            : function() {},
8790
  onPlaceholderDisplay : function() {},
8791
  onReset              : function() {},
8792
  onCreate             : function(url) {},
8793
  onEmbed              : function(parameters) {
8794
    return parameters;
8795
  },
8796
8797
  metadata    : {
8798
    id          : 'id',
8799
    icon        : 'icon',
8800
    placeholder : 'placeholder',
8801
    source      : 'source',
8802
    url         : 'url'
8803
  },
8804
8805
  error : {
8806
    noURL  : 'No URL specified',
8807
    method : 'The method you called is not defined'
8808
  },
8809
8810
  className : {
8811
    active : 'active',
8812
    embed  : 'embed'
8813
  },
8814
8815
  selector : {
8816
    embed       : '.embed',
8817
    placeholder : '.placeholder',
8818
    icon        : '.icon'
8819
  },
8820
8821
  sources: {
8822
    youtube: {
8823
      name   : 'youtube',
8824
      type   : 'video',
8825
      icon   : 'video play',
8826
      domain : 'youtube.com',
8827
      url    : '//www.youtube.com/embed/{id}',
8828
      parameters: function(settings) {
8829
        return {
8830
          autohide       : !settings.brandedUI,
8831
          autoplay       : settings.autoplay,
8832
          color          : settings.color || undefined,
8833
          hq             : settings.hd,
8834
          jsapi          : settings.api,
8835
          modestbranding : !settings.brandedUI
8836
        };
8837
      }
8838
    },
8839
    vimeo: {
8840
      name   : 'vimeo',
8841
      type   : 'video',
8842
      icon   : 'video play',
8843
      domain : 'vimeo.com',
8844
      url    : '//player.vimeo.com/video/{id}',
8845
      parameters: function(settings) {
8846
        return {
8847
          api      : settings.api,
8848
          autoplay : settings.autoplay,
8849
          byline   : settings.brandedUI,
8850
          color    : settings.color || undefined,
8851
          portrait : settings.brandedUI,
8852
          title    : settings.brandedUI
8853
        };
8854
      }
8855
    }
8856
  },
8857
8858
  templates: {
8859
    iframe : function(url, parameters) {
8860
      var src = url;
8861
      if (parameters) {
8862
          src += '?' + parameters;
8863
      }
8864
      return ''
8865
        + '<iframe src="' + src + '"'
8866
        + ' width="100%" height="100%"'
8867
        + ' frameborder="0" scrolling="no" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>'
8868
      ;
8869
    },
8870
    placeholder : function(image, icon) {
8871
      var
8872
        html = ''
8873
      ;
8874
      if(icon) {
8875
        html += '<i class="' + icon + ' icon"></i>';
8876
      }
8877
      if(image) {
8878
        html += '<img class="placeholder" src="' + image + '">';
8879
      }
8880
      return html;
8881
    }
8882
  },
8883
8884
  // NOT YET IMPLEMENTED
8885
  api     : false,
8886
  onPause : function() {},
8887
  onPlay  : function() {},
8888
  onStop  : function() {}
8889
8890
};
8891
8892
8893
8894
})( jQuery, window, document );
8895
8896
/*!
8897
 * # Semantic UI 2.2.11 - Modal

public/lib/semantic/components/embed.js 1 location

@@ 11-696 (lines=686) @@
8
 *
9
 */
10
11
;(function ($, window, document, undefined) {
12
13
"use strict";
14
15
window = (typeof window != 'undefined' && window.Math == Math)
16
  ? window
17
  : (typeof self != 'undefined' && self.Math == Math)
18
    ? self
19
    : Function('return this')()
20
;
21
22
$.fn.embed = function(parameters) {
23
24
  var
25
    $allModules     = $(this),
26
27
    moduleSelector  = $allModules.selector || '',
28
29
    time            = new Date().getTime(),
30
    performance     = [],
31
32
    query           = arguments[0],
33
    methodInvoked   = (typeof query == 'string'),
34
    queryArguments  = [].slice.call(arguments, 1),
35
36
    returnedValue
37
  ;
38
39
  $allModules
40
    .each(function() {
41
      var
42
        settings        = ( $.isPlainObject(parameters) )
43
          ? $.extend(true, {}, $.fn.embed.settings, parameters)
44
          : $.extend({}, $.fn.embed.settings),
45
46
        selector        = settings.selector,
47
        className       = settings.className,
48
        sources         = settings.sources,
49
        error           = settings.error,
50
        metadata        = settings.metadata,
51
        namespace       = settings.namespace,
52
        templates       = settings.templates,
53
54
        eventNamespace  = '.' + namespace,
55
        moduleNamespace = 'module-' + namespace,
56
57
        $window         = $(window),
58
        $module         = $(this),
59
        $placeholder    = $module.find(selector.placeholder),
60
        $icon           = $module.find(selector.icon),
61
        $embed          = $module.find(selector.embed),
62
63
        element         = this,
64
        instance        = $module.data(moduleNamespace),
65
        module
66
      ;
67
68
      module = {
69
70
        initialize: function() {
71
          module.debug('Initializing embed');
72
          module.determine.autoplay();
73
          module.create();
74
          module.bind.events();
75
          module.instantiate();
76
        },
77
78
        instantiate: function() {
79
          module.verbose('Storing instance of module', module);
80
          instance = module;
81
          $module
82
            .data(moduleNamespace, module)
83
          ;
84
        },
85
86
        destroy: function() {
87
          module.verbose('Destroying previous instance of embed');
88
          module.reset();
89
          $module
90
            .removeData(moduleNamespace)
91
            .off(eventNamespace)
92
          ;
93
        },
94
95
        refresh: function() {
96
          module.verbose('Refreshing selector cache');
97
          $placeholder = $module.find(selector.placeholder);
98
          $icon        = $module.find(selector.icon);
99
          $embed       = $module.find(selector.embed);
100
        },
101
102
        bind: {
103
          events: function() {
104
            if( module.has.placeholder() ) {
105
              module.debug('Adding placeholder events');
106
              $module
107
                .on('click' + eventNamespace, selector.placeholder, module.createAndShow)
108
                .on('click' + eventNamespace, selector.icon, module.createAndShow)
109
              ;
110
            }
111
          }
112
        },
113
114
        create: function() {
115
          var
116
            placeholder = module.get.placeholder()
117
          ;
118
          if(placeholder) {
119
            module.createPlaceholder();
120
          }
121
          else {
122
            module.createAndShow();
123
          }
124
        },
125
126
        createPlaceholder: function(placeholder) {
127
          var
128
            icon  = module.get.icon(),
129
            url   = module.get.url(),
130
            embed = module.generate.embed(url)
131
          ;
132
          placeholder = placeholder || module.get.placeholder();
133
          $module.html( templates.placeholder(placeholder, icon) );
134
          module.debug('Creating placeholder for embed', placeholder, icon);
135
        },
136
137
        createEmbed: function(url) {
138
          module.refresh();
139
          url = url || module.get.url();
140
          $embed = $('<div/>')
141
            .addClass(className.embed)
142
            .html( module.generate.embed(url) )
143
            .appendTo($module)
144
          ;
145
          settings.onCreate.call(element, url);
146
          module.debug('Creating embed object', $embed);
147
        },
148
149
        changeEmbed: function(url) {
150
          $embed
151
            .html( module.generate.embed(url) )
152
          ;
153
        },
154
155
        createAndShow: function() {
156
          module.createEmbed();
157
          module.show();
158
        },
159
160
        // sets new embed
161
        change: function(source, id, url) {
162
          module.debug('Changing video to ', source, id, url);
163
          $module
164
            .data(metadata.source, source)
165
            .data(metadata.id, id)
166
          ;
167
          if(url) {
168
            $module.data(metadata.url, url);
169
          }
170
          else {
171
            $module.removeData(metadata.url);
172
          }
173
          if(module.has.embed()) {
174
            module.changeEmbed();
175
          }
176
          else {
177
            module.create();
178
          }
179
        },
180
181
        // clears embed
182
        reset: function() {
183
          module.debug('Clearing embed and showing placeholder');
184
          module.remove.active();
185
          module.remove.embed();
186
          module.showPlaceholder();
187
          settings.onReset.call(element);
188
        },
189
190
        // shows current embed
191
        show: function() {
192
          module.debug('Showing embed');
193
          module.set.active();
194
          settings.onDisplay.call(element);
195
        },
196
197
        hide: function() {
198
          module.debug('Hiding embed');
199
          module.showPlaceholder();
200
        },
201
202
        showPlaceholder: function() {
203
          module.debug('Showing placeholder image');
204
          module.remove.active();
205
          settings.onPlaceholderDisplay.call(element);
206
        },
207
208
        get: {
209
          id: function() {
210
            return settings.id || $module.data(metadata.id);
211
          },
212
          placeholder: function() {
213
            return settings.placeholder || $module.data(metadata.placeholder);
214
          },
215
          icon: function() {
216
            return (settings.icon)
217
              ? settings.icon
218
              : ($module.data(metadata.icon) !== undefined)
219
                ? $module.data(metadata.icon)
220
                : module.determine.icon()
221
            ;
222
          },
223
          source: function(url) {
224
            return (settings.source)
225
              ? settings.source
226
              : ($module.data(metadata.source) !== undefined)
227
                ? $module.data(metadata.source)
228
                : module.determine.source()
229
            ;
230
          },
231
          type: function() {
232
            var source = module.get.source();
233
            return (sources[source] !== undefined)
234
              ? sources[source].type
235
              : false
236
            ;
237
          },
238
          url: function() {
239
            return (settings.url)
240
              ? settings.url
241
              : ($module.data(metadata.url) !== undefined)
242
                ? $module.data(metadata.url)
243
                : module.determine.url()
244
            ;
245
          }
246
        },
247
248
        determine: {
249
          autoplay: function() {
250
            if(module.should.autoplay()) {
251
              settings.autoplay = true;
252
            }
253
          },
254
          source: function(url) {
255
            var
256
              matchedSource = false
257
            ;
258
            url = url || module.get.url();
259
            if(url) {
260
              $.each(sources, function(name, source) {
261
                if(url.search(source.domain) !== -1) {
262
                  matchedSource = name;
263
                  return false;
264
                }
265
              });
266
            }
267
            return matchedSource;
268
          },
269
          icon: function() {
270
            var
271
              source = module.get.source()
272
            ;
273
            return (sources[source] !== undefined)
274
              ? sources[source].icon
275
              : false
276
            ;
277
          },
278
          url: function() {
279
            var
280
              id     = settings.id     || $module.data(metadata.id),
281
              source = settings.source || $module.data(metadata.source),
282
              url
283
            ;
284
            url = (sources[source] !== undefined)
285
              ? sources[source].url.replace('{id}', id)
286
              : false
287
            ;
288
            if(url) {
289
              $module.data(metadata.url, url);
290
            }
291
            return url;
292
          }
293
        },
294
295
296
        set: {
297
          active: function() {
298
            $module.addClass(className.active);
299
          }
300
        },
301
302
        remove: {
303
          active: function() {
304
            $module.removeClass(className.active);
305
          },
306
          embed: function() {
307
            $embed.empty();
308
          }
309
        },
310
311
        encode: {
312
          parameters: function(parameters) {
313
            var
314
              urlString = [],
315
              index
316
            ;
317
            for (index in parameters) {
318
              urlString.push( encodeURIComponent(index) + '=' + encodeURIComponent( parameters[index] ) );
319
            }
320
            return urlString.join('&amp;');
321
          }
322
        },
323
324
        generate: {
325
          embed: function(url) {
326
            module.debug('Generating embed html');
327
            var
328
              source = module.get.source(),
329
              html,
330
              parameters
331
            ;
332
            url = module.get.url(url);
333
            if(url) {
334
              parameters = module.generate.parameters(source);
335
              html       = templates.iframe(url, parameters);
336
            }
337
            else {
338
              module.error(error.noURL, $module);
339
            }
340
            return html;
341
          },
342
          parameters: function(source, extraParameters) {
343
            var
344
              parameters = (sources[source] && sources[source].parameters !== undefined)
345
                ? sources[source].parameters(settings)
346
                : {}
347
            ;
348
            extraParameters = extraParameters || settings.parameters;
349
            if(extraParameters) {
350
              parameters = $.extend({}, parameters, extraParameters);
351
            }
352
            parameters = settings.onEmbed(parameters);
353
            return module.encode.parameters(parameters);
354
          }
355
        },
356
357
        has: {
358
          embed: function() {
359
            return ($embed.length > 0);
360
          },
361
          placeholder: function() {
362
            return settings.placeholder || $module.data(metadata.placeholder);
363
          }
364
        },
365
366
        should: {
367
          autoplay: function() {
368
            return (settings.autoplay === 'auto')
369
              ? (settings.placeholder || $module.data(metadata.placeholder) !== undefined)
370
              : settings.autoplay
371
            ;
372
          }
373
        },
374
375
        is: {
376
          video: function() {
377
            return module.get.type() == 'video';
378
          }
379
        },
380
381
        setting: function(name, value) {
382
          module.debug('Changing setting', name, value);
383
          if( $.isPlainObject(name) ) {
384
            $.extend(true, settings, name);
385
          }
386
          else if(value !== undefined) {
387
            if($.isPlainObject(settings[name])) {
388
              $.extend(true, settings[name], value);
389
            }
390
            else {
391
              settings[name] = value;
392
            }
393
          }
394
          else {
395
            return settings[name];
396
          }
397
        },
398
        internal: function(name, value) {
399
          if( $.isPlainObject(name) ) {
400
            $.extend(true, module, name);
401
          }
402
          else if(value !== undefined) {
403
            module[name] = value;
404
          }
405
          else {
406
            return module[name];
407
          }
408
        },
409
        debug: function() {
410
          if(!settings.silent && settings.debug) {
411
            if(settings.performance) {
412
              module.performance.log(arguments);
413
            }
414
            else {
415
              module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
416
              module.debug.apply(console, arguments);
417
            }
418
          }
419
        },
420
        verbose: function() {
421
          if(!settings.silent && settings.verbose && settings.debug) {
422
            if(settings.performance) {
423
              module.performance.log(arguments);
424
            }
425
            else {
426
              module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
427
              module.verbose.apply(console, arguments);
428
            }
429
          }
430
        },
431
        error: function() {
432
          if(!settings.silent) {
433
            module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
434
            module.error.apply(console, arguments);
435
          }
436
        },
437
        performance: {
438
          log: function(message) {
439
            var
440
              currentTime,
441
              executionTime,
442
              previousTime
443
            ;
444
            if(settings.performance) {
445
              currentTime   = new Date().getTime();
446
              previousTime  = time || currentTime;
447
              executionTime = currentTime - previousTime;
448
              time          = currentTime;
449
              performance.push({
450
                'Name'           : message[0],
451
                'Arguments'      : [].slice.call(message, 1) || '',
452
                'Element'        : element,
453
                'Execution Time' : executionTime
454
              });
455
            }
456
            clearTimeout(module.performance.timer);
457
            module.performance.timer = setTimeout(module.performance.display, 500);
458
          },
459
          display: function() {
460
            var
461
              title = settings.name + ':',
462
              totalTime = 0
463
            ;
464
            time = false;
465
            clearTimeout(module.performance.timer);
466
            $.each(performance, function(index, data) {
467
              totalTime += data['Execution Time'];
468
            });
469
            title += ' ' + totalTime + 'ms';
470
            if(moduleSelector) {
471
              title += ' \'' + moduleSelector + '\'';
472
            }
473
            if($allModules.length > 1) {
474
              title += ' ' + '(' + $allModules.length + ')';
475
            }
476
            if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
477
              console.groupCollapsed(title);
478
              if(console.table) {
479
                console.table(performance);
480
              }
481
              else {
482
                $.each(performance, function(index, data) {
483
                  console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
484
                });
485
              }
486
              console.groupEnd();
487
            }
488
            performance = [];
489
          }
490
        },
491
        invoke: function(query, passedArguments, context) {
492
          var
493
            object = instance,
494
            maxDepth,
495
            found,
496
            response
497
          ;
498
          passedArguments = passedArguments || queryArguments;
499
          context         = element         || context;
500
          if(typeof query == 'string' && object !== undefined) {
501
            query    = query.split(/[\. ]/);
502
            maxDepth = query.length - 1;
503
            $.each(query, function(depth, value) {
504
              var camelCaseValue = (depth != maxDepth)
505
                ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
506
                : query
507
              ;
508
              if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
509
                object = object[camelCaseValue];
510
              }
511
              else if( object[camelCaseValue] !== undefined ) {
512
                found = object[camelCaseValue];
513
                return false;
514
              }
515
              else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
516
                object = object[value];
517
              }
518
              else if( object[value] !== undefined ) {
519
                found = object[value];
520
                return false;
521
              }
522
              else {
523
                module.error(error.method, query);
524
                return false;
525
              }
526
            });
527
          }
528
          if ( $.isFunction( found ) ) {
529
            response = found.apply(context, passedArguments);
530
          }
531
          else if(found !== undefined) {
532
            response = found;
533
          }
534
          if($.isArray(returnedValue)) {
535
            returnedValue.push(response);
536
          }
537
          else if(returnedValue !== undefined) {
538
            returnedValue = [returnedValue, response];
539
          }
540
          else if(response !== undefined) {
541
            returnedValue = response;
542
          }
543
          return found;
544
        }
545
      };
546
547
      if(methodInvoked) {
548
        if(instance === undefined) {
549
          module.initialize();
550
        }
551
        module.invoke(query);
552
      }
553
      else {
554
        if(instance !== undefined) {
555
          instance.invoke('destroy');
556
        }
557
        module.initialize();
558
      }
559
    })
560
  ;
561
  return (returnedValue !== undefined)
562
    ? returnedValue
563
    : this
564
  ;
565
};
566
567
$.fn.embed.settings = {
568
569
  name        : 'Embed',
570
  namespace   : 'embed',
571
572
  silent      : false,
573
  debug       : false,
574
  verbose     : false,
575
  performance : true,
576
577
  icon     : false,
578
  source   : false,
579
  url      : false,
580
  id       : false,
581
582
  // standard video settings
583
  autoplay  : 'auto',
584
  color     : '#444444',
585
  hd        : true,
586
  brandedUI : false,
587
588
  // additional parameters to include with the embed
589
  parameters: false,
590
591
  onDisplay            : function() {},
592
  onPlaceholderDisplay : function() {},
593
  onReset              : function() {},
594
  onCreate             : function(url) {},
595
  onEmbed              : function(parameters) {
596
    return parameters;
597
  },
598
599
  metadata    : {
600
    id          : 'id',
601
    icon        : 'icon',
602
    placeholder : 'placeholder',
603
    source      : 'source',
604
    url         : 'url'
605
  },
606
607
  error : {
608
    noURL  : 'No URL specified',
609
    method : 'The method you called is not defined'
610
  },
611
612
  className : {
613
    active : 'active',
614
    embed  : 'embed'
615
  },
616
617
  selector : {
618
    embed       : '.embed',
619
    placeholder : '.placeholder',
620
    icon        : '.icon'
621
  },
622
623
  sources: {
624
    youtube: {
625
      name   : 'youtube',
626
      type   : 'video',
627
      icon   : 'video play',
628
      domain : 'youtube.com',
629
      url    : '//www.youtube.com/embed/{id}',
630
      parameters: function(settings) {
631
        return {
632
          autohide       : !settings.brandedUI,
633
          autoplay       : settings.autoplay,
634
          color          : settings.color || undefined,
635
          hq             : settings.hd,
636
          jsapi          : settings.api,
637
          modestbranding : !settings.brandedUI
638
        };
639
      }
640
    },
641
    vimeo: {
642
      name   : 'vimeo',
643
      type   : 'video',
644
      icon   : 'video play',
645
      domain : 'vimeo.com',
646
      url    : '//player.vimeo.com/video/{id}',
647
      parameters: function(settings) {
648
        return {
649
          api      : settings.api,
650
          autoplay : settings.autoplay,
651
          byline   : settings.brandedUI,
652
          color    : settings.color || undefined,
653
          portrait : settings.brandedUI,
654
          title    : settings.brandedUI
655
        };
656
      }
657
    }
658
  },
659
660
  templates: {
661
    iframe : function(url, parameters) {
662
      var src = url;
663
      if (parameters) {
664
          src += '?' + parameters;
665
      }
666
      return ''
667
        + '<iframe src="' + src + '"'
668
        + ' width="100%" height="100%"'
669
        + ' frameborder="0" scrolling="no" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>'
670
      ;
671
    },
672
    placeholder : function(image, icon) {
673
      var
674
        html = ''
675
      ;
676
      if(icon) {
677
        html += '<i class="' + icon + ' icon"></i>';
678
      }
679
      if(image) {
680
        html += '<img class="placeholder" src="' + image + '">';
681
      }
682
      return html;
683
    }
684
  },
685
686
  // NOT YET IMPLEMENTED
687
  api     : false,
688
  onPause : function() {},
689
  onPlay  : function() {},
690
  onStop  : function() {}
691
692
};
693
694
695
696
})( jQuery, window, document );
697