1/* 2 * blueimp Gallery Vimeo Video Factory JS 3 * https://github.com/blueimp/Gallery 4 * 5 * Copyright 2013, Sebastian Tschan 6 * https://blueimp.net 7 * 8 * Licensed under the MIT license: 9 * https://opensource.org/licenses/MIT 10 */ 11 12/* global define, window, document, $f */ 13 14;(function (factory) { 15 'use strict' 16 if (typeof define === 'function' && define.amd) { 17 // Register as an anonymous AMD module: 18 define([ 19 './blueimp-helper', 20 './blueimp-gallery-video' 21 ], factory) 22 } else { 23 // Browser globals: 24 factory( 25 window.blueimp.helper || window.jQuery, 26 window.blueimp.Gallery 27 ) 28 } 29}(function ($, Gallery) { 30 'use strict' 31 32 if (!window.postMessage) { 33 return Gallery 34 } 35 36 $.extend(Gallery.prototype.options, { 37 // The list object property (or data attribute) with the Vimeo video id: 38 vimeoVideoIdProperty: 'vimeo', 39 // The URL for the Vimeo video player, can be extended with custom parameters: 40 // https://developer.vimeo.com/player/embedding 41 vimeoPlayerUrl: '//player.vimeo.com/video/VIDEO_ID?api=1&player_id=PLAYER_ID', 42 // The prefix for the Vimeo video player ID: 43 vimeoPlayerIdPrefix: 'vimeo-player-', 44 // Require a click on the native Vimeo player for the initial playback: 45 vimeoClickToPlay: true 46 }) 47 48 var textFactory = Gallery.prototype.textFactory || 49 Gallery.prototype.imageFactory 50 var VimeoPlayer = function (url, videoId, playerId, clickToPlay) { 51 this.url = url 52 this.videoId = videoId 53 this.playerId = playerId 54 this.clickToPlay = clickToPlay 55 this.element = document.createElement('div') 56 this.listeners = {} 57 } 58 var counter = 0 59 60 $.extend(VimeoPlayer.prototype, { 61 canPlayType: function () { 62 return true 63 }, 64 65 on: function (type, func) { 66 this.listeners[type] = func 67 return this 68 }, 69 70 loadAPI: function () { 71 var that = this 72 var apiUrl = '//f.vimeocdn.com/js/froogaloop2.min.js' 73 var scriptTags = document.getElementsByTagName('script') 74 var i = scriptTags.length 75 var scriptTag 76 var called 77 function callback () { 78 if (!called && that.playOnReady) { 79 that.play() 80 } 81 called = true 82 } 83 while (i) { 84 i -= 1 85 if (scriptTags[i].src === apiUrl) { 86 scriptTag = scriptTags[i] 87 break 88 } 89 } 90 if (!scriptTag) { 91 scriptTag = document.createElement('script') 92 scriptTag.src = apiUrl 93 } 94 $(scriptTag).on('load', callback) 95 scriptTags[0].parentNode.insertBefore(scriptTag, scriptTags[0]) 96 // Fix for cached scripts on IE 8: 97 if (/loaded|complete/.test(scriptTag.readyState)) { 98 callback() 99 } 100 }, 101 102 onReady: function () { 103 var that = this 104 this.ready = true 105 this.player.addEvent('play', function () { 106 that.hasPlayed = true 107 that.onPlaying() 108 }) 109 this.player.addEvent('pause', function () { 110 that.onPause() 111 }) 112 this.player.addEvent('finish', function () { 113 that.onPause() 114 }) 115 if (this.playOnReady) { 116 this.play() 117 } 118 }, 119 120 onPlaying: function () { 121 if (this.playStatus < 2) { 122 this.listeners.playing() 123 this.playStatus = 2 124 } 125 }, 126 127 onPause: function () { 128 this.listeners.pause() 129 delete this.playStatus 130 }, 131 132 insertIframe: function () { 133 var iframe = document.createElement('iframe') 134 iframe.src = this.url 135 .replace('VIDEO_ID', this.videoId) 136 .replace('PLAYER_ID', this.playerId) 137 iframe.id = this.playerId 138 this.element.parentNode.replaceChild(iframe, this.element) 139 this.element = iframe 140 }, 141 142 play: function () { 143 var that = this 144 if (!this.playStatus) { 145 this.listeners.play() 146 this.playStatus = 1 147 } 148 if (this.ready) { 149 if (!this.hasPlayed && (this.clickToPlay || (window.navigator && 150 /iP(hone|od|ad)/.test(window.navigator.platform)))) { 151 // Manually trigger the playing callback if clickToPlay 152 // is enabled and to workaround a limitation in iOS, 153 // which requires synchronous user interaction to start 154 // the video playback: 155 this.onPlaying() 156 } else { 157 this.player.api('play') 158 } 159 } else { 160 this.playOnReady = true 161 if (!window.$f) { 162 this.loadAPI() 163 } else if (!this.player) { 164 this.insertIframe() 165 this.player = $f(this.element) 166 this.player.addEvent('ready', function () { 167 that.onReady() 168 }) 169 } 170 } 171 }, 172 173 pause: function () { 174 if (this.ready) { 175 this.player.api('pause') 176 } else if (this.playStatus) { 177 delete this.playOnReady 178 this.listeners.pause() 179 delete this.playStatus 180 } 181 } 182 183 }) 184 185 $.extend(Gallery.prototype, { 186 VimeoPlayer: VimeoPlayer, 187 188 textFactory: function (obj, callback) { 189 var options = this.options 190 var videoId = this.getItemProperty(obj, options.vimeoVideoIdProperty) 191 if (videoId) { 192 if (this.getItemProperty(obj, options.urlProperty) === undefined) { 193 obj[options.urlProperty] = '//vimeo.com/' + videoId 194 } 195 counter += 1 196 return this.videoFactory( 197 obj, 198 callback, 199 new VimeoPlayer( 200 options.vimeoPlayerUrl, 201 videoId, 202 options.vimeoPlayerIdPrefix + counter, 203 options.vimeoClickToPlay 204 ) 205 ) 206 } 207 return textFactory.call(this, obj, callback) 208 } 209 210 }) 211 212 return Gallery 213}))
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.