/*******************************************************************************
 jquery.mb.components
 Copyright (c) 2001-2010. Matteo Bicocchi (Pupunzi); Open lab srl, Firenze - Italy
 email: mbicocchi@open-lab.com
 site: http://pupunzi.com

 Licences: MIT, GPL
 http://www.opensource.org/licenses/mit-license.php
 http://www.gnu.org/licenses/gpl.html
 ******************************************************************************/

/*
 * jQuery.mb.components: jquery.mb.YTPlayer
 * version: 1.2 - 6-feb-2010 - 43
 * © 2001 - 2010 Matteo Bicocchi (pupunzi), Open Lab
 *
 */

(function($j){

  $j.YTPlayer={
    name:"jquery.mb.YTPlayer",
    version:1.2,
    author:"Matteo Bicocchi",
    width:450,
    controls:{
      play:"<img src='images/play.png'>",
      pause:"<img src='images/pause.png'>",
      mute:"<img src='images/mute.png'>",
      unmute:"<img src='images/unmute.png'>"
    },
    rasterImg:"images/raster.png",
    setYTPlayer:function(){
      var players=this;
      $j.getScript("http://ajax.googleapis.com/ajax/libs/swfobject/2/swfobject.js",function(){
        players.each(function(){

          if(!$j(this).is("a")) return;

          if (!$j(this).attr("id")) $j(this).attr("id", "YTP_"+new Date().getMilliseconds());
          var ID=$j(this).attr("id");


          var dataObj=$j("<span/>");
          dataObj.attr("id",ID+"_data").hide();
          var data= dataObj.get(0);

          data.opacity=1;
          data.isBgndMovie=false;
          data.width=$j.YTPlayer.width;
          data.quality="default";
          data.muteSound=false;
          data.hasControls=false;
          data.ratio="16/9";
          data.bufferImg=false;

          var BGisInit = typeof document.YTPBG != "undefined";

          if ($j.metadata){
            $j.metadata.setType("class");
            if ($j(this).metadata().quality) data.quality=$j(this).metadata().quality;
            if ($j(this).metadata().width) data.width=$j(this).metadata().width;
            if ($j(this).metadata().opacity) data.opacity=$j(this).metadata().opacity;
            if ($j(this).metadata().isBgndMovie && !BGisInit) {
              data.isBgndMovie=$j(this).metadata().isBgndMovie;
              data.width=$j(this).metadata().isBgndMovie.width? $j(this).metadata().isBgndMovie.width:"window";
            }

            if ($j(this).metadata().muteSound) {data.muteSound=$j(this).metadata().muteSound;}
            if ($j(this).metadata().hasControls) {data.hasControls=$j(this).metadata().hasControls;}
            if ($j(this).metadata().ratio) {data.ratio=$j(this).metadata().ratio;}
            if ($j(this).metadata().bufferImg) {data.bufferImg=$j(this).metadata().bufferImg;}
            if ($j(this).metadata().ID) {data.ID=$j(this).metadata().ID;}
          }

          var el= data.ID?$j("#"+data.ID):$j("body");

          if(data.width=="window") {
            data.height="100%";
            data.width= "100%";
            if(data.ID){
              data.height=el.outerHeight()+40;
              data.width= el.outerWidth();
            }
          }
          else
            data.height= data.ratio=="16/9" ? Math.ceil((9*data.width)/16):Math.ceil((3*data.width)/4);

          var videoWrapper="";

          $j(el).append(dataObj);
          if(data.isBgndMovie){
            //            $j(el).css({position:"relative",zIndex:1});
            if ($j.browser.msie && $j.browser.version < 8 || data.ID){
              var bodyWrapper=$j("<div/>").css({position:"relative",zIndex:0});
              $j(el).wrapInner(bodyWrapper);
              $j(el).prepend($j(this));
            }else
              $j(el).after($j(this));

            var pos= data.ID?"absolute":"fixed";

            videoWrapper=$j("<div/>").attr("id","wrapper_"+ID).css({overflow:"hidden",position:pos,left:0,top:0, width:"100%", height:"100%"});
            $j(this).wrap(videoWrapper);
            if(!data.width.toString().indexOf("%")==-1) {
              var videoDiv=$j("<div/>").css({position:pos,top: data.ratio=="4/3" && !data.ID?-(data.height/4):0,left:0, display:"block", width:data.width, height:data.height});
              $j(this).wrap(videoDiv);
            }
          }else{
            videoWrapper=$j("<span/>").attr("id","wrapper_"+ID).css({width:data.width, height:data.height, position:"relative"}).addClass("mb_YTVPlayer");
            $j(this).wrap(videoWrapper);
          }

          var params = { allowScriptAccess: "always", wmode:"transparent", allowFullScreen:"true" };
          var atts = { id: ID };
          data.movieURL=($j(this).attr("href").match( /[\\?&]v=([^&#]*)/))[1];

          //swfobject.embedSWF(swfUrl, id, width, height, version, expressInstallSwfurl, flashvars, params, attributes, callbackFn)
          swfobject.embedSWF("http://www.youtube.com/apiplayer?enablejsapi=1&version=3&playerapiid="+ID,ID, data.width, data.height, "8", null, null, params, atts);
        });
      });
    },
    setMovie: function(){
      var player = $j(this).get(0);
      var data = $j("#"+player.id+"_data").get(0);
      var BGisInit = typeof document.YTPBG != "undefined";
      var movieID= data.movieURL;

      $j(player).css({opacity:data.opacity});
      var pos= data.ID?"absolute":"fixed";

      //if it is as background
      if(data.isBgndMovie && !BGisInit){
        var raster=$j("<div/>").addClass("mbYTP_raster").css({position:pos,top:0,left:0,width:"100%",height:"100%",background:"url("+$j.YTPlayer.rasterImg+")"}).hide();
        var bufferImg=data.bufferImg?$j("<div/>").addClass("mbYTP_bufferImg").css({position:pos,top:0,left:0,width:"100%",height:"100%",background:"url("+data.bufferImg+")"}).hide():false;
        var playerContainer=$j(player).parents("div:first");
        var ratio=data.ratio;

        //       $j(playerContainer).css({width:"100%", height:"100%"});

        //can't be more than one bgnd
        if(!data.ID) document.YTPBG=true;
        $j(playerContainer).after(raster);
        if (data.bufferImg) raster.after(bufferImg);
      }

      if(data.isBgndMovie) {
        player.loadVideoByUrl("http://www.youtube.com/v/"+movieID, 0);
        if (data.isBgndMovie.mute) player.mute();
      }else{
        player.cueVideoByUrl("http://www.youtube.com/v/"+movieID, 0);
        $j(player).buildYTPControls();
      }

      player.setPlaybackQuality(data.quality);
      player.addEventListener("onStateChange", '(function(state) { return playerState(state, "' + player.id + '"); })');
    },
    playYTP: function(){
      var player= $j(this).get(0);
      var playBtn=$j(player).parent().find(".mb_YTVPPlaypause");
      playBtn.html($j.YTPlayer.controls.pause);
      player.playVideo();
    },
    stopYTP:function(){
      var player= $j(this).get(0);
      var playBtn=$j(player).parent().find(".mb_YTVPPlaypause");
      playBtn.html($j.YTPlayer.controls.play);
      player.pauseVideo();
    },
    pauseYTP:function(){
      var player= $j(this).get(0);
      var playBtn=$j(player).parent().find(".mb_YTVPPlaypause");
      playBtn.html($j.YTPlayer.controls.play);
      player.pauseVideo();

    },
    // todo
    setYTPVolume:function(val){
      var player= $j(this).get(0);
      var VolumeBtn=$j(player).parent().find(".mb_YTVPVolume");
      player.setVolume(val);

    },
    muteYTPVolume:function(){
      var player= $j(this).get(0);
      var muteBtn=$j(player).parent().find(".mb_YTVPMuteUnmute");
      muteBtn.html($j.YTPlayer.controls.unmute);
      player.mute();

    },
    unmuteYTPVolume:function(){
      var player= $j(this).get(0);
      var muteBtn=$j(player).parent().find(".mb_YTVPMuteUnmute");
      muteBtn.html($j.YTPlayer.controls.mute);
      player.unMute();

    },
    manageYTPProgress:function(){
      var player= $j(this).get(0);
      var YTPlayer= $j(player).parent(".mb_YTVPlayer");
      var progressBar= YTPlayer.find(".mb_YTVPProgress");
      var loadedBar=YTPlayer.find(".mb_YTVPLoaded");
      var timeBar=YTPlayer.find(".mb_YTVTime");
      var totW= progressBar.outerWidth();

      var startBytes= player.getVideoStartBytes();
      var totalBytes= player.getVideoBytesTotal();
      var loadedByte= player.getVideoBytesLoaded();
      var currentTime=Math.floor(player.getCurrentTime());
      var totalTime= Math.floor(player.getDuration());
      var timeW= (currentTime*totW)/totalTime;
      var startLeft=0;

      if(startBytes) {
        startLeft=player.timeW;
      }

      var loadedW= (loadedByte*(totW-startLeft))/totalBytes;
      loadedBar.css({left:startLeft, width:loadedW});
      timeBar.css({left:0,width:timeW});
      return {totalTime:totalTime,currentTime: currentTime};
    },
    buildYTPControls:function(){
      var player= $j(this).get(0);
      if (typeof player.isInit != "undefined") return;
      player.isInit=true;
      var YTPlayer= $j(this).parent(".mb_YTVPlayer");
      var controlBar=$j("<span/>").addClass("mb_YTVPBar").css({whiteSpace:"noWrap",position:"absolute"}).hide();
      var playpause =$j("<span>"+$j.YTPlayer.controls.play+"</span>").addClass("mb_YTVPPlaypause").click(function(){
        if(player.getPlayerState()== 1){
          $j(player).pauseYTP();
        }else{
          $j(player).playYTP();
        }
      });
      var MuteUnmute=$j("<span>"+$j.YTPlayer.controls.mute+"</span>").addClass("mb_YTVPMuteUnmute").click(function(){
        if(player.isMuted()){
          $j(player).unmuteYTPVolume();
        }else{
          $j(player).muteYTPVolume();
        }
      });
      var idx=$j("<span/>").addClass("mb_YTVPTime");
      var progressBar =$j("<div/>").addClass("mb_YTVPProgress").css("position","absolute").click(function(e){
        timeBar.css({width:(e.clientX-timeBar.offset().left)});
        player.timeW=e.clientX-timeBar.offset().left;
        YTPlayer.find(".mb_YTVPLoaded").css({width:0});
        var totalTime= Math.floor(player.getDuration());
        player.goto=(timeBar.outerWidth()*totalTime)/progressBar.outerWidth();
        player.seekTo(player.goto, true);
        YTPlayer.find(".mb_YTVPLoaded").css({width:0});
      });
      var loadedBar = $j("<div/>").addClass("mb_YTVPLoaded").css("position","absolute");
      var timeBar = $j("<div/>").addClass("mb_YTVTime").css("position","absolute");
      progressBar.append(loadedBar).append(timeBar);
      controlBar.append(playpause).append(MuteUnmute).append(idx).append(progressBar);
      YTPlayer.append(controlBar);

      YTPlayer.hover(function(){
        controlBar.fadeIn();
        clearInterval(player.getState);
        player.getState=setInterval(function(){
          var prog= $j(player).manageYTPProgress();
          $j(".mb_YTVPTime").html($j.YTPlayer.formatTime(prog.currentTime)+" / "+ $j.YTPlayer.formatTime(prog.totalTime));
          if(player.getPlayerState()== 1 && $j(".mb_YTVPPlaypause").html()!=$j.YTPlayer.controls.pause) YTPlayer.find(".mb_YTVPPlaypause").html($j.YTPlayer.controls.pause);
          if(player.getPlayerState()== 2) YTPlayer.find(".mb_YTVPPlaypause").html($j.YTPlayer.controls.play);
        },500);
      },function(){
        controlBar.fadeOut();
        clearInterval(player.getState);
      });
    },
    formatTime: function(s){
      var min= Math.floor(s/60);
      var sec= s-(60*min);
      return (min<9?"0"+min:min)+" : "+(sec<9?"0"+sec:sec);
    }
  };

  $j.fn.mb_YTPlayer = $j.YTPlayer.setYTPlayer;
  $j.fn.mb_setMovie = $j.YTPlayer.setMovie;

  $j.fn.buildYTPControls = $j.YTPlayer.buildYTPControls;
  $j.fn.playYTP = $j.YTPlayer.playYTP;
  $j.fn.stopYTP = $j.YTPlayer.stopYTP;
  $j.fn.pauseYTP = $j.YTPlayer.pauseYTP;
  $j.fn.muteYTPVolume = $j.YTPlayer.muteYTPVolume;
  $j.fn.unmuteYTPVolume = $j.YTPlayer.unmuteYTPVolume;

  $j.fn.manageYTPProgress = $j.YTPlayer.manageYTPProgress;

})(jQuery);

function onYouTubePlayerReady(playerId) {
  var player=$j("#"+playerId);
  player.mb_setMovie();
}

function playerState(state, el) {
  var player=$j("#"+el).get(0);
  var data = $j("#"+player.id+"_data").get(0);
  if (state==0 && data.isBgndMovie) {
    player.playVideo();
  }
  if ((state==-1 || state==3) && data.isBgndMovie) {
    $j(player).css({opacity:0});
    $j(".mbYTP_raster").css({opacity:.5,backgroundColor:"black"}).fadeIn();
    $j(".mbYTP_bufferImg").css({opacity:.2}).fadeIn();
    if (!$j.browser.msie){
      $j("#wrapper_"+player.id).css({opacity:0});
    }
  }
  if (state==1 && data.isBgndMovie) {
    $j(player).css({opacity:data.opacity});
    $j(".mbYTP_raster").css({opacity:1,backgroundColor:"transparent"});
    $j(".mbYTP_bufferImg").fadeOut();
    if (!$j.browser.msie)
      $j("#wrapper_"+player.id).animate({opacity:1},1000);
  }

  if(state==1 && !data.isBgndMovie)
    player.totalBytes=player.getVideoBytesTotal();

  if (state==0 && !data.isBgndMovie) {
    $j(player).stopYTP();
  }
}
