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 getInfo(url,formats,poster,size) { 8 var result, type, id, i,w = false,h = false; 9 10 url = url ? url : ""; 11 12 for (var filter in types) { 13 if (typeof filter === "string" ) { 14 result = url.match(types[filter]); 15 if (result && result.length > 0) { 16 type = filter; 17 id = result[2]; 18 if (!poster) { 19 poster = posters[type] ? posters[type].replace("$ID",id) : ""; 20 } 21 break; 22 } 23 24 } 25 } 26 27 // no know source found, see if local video 28 if (!id) { 29 var src = url.match(local); 30 if (src) { 31 type = "local"; 32 id = [src[0]]; 33 if (formats) { 34 formats = formats.split(","); 35 for (i=0;i<formats.length;i++) { 36 id.push(src[1]+formats[i]); 37 } 38 } 39 } else { 40 id = false; 41 } 42 } 43 44 if (size) { 45 var token = size.split(/x| |,/); 46 w = parseInt(token[0],10) || 0; 47 h = parseInt(token[1],10) || 0; 48 } 49 50 return { 51 video: id, 52 videoType: type, 53 videoPoster: poster, 54 videoW : w, 55 videoH : h 56 57 }; 58 } 59 60 61 $.pixelentity.videoplayer = { 62 conf: { 63 autoPlay: false, 64 responsive: false, 65 api: false 66 }, 67 getInfo: getInfo 68 }; 69 70 var instances = []; 71 72 var types = { 73 vidly: /http:\/\/(vid.ly)\/([\w|\-]+)/i, 74 youtube: /http:\/\/(www.youtube.com\/watch\?v=|youtube.com\/watch\?v=|youtu.be\/)([\w|\-]+)/i, 75 vimeo: /http:\/\/(vimeo\.com|www\.vimeo\.com)\/([\w|\-]+)/i 76 }; 77 78 var posters = { 79 vidly: "http://cf.cdn.vid.ly/$ID/poster.jpg", 80 youtube: "http://img.youtube.com/vi/$ID/0.jpg", 81 vimeo: "http://vimeo.com/api/v2/video/$ID.json?callback=?" 82 }; 83 84 var local = /(.+[^w])(mp4|webm|ogv)$/i; 85 86 function PeVideoPlayer(target, conf) { 87 var preview,w,h,type,id,poster; 88 var container; 89 var player = false; 90 var instanceID; 91 92 93 94 function start() { 95 var info = getInfo(target[0].href,target.attr("data-formats"),target.attr("data-poster"),target.attr("data-size")); 96 97 if (info.video) { 98 id = info.video; 99 type = info.videoType; 100 poster = info.videoPoster; 101 } else { 102 return; 103 } 104 105 if (info.videoW !== false) { 106 target.css({ 107 width: info.videoW, 108 height: info.videoH 109 }); 110 } 111 112 /* 113 for (var filter in types) { 114 if (typeof filter === "string" ) { 115 result = url.match(types[filter]); 116 if (result && result.length > 0) { 117 type = filter; 118 id = result[2]; 119 poster = posters[type] ? posters[type].replace("$ID",id) : ""; 120 break; 121 } 122 123 } 124 } 125 126 // no know source found, see if local video 127 if (!id) { 128 var src = url.match(local); 129 if (src) { 130 type = "local"; 131 id = [src[0]]; 132 var formats = target.attr("data-formats"); 133 if (formats) { 134 formats = formats.split(","); 135 for (i=0;i<formats.length;i++) { 136 id.push(src[1]+formats[i]); 137 } 138 } 139 } else { 140 return; 141 } 142 } 143 144 if (target.attr("data-size")) { 145 var token = target.attr("data-size").split(/x| |,/); 146 w = parseInt(token[0],10) || 0; 147 h = parseInt(token[1],10) || 0; 148 target.css({ 149 width: w, 150 height: h 151 }); 152 }*/ 153 154 155 w = info.videoW || target.width(); 156 h = info.videoH || target.height(); 157 158 var icon = $('<span class="largePlay"></span>'); 159 160 if (conf.responsive) { 161 162 container = $("<div/>").fadeTo(0,0); 163 164 target 165 .append(icon) 166 .removeAttr("href") 167 .append(container) 168 .wrap('<div class="videoWrapper sixteenBYnine '+info.videoType+'"></div>'); 169 170 if (target.attr("data-target") != "flare") { 171 target 172 .addClass("peActiveWidget") 173 .bind("enable.pixelentity ",enable) 174 .bind("disable.pixelentity ",disable) 175 .bind("click",play); 176 } 177 178 } else { 179 target 180 .append(icon) 181 .wrap('<div style="position: relative; overflow: hidden"></div>') 182 .addClass("peActiveWidget") 183 .bind("enable.pixelentity ",enable) 184 .bind("disable.pixelentity ",disable) 185 .bind("click",play); 186 187 icon.css({ 188 left: (w-icon.width()) >> 1, 189 top: (h-icon.height()) >> 1 190 }); 191 192 container = $("<div/>").css({ 193 "position": "absolute", 194 "z-index": 2, 195 "display": "none", 196 "width": w+"px", 197 "height": h+"px" 198 }); 199 200 target.parent().prepend(container); 201 202 } 203 204 205 206 var img = target.children("img:eq(0)"); 207 208 if (img.length > 0) { 209 preview = img; 210 poster = img.attr("src"); 211 posterLoaded(); 212 } else if (target.attr("data-poster")) { 213 poster = target.attr("data-poster"); 214 if (conf.responsive) { 215 target.parent().addClass("customCover"); 216 } 217 getPoster(); 218 } else if (poster) { 219 if (type == "vimeo") { 220 $.getJSON(poster,vimeoPosterUrlLoaded); 221 } else { 222 getPoster(); 223 } 224 } 225 226 if (($.pixelentity.browser.mobile && target.attr("data-autoplay") != "disabled") || conf.autoPlay) { 227 enable(); 228 } 229 230 } 231
232 function vimeoPosterUrlLoaded(data) { 233 poster = (data && data[0] && data[0].thumbnail_large) || false; 234 if (poster) { 235 getPoster(); 236 } 237 } 238 239 function getPoster() { 240 preview = $("<img/>"); 241 preview.fadeTo(0,0).css("opacity",0).attr("data-src",poster); 242 target.append(preview); 243 $.pixelentity.preloader.load(preview,posterLoaded); 244 } 245 246 function posterLoaded() { 247 248 if (conf.responsive) { 249 //preview.width("100%").height("100%").fadeTo(300,1); 250 preview.width("100%").fadeTo(300,1); 251 /* 252 if (preview.closest("bw-images")) { 253 preview.peBlackAndWhite(); 254 } 255 */ 256 return; 257 } 258 259 var iw = preview[0].width || preview.width(); 260 var ih = preview[0].height || preview.height(); 261 262 var scaler = $.pixelentity.Geom.getScaler( 263 "fillmax", 264 "center", 265 "center", 266 w, 267 h, 268 iw, 269 ih 270 271 ); 272 273 preview.transform(scaler.ratio,scaler.offset.w,scaler.offset.h,w,h,true); 274 preview.fadeTo(300,1); 275 } 276 277 function play(e) { 278 if (player) { 279 return false; 280 } 281 282 if (!$.pixelentity.browser.mobile) { 283 for (var i=0;i<instances.length;i++) { 284 if (i != instanceID) { 285 instances[i].disable(); 286 } 287 } 288 } 289 290 container.show().fadeTo(0,0); 291 player = container.peVideo({ 292 api: true, 293 useVideoTag: conf.responsive && $.pixelentity.browser.mobile, 294 //useVideoTag: true, 295 width: conf.responsive ? "100%" : w, 296 height: conf.responsive ? "100%" : h, 297 type : type, 298 videoId : id, 299 poster:poster, 300 hd: true, 301 autoPlay:true, 302 loop:true 303 }); 304 player.one("video_ready.pixelentity",show); 305 306 target.trigger("play"); 307 // for testing 308 //setTimeout(disable,3000); 309 310 return false; 311 } 312 313 function show() { 314 container.fadeTo(500,1); 315 } 316 317 function stop() { 318 } 319 320 function enable() { 321 if (!player && ($.pixelentity.browser.mobile || conf.autoPlay)) { 322 play(); 323 } 324 } 325 326 function disable() { 327 if (player) { 328 if (player.destroy) { 329 player.destroy(); 330 } 331 player = false; 332 container.empty().fadeTo(0,0).hide(); 333 } 334 } 335 336 337 $.extend(this, { 338 enable: enable, 339 disable: disable, 340 destroy: function() { 341 if (player && player.destroy) { 342 player.destroy(); 343 } 344 player = undefined; 345 instances.splice(instanceID,1); 346 target.data("peVideoPlayer", null); 347 target = undefined; 348 349 } 350 }); 351 352 instanceID = instances.length; 353 instances.push(this); 354 355 start(); 356 357 358 } 359 360 // jQuery plugin implementation 361 $.fn.peVideoPlayer = function(conf) { 362 // return existing instance 363 364 var api = this.data("peVideoPlayer"); 365 366 if (api) { 367 return api; 368 } 369 370 conf = $.extend(true, {}, $.pixelentity.videoplayer.conf, conf); 371 372 // install kb for each entry in jQuery object 373 this.each(function() { 374 api = new PeVideoPlayer($(this), conf); 375 $(this).data("peVideoPlayer", api); 376 }); 377 378 return conf.api ? api: this; 379 }; 380 381 382}(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.