1(function ($) { 2 /*jslint undef: false, browser: true, devel: false, eqeqeq: false, bitwise: false, white: false, plusplus: false, regexp: false, nomen: false */ 3 /*global jQuery,setTimeout,projekktor,location,setInterval,YT,clearInterval */ 4 5 $.pixelentity = $.pixelentity || {version: '1.0.0'}; 6 7 function SimplePlayer(target,w,h,sources,poster) { 8 9 var video; 10 11 12 function play() { 13 video[0].play(); 14 } 15 16 video = $('<video autoplay controls="controls" preload="none" autobuffer height="'+h+'" width="'+w+'" poster="'+(poster ? poster : "")+'"></video>'); 17 for (var i in sources) { 18 if (typeof i === "string") { 19 video.append('<source src="'+sources[i].src+'" type="'+sources[i].type+'">'); 20 } 21 } 22 video.bind("click",play); 23 24 target.append(video); 25 setTimeout(ready,100); 26 27 function ready() { 28 video.triggerHandler("ready"); 29 video.triggerHandler("buffer"); 30 } 31 32 33 function destroy() { 34 video 35 .unbind("click",play) 36 .detach() 37 .empty(); 38 video = undefined; 39 } 40 41 function addListener(type,listener) { 42 video.bind(type,listener); 43 } 44 45 function removeListener(type,listener) { 46 video.unbind(type,listener); 47 } 48 49 $.extend(this, { 50 destroy: destroy, 51 addListener: addListener, 52 removeListener: removeListener 53 }); 54 55 } 56 57 58 $.pixelentity.video = { 59 conf: { 60 disableFade: false, 61 useVideoTag: false 62 }, 63 getType: function(src) { 64 return 'video/'+src.match(/(\w+)$/)[1].replace("ogv","ogg"); 65 }, 66 fallbackPlayer: "js/template/video/jarisplayer.swf", 67 SimplePlayer: SimplePlayer 68 }; 69 70 var iDev = navigator.userAgent.toLowerCase().match(/(iphone|ipod|ipad|android)/); 71 var instances = 0; 72 73 function PeVideo(t, conf) { 74 var jthis = $(this); 75 var target = t; 76 var player; 77 var checkTimer; 78 var ready = false; 79 80 function start() { 81 switch (conf.type) { 82 case "youtube": 83 $.pixelentity.youtube(youtubePlayerReady); 84 break; 85 case "vimeo": 86 $.pixelentity.vimeo(vimeoPlayerReady); 87 break; 88 case "vidly": 89 localVideo([ 90 "http://vid.ly/"+conf.videoId+"?content=video&format=mp4", 91 "http://vid.ly/"+conf.videoId+"?content=video&format=webm", 92 "http://vid.ly/"+conf.videoId+"?content=video&format=ogv" 93 ],conf.poster); 94 break; 95 case "local": 96 localVideo(conf.videoId,conf.poster); 97 break; 98 } 99 } 100 101 function localVideo(srcs,poster) { 102 103 var video = {}; 104 105 for (var i=0;i<srcs.length;i++) { 106 video[i] = { 107 src: srcs[i], 108 type: $.pixelentity.video.getType(srcs[i]) 109 }; 110 } 111 112 if (conf.useVideoTag) { 113 player = new $.pixelentity.video.SimplePlayer(target,conf.width,conf.height,video,poster); 114 } else { 115 116 instances++; 117 var id = 'pe_local_player_'+(instances); 118 var vid = $('<div id="'+(id)+'"/>').css({ 119 "background-color": "black", 120 "width": conf.width, 121 "height": conf.height 122 }); 123 target.html(vid[0]); 124 125 player = new projekktor("#"+id, { 126 disableFade: conf.disableFade, 127 controls: true, 128 volume: 0.9, 129 _width: conf.width, 130 _height: conf.height, 131 _autoplay: true, 132 enableFullscreen: false, 133 imageScaling: "fill", 134 videoScaling: "aspectratio", 135 //_plugins: ['Display', 'Controlbar'], 136 poster: poster, 137 playerFlashMP4: $.pixelentity.video.fallbackPlayer, 138 playerFlashMP3: $.pixelentity.video.fallbackPlayer, 139 playlist: [video] 140 }); 141 142 143 } 144 145 player.addListener(iDev ? 'ready' : 'buffer',localVideoBuffer); 146 147 } 148 149 function localVideoBuffer(value) { 150 if (iDev) { 151 setTimeout(fireReadyEvent,100); 152 player.removeListener('ready',localVideoBuffer); 153 } else if (value == "FULL" || conf.useVideoTag) { 154 player.removeListener('buffer',localVideoBuffer); 155 fireReadyEvent(); 156 } 157 } 158 159 function youtubePlayerReady(ytplayer) { 160 var div=$("<div/>"); 161 target.append(div); 162 player = new ytplayer(div[0], { 163 height: conf.height, 164 width: conf.width, 165 videoId: conf.videoId, 166 playerVars: { 167 theme: "dark", 168 wmode: "opaque", 169 autohide: 1, 170 enablejsapi: 1, 171 origin: location.href.match(/:\/\/(.[^\/]+)/)[1], 172 loop: conf.loop ? 1 : 0, 173 hd: conf.hd ? 1 : 0, 174 autoplay: conf.autoPlay ? 1 : 0, 175 showinfo:0, 176 iv_load_policy:3, 177 modestbranding:1, 178 showsearch:0, 179 fs:0 180 }, 181 events: { 182 'onStateChange': ytStateChange, 183 'onReady': fireReadyEvent 184 } 185 }); 186 player.peUseHD = conf.hd; 187 checkTimer = setInterval(ytStateChange,250); 188 if ($.browser.msie && $.browser.version < 8) { 189 setTimeout(fireReadyEvent,1000); 190 } 191 } 192 193 function fireReadyEvent() { 194 if (!ready) { 195 jthis.trigger("video_ready.pixelentity"); 196 ready = true; 197 } 198 } 199 200 function vimeoPlayerReady(vimeoplayer) { 201 player = new vimeoplayer(target[0], { 202 height: conf.height, 203 width: conf.width, 204 videoId: conf.videoId, 205 playerVars: { 206 autohide: 0, 207 origin: location.href.match(/:\/\/(.[^\/]+)/)[1], 208 loop: conf.loop ? 1 : 0, 209 autoplay: conf.autoPlay ? 1 : 0 210 } 211 }); 212 $(player) 213 .one("video_ready.pixelentity",fireReadyEvent) 214 .one("video_ended.pixelentity",vimeoVideoEnded); 215 } 216 217 function vimeoVideoEnded() { 218 jthis.trigger("video_ended.pixelentity"); 219 } 220 221 function ytStateChange() { 222 if (!player) {return;} 223 if (player.getPlayerState) { 224 if (player.peUseHD && player.getPlaybackQuality) { 225 if (player.getPlaybackQuality() != "hd720") { 226 player.setPlaybackQuality("hd720"); 227 } 228 } 229 switch (player.getPlayerState()) { 230 case YT.PlayerState.ENDED: 231 jthis.trigger("video_ended.pixelentity"); 232 break; 233 case YT.PlayerState.PLAYING: 234 if ((player.getDuration()-player.getCurrentTime()) < 0.4) { 235 jthis.trigger("video_ended.pixelentity"); 236 } 237 break; 238 } 239 } 240 } 241 242 function resize(w,h) { 243 if (player && player.setSize) { 244 player.setSize({width:w, height: h}); 245 } 246 } 247 248 249 $.extend(this, { 250 resize: resize, 251 bind: function(ev,handler) { 252 jthis.bind(ev,handler); 253 }, 254 unbind: function(ev,handler) { 255 jthis.unbind(ev,handler); 256 }, 257 one: function(ev,handler) { 258 jthis.one(ev,handler); 259 }, 260 destroy: function() { 261 clearInterval(checkTimer); 262 if (jthis) { 263 jthis.remove(); 264 } 265 jthis = undefined; 266 if (player) { 267 $(player).unbind("video_ended.pixelentity"); 268 269 switch (conf.type) { 270 case "vidly": 271 case "local": 272 if (player.removeListener) { 273 player.removeListener(iDev ? 'ready' : 'buffer',localVideoBuffer); 274 } 275 if (conf.useVideoTag) { 276 if (player.destroy) { 277 player.destroy(); 278 } 279 } else { 280 if (player.selfDestruct) { 281 player.selfDestruct(); 282 } 283 } 284 break; 285 default: 286 if (player.destroy) { 287 player.destroy(); 288 } 289 } 290 } 291 player = undefined; 292 target.data("peVideo", null); 293 target = undefined; 294 295 } 296 }); 297 298 start(); 299 300 301 } 302 303 // jQuery plugin implementation 304 $.fn.peVideo = function(conf) { 305 // return existing instance 306 var api = this.data("peVideo"); 307 308 if (api) { 309 return api; 310 } 311 312 conf = $.extend(true, {}, $.pixelentity.video.conf, conf); 313 314 // install kb for each entry in jQuery object 315 this.each(function() { 316 api = new PeVideo($(this), conf); 317 $(this).data("peVideo", api); 318 }); 319 320 return conf.api ? api: this; 321 }; 322 323}(jQuery));
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.