YouTube Player (also a good example for Flash embedding)

tliebeck's picture

Note that Linux Flash doesn't support the wmode=transparent setting used here, so Flash movies on Linux will ignore z-index/CSS positioning and simply appear on top of everything.

/**
 * A component which embeds a YouTube video player.
 *
 * @sp {String} movie the id of the movie to play
 */
Contrib.YouTubePlayer = Core.extend(Echo.Component, {

    $static: {
        getThumbnailUrl: function(movieId) {
            return "http://img.youtube.com/vi/" + movieId + "/1.jpg";
        }
    },

    componentType: "Contrib.YouTubePlayer"
});

/**
 * Synchronization peer for YouTubePlayer component.
 */
Contrib.YouTubePlayer.Sync = Core.extend(Echo.Render.ComponentSync, {

    $load: function() {
        Echo.Render.registerPeer("Contrib.YouTubePlayer", this);
    },

    _object: null,

    renderAdd: function(update, parentElement) {
        var movie = this.component.render("movie");
        
        if (Core.Web.Env.BROWSER_INTERNET_EXPLORER) {
            this._object = document.createElement("<object classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\">");
        } else {
            this._object = document.createElement("object");
            this._object.type = "application/x-shockwave-flash";
        }
        this._object.width = Echo.Sync.Extent.toPixels(this.component.render("width", 425));
        this._object.height = Echo.Sync.Extent.toPixels(this.component.render("width", 350));
        this._object.data = "http://www.youtube.com/v/" + movie;
        var param = document.createElement("param");
        param.name = "movie";
        param.value = "http://www.youtube.com/v/" + movie;
        this._object.appendChild(param);
        param = document.createElement("param");
        param.name = "wmode";
        param.value = "transparent";
        this._object.appendChild(param);
        parentElement.appendChild(this._object);
    },

    renderDispose: function(update) {
        this._object = null;
    },
    
    renderUpdate: function(update) {
        var element = this._object;
        var containerElement = element.parentNode;
        this.renderDispose(update);
        containerElement.removeChild(element);
        this.renderAdd(update, containerElement);
        return false; // Child elements not supported: safe to return false.
    }
});