// Flowplayer API Connector
VideoJS.tech.youtube = {
  name: "YouTube",
  
  supported: function(){
    // Flash Player 8 or higher
    return true;
  },
  canPlaySource: function(sourceObj){
    return sourceObj.type == "video/youtube";
  },
  supports: {
    format: {},
    event: {
      progress: false,
      timeupdate: false
    }
  },
  init: function(sourceObj){
    var player = this,
        placeHolder = _V_.createElement("div", { id: player.box.id + "_temp_ytswf" }),
        objId = player.box.id+"_youtube_api";

        flashvars = {
        },

        params = {
          allowScriptAccess: "always",
          wmode: "opaque",
          bgcolor: "#000000"
        },

        attributes = {
          id: objId,
          name: objId,
          'class': 'vjs-tech'
        };

    this.addEvent("techready", function(){
      var url = sourceObj.src;

      if (url.indexOf("http://") == 0) {
        // Get Youtube ID from URL
        url = url.match(/v=([^&]+)/)[1];
      }
      this.tels.youtube.cueVideoById(url);
    });

    player.box.appendChild(placeHolder);

    swfobject.embedSWF("http://www.youtube.com/apiplayer?" +
                       "version=3&enablejsapi=1&playerapiid=" + objId,
                       placeHolder.id, "480", "295", "9", null, null, params, attributes);
  },
  stateChange: function(id, state){
    var player = _V_(id);

    if (state == 0) {
      player.triggerEvent("ended");
    } else if (state == 1) {
      player.triggerEvent("play");
      player.triggerEvent("playing");
    } else if (state == 2) {
      player.triggerEvent("pause");
    }
  },
  
  error: function(id, errorCode){
    _V_.log(id, errorCode);
  },

  api: {
    setupTriggers: function(){
      this.tels.youtube.addEventListener("onStateChange", 
        "(function(state){ _V_.tech.youtube.stateChange('"+this.id+"',state); })");

      this.tels.youtube.addEventListener("onError", 
        "(function(errorCode){ _V_.tech.youtube.error('"+this.id+"',errorCode); })");

    },

    play: function(){ this.tels.youtube.playVideo(); },
    pause: function(){ this.tels.youtube.pauseVideo(); },
    paused: function(){
      return this.tels.youtube.getPlayerState() !== 1; // More accurate than isPaused
    },

    currentTime: function(){ return this.tels.youtube.getCurrentTime(); },
    setCurrentTime: function(seconds){
      // False blocks seek-ahead.
      this.tels.youtube.seekTo(seconds, true);
    },

    duration: function(){
      return this.tels.youtube.getDuration();
    },

    buffered: function(){
      var percent = this.tels.youtube.getVideoBytesLoaded() / this.tels.youtube.getVideoBytesTotal(),
          seconds = this.duration() * percent;
      return _V_.createTimeRange(0, seconds);
    },

    volume: function(){ return _V_.round(this.tels.youtube.getVolume() / 100, 2); },
    setVolume: function(percentAsDecimal){
      this.tels.youtube.setVolume(parseInt(percentAsDecimal * 100));

      // Youtube Doesn't support VolumeChange Events
      this.triggerEvent("volumechange");
    },
    muted: function(){ return this.tels.youtube.isMuted(); },
    setMuted: function(bool){
      if (bool) {
        this.tels.youtube.mute()
      } else {
        this.tels.youtube.unMute()
      }
    },

    supportsFullScreen: function(){
      return false; // Flash does not allow fullscreen through javascript
      // Maybe at click listener, and say "click screen".
    },
    enterFullScreen: function(){ this.tels.flowplayer.api.toggleFullscreen(); },

    src: function(src){
      this.tels.youtube.cueVideoById(src);
    },
    load: function(){
      // Youtube will autoload?
    }
  }
};

// YouTube Defined Player Ready Callback
window.onYouTubePlayerReady = function(playerId) {
  var el = _V_.el(playerId),
      player = el.parentNode.player; // Get player from box

  el.player = player;

  // Update reference to playback technology element
  player.tels.youtube = el;

  player.triggerEvent("techready");
}


