$.fn.youTubeEmbed = function (settings) {

    // Settings can be either a URL string,
    // or an object

    if (typeof settings == 'string') {
        settings = { 'video': settings }
    }

    // Default values

    var def = {
        width: 640,
        progressBar: true
    };

    settings = $.extend(def, settings);

    var elements = {
        originalDIV: this, // The "this" of the plugin
        container: null, // A container div, inserted by the plugin
        control: null, // The control play/pause button
        player: null, // The flash player
        progress: null, // Progress bar
        elapsed: null	// The light blue elapsed bar
    };


    try {

        settings.videoID = settings.video.match(/v=(.{11})/)[1];

        // The safeID is a stripped version of the
        // videoID, ready for use as a function name

        settings.safeID = settings.videoID.replace(/[^a-z0-9]/ig, '');

    } catch (e) {
        // If the url was invalid, just return the "this"
        return elements.originalDIV;
    }

    // Fetch data about the video from YouTube's API

    var youtubeAPI = 'https://gdata.youtube.com/feeds/api/videos?v=2&alt=jsonc';

    $.get(youtubeAPI, { 'q': settings.videoID }, function (response) {

        var data = response.data;

        if (!data.totalItems || data.items[0].accessControl.embed != "allowed") {

            // If the video was not found, or embedding is not allowed;

            return elements.originalDIV;
        }

        // data holds API info about the video:

        data = data.items[0];

        settings.ratio = 3 / 4;
        if (data.aspectRatio == "widescreen") {
            settings.ratio = 9 / 16;
        }

        settings.height = Math.round(settings.width * settings.ratio);

        // Creating a container inside the original div, which will
        // hold the object/embed code of the video

        elements.container = $('<div>', { className: 'flashContainer', css: {
            width: settings.width,
            height: settings.height
        }
        }).appendTo(elements.originalDIV);

        // Embedding the YouTube chromeless player
        // and loading the video inside it:

        elements.container.flash({
            swf: 'http://www.youtube.com/apiplayer?enablejsapi=1&version=3',
            id: 'video_' + settings.safeID,
            height: settings.height,
            width: settings.width,
            allowScriptAccess: 'always',
            wmode: 'transparent',
            flashvars: {
                "video_id": settings.videoID,
                "playerapiid": settings.safeID
            }
        });

        // We use get, because we need the DOM element
        // itself, and not a jquery object:

        elements.player = elements.container.flash().get(0);

        // Creating the control Div. It will act as a ply/pause button

        elements.control = $('<div>', { className: 'controlDiv play' })
                               .appendTo(elements.container);

        // If the user wants to show the progress bar:

        if (settings.progressBar) {
            elements.progress = $('<div>', { className: 'progressBar' })
                                    .appendTo(elements.container);

            elements.elapsed = $('<div>', { className: 'elapsed' })
                                    .appendTo(elements.progress);

            elements.progress.click(function (e) {

                // When a click occurs on the progress bar, seek to the
                // appropriate moment of the video.

                var ratio = (e.pageX - elements.progress.offset().left) / elements.progress.outerWidth();

                elements.elapsed.width(ratio * 100 + '%');
                elements.player.seekTo(Math.round(data.duration * ratio), true);
                return false;
            });

        }

        var initialized = false;

        // Creating a global event listening function for the video
        // (required by YouTube's player API):

        window['eventListener_' + settings.safeID] = function (status) {

            var interval;

            if (status == -1)	// video is loaded
            {
                if (!initialized) {
                    // Listen for a click on the control button:

                    elements.control.click(function () {
                        if (!elements.container.hasClass('playing')) {

                            // If the video is not currently playing, start it:

                            elements.control.removeClass('play replay').addClass('pause');
                            elements.container.addClass('playing');
                            elements.player.playVideo();

                            if (settings.progressBar) {
                                interval = window.setInterval(function () {
                                    elements.elapsed.width(
                                            ((elements.player.getCurrentTime() / data.duration) * 100) + '%'
                                        );
                                }, 1000);
                            }

                        } else {

                            // If the video is currently playing, pause it:

                            elements.control.removeClass('pause').addClass('play');
                            elements.container.removeClass('playing');
                            elements.player.pauseVideo();

                            if (settings.progressBar) {
                                window.clearInterval(interval);
                            }
                        }
                    });

                    initialized = true;
                }
                else {
                    // This will happen if the user has clicked on the
                    // YouTube logo and has been redirected to youtube.com

                    if (elements.container.hasClass('playing')) {
                        elements.control.click();
                    }
                }
            }

            if (status == 0) { // video has ended
                elements.control.removeClass('pause').addClass('replay');
                elements.container.removeClass('playing');
            }
        }

        // This global function is called when the player is loaded.
        // It is shared by all the videos on the page:

        if (!window.onYouTubePlayerReady) {
            window.onYouTubePlayerReady = function (playerID) {
                document.getElementById('video_' + playerID).addEventListener('onStateChange', 'eventListener_' + playerID);
            }
        }
    }, 'jsonp');

    return elements.originalDIV;
}

