function VideoSync(roomId, userId) {roomId is the name of the channel you want to use. userId is an optional variable that will identify individual users of VideoSync.
function VideoSync(roomId, userId) {If no userId is provided, generate a simple random one with Math.random.
    if (userId === undefined) {
        userId = Math.random().toString();
    }A variable that will be set to the YouTube player object.
    var player;Initializing PubNub with demo keys and our userId.
    var pubnub = PUBNUB.init({
        publish_key: 'demo',
        subscribe_key: 'demo',
        uuid: userId
    });Whether the connection to the channel has been established yet.
    var linkStart = false;The contents of the most recently received message.
    var lastMsg;A helper function that publishes state-change messages.
    var pub = function (type, time) {
        if (lastMsg !== "" + type + time) {
            pubnub.publish({
                channel: roomId,
                message: {
                    recipient: "",
                    sender: userId,
                    type: type,
                    time: time,
                }
            });
        }
    };The function that keeps the video in sync.
    var keepSync = function () {        linkStart = true;The initial starting time of the current video.
        var time = player.getCurrentTime();Subscribing to our PubNub channel.
        pubnub.subscribe({
            channel: roomId,
            callback: function (m) {
                lastMsg = m.recipient + m.type + m.time;
                if ((m.recipient === userId || m.recipient === "") && m.sender !== userId) {
                    if (m.type === "updateRequest") {
                        var curState = player.getPlayerState();
                        var curTime = player.getCurrentTime();
                        pubnub.publish({
                            channel: roomId,
                            message: {
                                type: "updateResponse",
                                time: curTime,
                                recipient: m.sender
                            }
                        });
                    } else if (m.type === "pause") {
                        player.seekTo(m.time, true);
                        time = m.time;
                        player.pauseVideo();
                    } else if (m.type === "play") {
                        if (m.time !== null) {
                            player.seekTo(m.time, true);
                        }
                        player.playVideo();
                    }
                }
            },
            presence: function (m) {}
        });Intermittently checks whether the video player has jumped ahead or behind the current time.
        var z = setInterval(function () {
            var curTime = player.getCurrentTime();
            var curState = player.getPlayerState();
            if (Math.abs(curTime - time) > 1) {
                if (curState === 2) {
                    pub("pause", curTime);
                    player.pauseVideo();
                } else if (curState === 1) {
                    player.pauseVideo();
                }
            }
            time = curTime;
        }, 500);
    };    return {Should be bound to the YouTube player onReady event.
        onPlayerReady: function (event) {
            player = event.target;
            event.target.playVideo();
            event.target.pauseVideo();
            keepSync();
        },Should be bound to the YouTube player onStateChange event.
        onPlayerStateChange: function (event) {
            if (linkStart) {Play event.
                if (event.data === 1) {
                    pub("play", null);
                }Pause event.
                else if (event.data === 2) {
                    pub("pause", player.getCurrentTime());
                }
            }
        }
    };
}