From c72d1ff607005793e150006fa506dbbdef8f8879 Mon Sep 17 00:00:00 2001 From: Steve Heffernan Date: Fri, 17 Sep 2010 23:19:43 -0700 Subject: [PATCH] Ran through JSLint and updated based on those suggestions. --- video.js | 150 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 78 insertions(+), 72 deletions(-) diff --git a/video.js b/video.js index 9358ae428..d30d8da57 100644 --- a/video.js +++ b/video.js @@ -50,10 +50,10 @@ var VideoJS = JRClass.extend({ }; // Override default options with global options - if (typeof VideoJS.options == "object") _V_.merge(this.options, VideoJS.options); + if (typeof VideoJS.options == "object") { _V_.merge(this.options, VideoJS.options); } // Override global options with options specific to this video - if (typeof setOptions == "object") _V_.merge(this.options, setOptions); + if (typeof setOptions == "object") { _V_.merge(this.options, setOptions); } this.box = this.video.parentNode; this.flashFallback = this.getFlashFallback(); @@ -67,7 +67,7 @@ var VideoJS = JRClass.extend({ // Check if browser can play HTML5 video if (VideoJS.browserSupportsVideo()) { // Force flash fallback when there's no supported source, or flash is dominant - if (this.canPlaySource() == false || this.options.flashIsDominant) { + if (!this.canPlaySource() || this.options.flashIsDominant) { this.replaceWithFlash(); return; } @@ -116,7 +116,7 @@ var VideoJS = JRClass.extend({ // Make a click on the video act like a click on the play button. this.video.addEventListener("click", this.onPlayControlClick.context(this), false); // Make a click on the poster act like a click on the play button. - if (this.poster) this.poster.addEventListener("click", this.onPlayControlClick.context(this), false); + if (this.poster) { this.poster.addEventListener("click", this.onPlayControlClick.context(this), false); } // Listen for drags on the progress bar this.progressHolder.addEventListener("mousedown", this.onProgressHolderMouseDown.context(this), false); @@ -140,10 +140,12 @@ var VideoJS = JRClass.extend({ // Listen for the mouse moving out of the video. Used to hide the controller. this.video.addEventListener("mouseout", this.onVideoMouseOut.context(this), false); - // Listen for the mouse move the poster image. Used to reveal the controller. - if (this.poster) this.poster.addEventListener("mousemove", this.onVideoMouseMove.context(this), false); - // Listen for the mouse moving out of the poster image. Used to hide the controller. - if (this.poster) this.poster.addEventListener("mouseout", this.onVideoMouseOut.context(this), false); + if (this.poster) { + // Listen for the mouse move the poster image. Used to reveal the controller. + this.poster.addEventListener("mousemove", this.onVideoMouseMove.context(this), false); + // Listen for the mouse moving out of the poster image. Used to hide the controller. + this.poster.addEventListener("mouseout", this.onVideoMouseOut.context(this), false); + } // Have to add the mouseout to the controller too or it may not hide. // For some reason the same isn't needed for mouseover @@ -167,7 +169,7 @@ var VideoJS = JRClass.extend({ // Load subtitles. Based on http://matroska.org/technical/specs/subtitles/srt.html this.subtitlesSource = this.video.getAttribute("data-subtitles"); - if (this.subtitlesSource != null) { + if (this.subtitlesSource !== null) { this.loadSubtitles(); this.buildSubtitles(); } @@ -233,7 +235,7 @@ var VideoJS = JRClass.extend({ // Create the loading progress display this.loadProgress = _V_.createElement("li", { className: "vjs-load-progress" }); - this.progressHolder.appendChild(this.loadProgress) + this.progressHolder.appendChild(this.loadProgress); // Create the playing progress display this.playProgress = _V_.createElement("li", { className: "vjs-play-progress" }); @@ -261,7 +263,7 @@ var VideoJS = JRClass.extend({ innerHTML: "" }); this.controls.appendChild(this.volumeControl); - this.volumeDisplay = this.volumeControl.children[0] + this.volumeDisplay = this.volumeControl.children[0]; // Crete the fullscreen control this.fullscreenControl = _V_.createElement("li", { @@ -278,11 +280,11 @@ var VideoJS = JRClass.extend({ // Hide no-video download paragraph hideLinksFallback: function(){ - if (this.options.linksHiding && this.linksFallback) this.linksFallback.style.display = "none"; + if (this.options.linksHiding && this.linksFallback) { this.linksFallback.style.display = "none"; } }, getFlashFallback: function(){ - if (VideoJS.isIE()) return; + if (VideoJS.isIE()) { return; } var children = this.box.getElementsByClassName("vjs-flash-fallback"); for (var i=0,j=children.length; i 0) this.video.poster = images[0].src; + if (images.length > 0) { this.video.poster = images[0].src; } } }, @@ -380,7 +382,7 @@ var VideoJS = JRClass.extend({ // Add the video poster to the video's container, to fix autobuffer/preload bug showPoster: function(){ - if (!this.poster) return; + if (!this.poster) { return; } this.poster.style.display = "block"; this.positionPoster(); }, @@ -388,13 +390,13 @@ var VideoJS = JRClass.extend({ // Size the poster image positionPoster: function(){ // Only if the poster is visible - if (this.poster == false || this.poster.style.display == 'none') return; + if (!this.poster || this.poster.style.display == 'none') { return; } this.poster.style.height = this.video.offsetHeight + "px"; this.poster.style.width = this.video.offsetWidth + "px"; }, hidePoster: function(){ - if (!this.poster) return; + if (!this.poster) { return; } this.poster.style.display = "none"; }, @@ -474,7 +476,7 @@ var VideoJS = JRClass.extend({ }, updateLoadProgress: function(){ - if (this.controls.style.display == 'none') return; + if (this.controls.style.display == 'none') { return; } this.loadProgress.style.width = (this.percentLoaded * (_V_.getComputedStyleValue(this.progressHolder, "width").replace("px", ""))) + "px"; }, @@ -580,19 +582,19 @@ var VideoJS = JRClass.extend({ // Get the space between controls. For more flexible styling. getControlsPadding: function(){ - return _V_.findPosX(this.playControl) - _V_.findPosX(this.controls) + return _V_.findPosX(this.playControl) - _V_.findPosX(this.controls); }, // When dynamically placing controls, if there are borders on the controls, it can break to a new line. getControlBorderAdjustment: function(){ - var leftBorder = parseInt(_V_.getComputedStyleValue(this.playControl, "border-left-width").replace("px", "")); - var rightBorder = parseInt(_V_.getComputedStyleValue(this.playControl, "border-right-width").replace("px", "")); + var leftBorder = parseInt(_V_.getComputedStyleValue(this.playControl, "border-left-width").replace("px", ""), 10); + var rightBorder = parseInt(_V_.getComputedStyleValue(this.playControl, "border-right-width").replace("px", ""), 10); return leftBorder + rightBorder; }, // Track & display the current play progress trackPlayProgress: function(){ - if(this.playProgressInterval) clearInterval(this.playProgressInterval); + if(this.playProgressInterval) { clearInterval(this.playProgressInterval); } this.playProgressInterval = setInterval(function(){ this.updatePlayProgress(); }.context(this), 33); }, @@ -603,7 +605,7 @@ var VideoJS = JRClass.extend({ // Ajust the play progress bar's width based on the current play time updatePlayProgress: function(){ - if (this.controls.style.display == 'none') return; + if (this.controls.style.display == 'none') { return; } this.playProgress.style.width = ((this.video.currentTime / this.video.duration) * (_V_.getComputedStyleValue(this.progressHolder, "width").replace("px", ""))) + "px"; this.updateTimeDisplay(); }, @@ -614,7 +616,7 @@ var VideoJS = JRClass.extend({ this.playProgress.style.width = newProgress * (_V_.getComputedStyleValue(this.progressHolder, "width").replace("px", "")) + "px"; this.updateTimeDisplay(); // currentTime changed, reset subtitles - if (this.subtitles != null) { this.currentSubtitlePosition = 0; } + if (!this.subtitles) { this.currentSubtitlePosition = 0; } }, setPlayProgressWithEvent: function(event){ @@ -625,7 +627,7 @@ var VideoJS = JRClass.extend({ // Update the displayed time (00:00) updateTimeDisplay: function(){ this.currentTimeDisplay.innerHTML = _V_.formatTime(this.video.currentTime); - if (this.video.duration) this.durationDisplay.innerHTML = _V_.formatTime(this.video.duration); + if (this.video.duration) { this.durationDisplay.innerHTML = _V_.formatTime(this.video.duration); } }, // Set a new volume based on where the user clicked on the volume control @@ -645,7 +647,7 @@ var VideoJS = JRClass.extend({ var volNum = Math.ceil(this.video.volume * 6); for(var i=0; i<6; i++) { if (i < volNum) { - _V_.addClass(this.volumeDisplay.children[i], "vjs-volume-level-on") + _V_.addClass(this.volumeDisplay.children[i], "vjs-volume-level-on"); } else { _V_.removeClass(this.volumeDisplay.children[i], "vjs-volume-level-on"); } @@ -722,9 +724,9 @@ var VideoJS = JRClass.extend({ try { return new ActiveXObject("Msxml2.XMLHTTP.6.0"); } catch (e) {} try { return new ActiveXObject("Msxml2.XMLHTTP.3.0"); } - catch (e) {} + catch (f) {} try { return new ActiveXObject("Msxml2.XMLHTTP"); } - catch (e) {} + catch (g) {} //Microsoft.XMLHTTP points to Msxml2.XMLHTTP.3.0 and is redundant throw new Error("This browser does not support XMLHttpRequest."); }; @@ -739,9 +741,9 @@ var VideoJS = JRClass.extend({ request.send(); }, - parseSubtitles: function(text) { - var lines = text.replace("\r",'').split("\n"); - this.subtitles = new Array(); + parseSubtitles: function(subText) { + var lines = subText.replace("\r",'').split("\n"); + this.subtitles = []; this.currentSubtitlePosition = 0; var i = 0; @@ -750,7 +752,7 @@ var VideoJS = JRClass.extend({ var subtitle = {}; // get the number subtitle.id = lines[i++]; - if (subtitle.id=="") { + if (!subtitle.id) { break; } @@ -760,7 +762,7 @@ var VideoJS = JRClass.extend({ subtitle.endTime = this.parseSubtitleTime(time[1]); // get subtitle text - var text = new Array(); + var text = []; while(lines[i].length>0 && lines[i]!="\r") { text.push(lines[i++]); } @@ -778,14 +780,14 @@ var VideoJS = JRClass.extend({ var parts = timeText.split(':'); var time = 0; // hours => seconds - time += parseInt(parts[0])*60*60; + time += parseInt(parts[0], 10)*60*60; // minutes => seconds - time += parseInt(parts[1])*60; + time += parseInt(parts[1], 10)*60; // get seconds var seconds = parts[2].split(','); - time += parseInt(seconds[0]); + time += parseInt(seconds[0], 10); // add miliseconds - time = time + parseInt(seconds[1])/1000; + time = time + parseInt(seconds[1], 10)/1000; return time; }, @@ -800,7 +802,7 @@ var VideoJS = JRClass.extend({ onTimeUpdate: function(){ // show the subtitles - if (this.subtitles != null) { + if (this.subtitles) { var x = this.currentSubtitlePosition; while (xthis.subtitles[x].endTime) { @@ -812,8 +814,7 @@ var VideoJS = JRClass.extend({ x = this.currentSubtitlePosition; } - if (this.currentSubtitlePosition>=this.subtitles.length) - return; + if (this.currentSubtitlePosition>=this.subtitles.length) { return; } if (this.video.currentTime>=this.subtitles[x].startTime && this.video.currentTime<=this.subtitles[x].endTime) { this.subtitlesDiv.innerHTML = this.subtitles[x].text; @@ -843,7 +844,7 @@ var VideoJS = JRClass.extend({ } } -}) +}); //////////////////////////////////////////////////////////////////////////////// // Convenience Functions (mini library) @@ -851,18 +852,23 @@ var VideoJS = JRClass.extend({ //////////////////////////////////////////////////////////////////////////////// var _V_ = { addClass: function(element, classToAdd){ - if (element.className.split(/\s+/).lastIndexOf(classToAdd) == -1) { element.className = element.className == "" ? classToAdd : element.className + " " + classToAdd; } + if (element.className.split(/\s+/).lastIndexOf(classToAdd) == -1) { element.className = element.className === "" ? classToAdd : element.className + " " + classToAdd; } }, removeClass: function(element, classToRemove){ - if (element.className.indexOf(classToRemove) == -1) return; + if (element.className.indexOf(classToRemove) == -1) { return; } var classNames = element.className.split(/\s+/); classNames.splice(classNames.lastIndexOf(classToRemove),1); element.className = classNames.join(" "); }, merge: function(obj1, obj2){ - for(var attrname in obj2){obj1[attrname]=obj2[attrname];} return obj1; + for(var attrname in obj2){ + if (obj2.hasOwnProperty(attrname)) { + obj1[attrname]=obj2[attrname]; + } + } + return obj1; }, createElement: function(tagName, attributes){ @@ -938,7 +944,7 @@ var _V_ = { DOMReadyList: [], addToDOMReady: function(fn){ if (_V_.DOMIsReady) { - fn.call(document) + fn.call(document); } else { _V_.DOMReadyList.push(fn); } @@ -946,19 +952,17 @@ var _V_ = { DOMIsReady: false, DOMReady: function(){ - if (_V_.DOMIsReady) return; + if (_V_.DOMIsReady) { return; } if (!document.body) { return setTimeout(_V_.DOMReady, 13); } _V_.DOMIsReady = true; if (_V_.DOMReadyList) { for (var i=0; i<_V_.DOMReadyList.length; i++) { - - _V_.DOMReadyList[i].call(document) + _V_.DOMReadyList[i].call(document); } _V_.DOMReadyList = null; } } - -} +}; _V_.bindDOMReady(); //////////////////////////////////////////////////////////////////////////////// @@ -971,12 +975,12 @@ VideoJS.setupAllWhenReady = function(options){ // Options is stored globally, and added ot any new player on init VideoJS.options = options; VideoJS.DOMReady(VideoJS.setup); -} +}; // Run the supplied function when the DOM is ready VideoJS.DOMReady = function(fn){ _V_.addToDOMReady(fn); -} +}; // Set up a specific video or array of video elements // "video" can be: @@ -1010,7 +1014,7 @@ VideoJS.setup = function(videos, options){ // Return one or all depending on what was passed in return (returnSingular) ? playerList[0] : playerList; -} +}; // Find video tags with the video-js class VideoJS.getVideoJSTags = function() { @@ -1025,48 +1029,50 @@ VideoJS.getVideoJSTags = function() { } return videoJSTags; -} +}; // Check if the browser supports video. VideoJS.browserSupportsVideo = function() { - if (typeof VideoJS.videoSupport != "undefined") return VideoJS.videoSupport; - return VideoJS.videoSupport = !!document.createElement('video').canPlayType; -} + if (typeof VideoJS.videoSupport != "undefined") { return VideoJS.videoSupport; } + VideoJS.videoSupport = !!document.createElement('video').canPlayType; + return VideoJS.videoSupport; +}; VideoJS.getFlashVersion = function(){ // Cache Version - if (typeof VideoJS.flashVersion != "undefined") return VideoJS.flashVersion; + if (typeof VideoJS.flashVersion != "undefined") { return VideoJS.flashVersion; } var version = 0; if (typeof navigator.plugins != "undefined" && typeof navigator.plugins["Shockwave Flash"] == "object") { desc = navigator.plugins["Shockwave Flash"].description; if (desc && !(typeof navigator.mimeTypes != "undefined" && navigator.mimeTypes["application/x-shockwave-flash"] && !navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin)) { - version = parseInt(desc.match(/^.*\s+([^\s]+)\.[^\s]+\s+[^\s]+$/)[1]); + version = parseInt(desc.match(/^.*\s+([^\s]+)\.[^\s]+\s+[^\s]+$/)[1], 10); } } else if (typeof window.ActiveXObject != "undefined") { try { var testObject = new ActiveXObject("ShockwaveFlash.ShockwaveFlash"); if (testObject) { - version = parseInt(testObject.GetVariable("$version").match(/^[^\s]+\s(\d+)/)[1]); + version = parseInt(testObject.GetVariable("$version").match(/^[^\s]+\s(\d+)/)[1], 10); } } catch(e) {} } - return VideoJS.flashVersion = version; -} + VideoJS.flashVersion = version; + return VideoJS.flashVersion; +}; -VideoJS.isIE = function(){ return !+"\v1"; } -VideoJS.isIpad = function(){ return navigator.userAgent.match(/iPad/i) != null; } -VideoJS.isAndroid = function(){ return navigator.userAgent.match(/Android/i) != null; }; +VideoJS.isIE = function(){ return !+"\v1"; }; +VideoJS.isIpad = function(){ return navigator.userAgent.match(/iPad/i) !== null; }; +VideoJS.isAndroid = function(){ return navigator.userAgent.match(/Android/i) !== null; }; // Allows for binding context to functions // when using in event listeners and timeouts Function.prototype.context = function(obj) { - var method = this + var method = this; temp = function() { - return method.apply(obj, arguments) + return method.apply(obj, arguments); } - return temp -} + return temp; +}; // jQuery Plugin if (window.jQuery) {