/*
 * YouTube Chromeless Video Player Plugin
 *
 * @version 0.1
 * @author Dawid Opis (dawid.opis@fireflytechnology.pl)
 * @copyright (c) 2010 - FireFly Technology (http://www.fireflytechnology.pl)
 */
 
(function($) {
    $.fn.ytchromeless = function(opts){
    
        var config = {
            width  : '310',
            height : '200',
            params : {
                allowScriptAccess: 'always',
                wmode: 'opaque'
            }
        };

        var options = $.extend(config, opts);

        return this.each(function() {
            var $ytBlock   = $(this);
            var $ytVideoID = $ytBlock.attr('id');

            $ytBlock.html('');
            var $videoPlayer = $('<div class="ytVideoPlayer"></div>' ).appendTo($ytBlock);
            var $videoPlayerHolder = $('<div id="ytVH' + $ytVideoID + '" class="ytVideoHolder"></div>').appendTo($videoPlayer);
            var $controls  = $('<div class="ytVPControls"></div>').appendTo($videoPlayer);
            var $bar;
            var $indicator;
            var $loaded;
            var $mute;
            var $play;
            var $seek;

            options.videoID = $ytVideoID;

            $videoPlayer.bind({

                'togglePlay' : function(){
                    $videoPlayer.togglePlay();
                },
                'play'       : function(){
                    $videoPlayer.play();
                },
                'pause'      : function(){
                    $videoPlayer.pause();
                },
                'toggleMute' : function(){
                    $videoPlayer.toggleMute();
                },
                'mute'       : function(){
                    $videoPlayer.mute();
                },
                'unmute'     : function(){
                    $videoPlayer.unMute();
                },
                'seek'       : function(){
                    $videoPlayer.seek();
                },
                'update'     : function(){
                    $videoPlayer.update();
                },
                'cue'        : function(){
                    player.cueVideoById($ytVideoID);
                }

            });

            $videoPlayer.togglePlay = function() {
                if( $play.hasClass('playing') ) {
                    $videoPlayer.pause();
                } else {
                    $videoPlayer.play();
                }
                return false;
            };
      
            $videoPlayer.play = function() {
                player.playVideo();
                $play.removeClass('paused').addClass('playing');
            };
      
            $videoPlayer.pause = function() {
                player.pauseVideo();
                $play.removeClass('playing').addClass('paused');
            };
        
            $videoPlayer.toggleMute = function() {
                if( $mute.hasClass('muted') ) {
                    $videoPlayer.unmute();
                } else {
                    $videoPlayer.mute();
                }
                return false;
            };
      
            $videoPlayer.mute = function() {
                if(player) {
                    player.mute();
                    $mute.addClass('muted');
                }
            };
      
            $videoPlayer.unmute = function() {
                if(player) {
                    player.unMute();
                    $mute.removeClass('muted');
                }
            };
        
            $videoPlayer.seek = function(seek) {
                var seekPosition = Math.round(player.getDuration() * seek);
                player.seekTo(seekPosition, false);
            };
        
            $videoPlayer.update = function() {
                if( player && player.getDuration ) {
                    if( true === player.getPlayerState() ) {
                        $videoPlayer.play();
                    } else if( false === player.getPlayerState() ) {
                        $videoPlayer.pause();
                    }

                    if( player.getVideoBytesLoaded() > -1) {
                        var loadedAmount = ( player.getVideoBytesLoaded() / player.getVideoBytesTotal()) * 100;
                        $loaded.css( 'width', loadedAmount + '%' );
                    }
            
                    if( player.getCurrentTime() > 0 ) {
                        var videoPosition = ( player.getCurrentTime() / player.getDuration() ) * 100;
                        $indicator.css( 'left', videoPosition + '%' );
                    }

                }

            };
    		
            onYouTubePlayerReady = function() {

                player = document.getElementById(options.videoID + '_embed');

                setInterval(function(){
                    $videoPlayer.trigger('update');
                }, 250);
    		  
                $videoPlayer.trigger('cue');

            };
    	
            $videoPlayer.init = function() {
  		  
                $videoPlayer.playerEmbedded = swfobject.embedSWF(
                    'http://www.youtube.com/apiplayer?&enablejsapi=1&playerapiid=' + $ytVideoID,
                    "ytVH" + $ytVideoID,
                    options.width,
                    options.height,
                    '9',
                    null,
                    null,
                    options.params,
                    {
                        id: $ytVideoID + '_embed'
                    }
                    );

                $videoPlayer.addControls();

            };

            $videoPlayer.addControls = function() {

                $play = $('<a/>', {
                    href: '#',
                    'class': 'play-pause',
                    text: 'Odtwórz / Zatrzymaj',
                    click: function() {
                        $videoPlayer.togglePlay();
                        return false;
                    }
                }).appendTo( $controls );
  		    		    	
                $seek = $('<div/>', {
                    'class': 'status',
                    click: function(e) {
                        var skipTo = e.pageX - $seek.offset().left,
                        statusWidth = $seek.width();
                        $videoPlayer.play();
                        $videoPlayer.seek( skipTo / statusWidth );
                    }
                }).appendTo( $controls );

                $bar       = $('<div class="bar"></div>').appendTo($seek);
                $loaded    = $('<div class="loaded"></div>').appendTo($bar);
                $indicator = $('<span class="seeker"></span>').appendTo($bar);

                $mute = $('<a/>', {
                    href: '#',
                    'class': 'volume',
                    text: 'Głośność',
                    click: function() {
                        $videoPlayer.trigger('toggleMute');
                        return false;
                    }
                }).appendTo( $controls );

            };

            $videoPlayer.init();

        });

    };
  
})(jQuery);
