/*
   pad.ma player.js
    >requries: jquery.js

   Player prototype, using HTML5 Video or cortado

   functions:
    player.get()          // returns current position in milliseconds
    player.set(pos)       // seek to position, in milliseconds
    player.play()         // play
    player.pause()        // pause
    player.mute()         // mute audio
    player.unmute()       // unmute audio
*/

//  ----------------------------------------------------------------------------
//  load Player
//  ----------------------------------------------------------------------------
var playerID='player';

$(document).ready(function() {
  var selectedPlayer = detectPlayer();
  if(!document.getElementById(playerID))
    selectedPlayer ='';
  if (selectedPlayer=='video') {  
    player = new VideoPlayer();
  } else if (selectedPlayer=='totem') {
    player = new TotemPlayer();
  } else if (selectedPlayer=='cortado') {
    player = new CortadoPlayer();
  } else {
    player = new Player();
  }
  player.init();
});


//  ----------------------------------------------------------------------------
//  Player prototype
//  ----------------------------------------------------------------------------
function Player() {
  this.supportsOverlay = false;
  this.muted = false;
}
Player.prototype.init = function() {
  this._url = video.urls[video.stream_width];
  this.width = $(this.player).attr('width');
  this.height = $(this.player).attr('height');
  //make overlay settings happy..., add a dummy element
  this.player = $('<div></div');
}
Player.prototype.play = function() { }
Player.prototype.pause = function() { }
Player.prototype.get = function() { }
Player.prototype.set = function(pos) { }
Player.prototype.mute = function(pos) { }
Player.prototype.unmute = function(pos) { }
Player.prototype.url = function(pos) {
  var timecode = pos2npt(pos);
  var link = this._url;
  if(pos > 0)
    link += "?t=npt:" + timecode;
  return link;
};
Player.prototype.update = function(url, width, height) {
  var old_url = this._url;
  this._url = url;
  this.width = width;
  this.height = height;
  if(this.player) {
    $(this.player).attr('width', width);
    $(this.player).attr('height', height);
  }
  if (this.isPlaying && old_url != url) {
    this.set(this.get());
  }
};

//  ----------------------------------------------------------------------------
//  <video> HTML5 Player 
//  ----------------------------------------------------------------------------
function VideoPlayer() {
  this.supportsOverlay = true;
  this.isPlaying = false;
}
VideoPlayer.prototype = new Player();
VideoPlayer.prototype.init = function() {
  this.player = document.getElementById(playerID);
  this._url = video.urls[video.stream_width];
  this.width = $(this.player).attr('width');
  this.height = $(this.player).attr('height');
}
VideoPlayer.prototype.canSeek = function(pos) {
  return true;
  return this.url(pos).substring(0, 4) == 'file' || this.url(pos).substring(0, 9) == 'pad.ma://';
}
VideoPlayer.prototype.set = function(pos) {
  this.pos = pos;
  if(this.canSeek(pos)) {
    if(!this.player.src || this.player.src != this.url(0)) {
        var _this = this;
        $(this.player).one('loadedmetadata', function() {
            _this.player.currentTime = pos/1000;
            _this.player.play();
        });
        this.player.src = this.url(0);
        //workaround for old html5 video api in Firefox 3.x
        if(/Firefox\/3/.test(navigator.userAgent)) {
            this.player.load();
        }
    } else {
        this.player.currentTime=pos/1000;
        this.player.play();
    }
  } else { // server side seeking
    var url = this.url(pos);
    this.player.src = url;
    this.player.load();
    //wait for browser to read some data,
    //this.player.autoplay=true; should do the same but does not work properly in ff3.1
    this.player.autoplay = true;
    //setTimeout(function(player) {
    //  return function() { player.play(); };
    //}(this.player), 1000);
  }
}

VideoPlayer.prototype.get = function() {
  var pos = this.pos;
  if (this.canSeek(1)) {
    pos = 0;
  }
  try {
    var currentTime = this.player.currentTime;
    if(this.player.initialTime)
        currentTime -= this.player.initialTime;
    if(/chrome\/9/.test(navigator.userAgent.toLowerCase())) //chrome9 does not remove ogg offset at begining.
        currentTime -= pos/1000;
    return pos + parseInt(currentTime * 1000);
  } catch(err) { }
  return -1;
}
VideoPlayer.prototype.play = function() {
  this.isPlaying = true;
  this.player.play();
}
VideoPlayer.prototype.pause = function() {
  this.isPlaying = false;
  this.player.pause();
}
VideoPlayer.prototype.mute = function(pos) {
  this.player.muted = true;
  this.muted = true;
}
VideoPlayer.prototype.unmute = function(pos) {
  this.player.muted = false;
  this.muted = false;
}

//  ----------------------------------------------------------------------------
//  Totem Player 
//  ----------------------------------------------------------------------------
function TotemPlayer() {
  this.volume = 1;
  this.player = false;
  this.isPlaying = false;
}
TotemPlayer.prototype = new Player();
TotemPlayer.prototype.init = function() {
  var element = $('#' + playerID);
  this._url = video.urls[video.stream_width];
  this.width = $(element).attr('width');
  this.height = $(element).attr('height');
}
TotemPlayer.prototype.set = function(pos) {
  var url = this.url(pos);

  var autoplay = 'true';
  if(this.isPlaying)
    varautoplay = 'true';
  if(this.player) {
    var element = $(this.player);
    this.player.Stop();
  } else {
    var element = $('#' + playerID);
  }
  this.player = document.createElement('embed');
  this.player.type = 'video/ogg';
  this.player.id = playerID;
  this.player.width = this.width;
  this.player.height = this.height;
  this.player.setAttribute('src', url);
  this.player.setAttribute('controller', false);
  this.player.setAttribute('autoplay', autoplay);
  element.replaceWith(this.player);
}
TotemPlayer.prototype.play = function() {
  this.isPlaying = true;
  this.player.Play();
}
TotemPlayer.prototype.pause = function() {
  this.isPlaying = false;
  this.player.Stop();
}


//  ----------------------------------------------------------------------------
//  Cortado Player 
//  ----------------------------------------------------------------------------
function CortadoPlayer() {
  this.muted = false;
  this.pos = 0;
  this.isPlaying = false;
  this.CortadoLocation="/static/cortado.jar";
}
CortadoPlayer.prototype = new Player();
CortadoPlayer.prototype.init = function() {
  var element = $('#' + playerID);
  this._url = video.urls[video.stream_width];
  this.width = $(element).attr('width');
  this.height = $(element).attr('height');
}
CortadoPlayer.prototype.set = function(pos) {
  this.pos = pos;
  if(this.isPlaying) {
    this.player.setParam("url", this.url(this.pos));
    this.player.restart();
  }
}
CortadoPlayer.prototype.get = function() {
  try {
    return this.pos + parseInt(this.player.getPlayPosition()*1000);
  } catch(e) {
  }
  return -1;
}
CortadoPlayer.prototype.mute = function(pos) {
  this.muted = true;
  if(this.isPlaying)
    this.player.muted = true;
}
CortadoPlayer.prototype.unmute = function(pos) {
  this.muted = false;
  if(this.isPlaying)
    this.player.muted = false;
}
CortadoPlayer.prototype.play = function() {
  if(!this.isPlaying) {
    var element = $('#' + playerID);
    var url = this.url(this.pos);
    this.player = document.createElement('object');
    this.player.setAttribute('classid', 'java:com.fluendo.player.Cortado.class');
    this.player.type = 'application/x-java-applet';
    this.player.setAttribute('archive', this.CortadoLocation);
    this.player.id = playerID;
    this.player.width = this.width;
    this.player.height = this.height;

    var params = {
      'code': 'com.fluendo.player.Cortado',
      'archive': this.CortadoLocation,
      'url': url,
      'local': 'false',
      'keepAspect': 'false',
      'video': 'true',
      'audio': 'true',
      'seekable': 'false',
      'showStatus': 'hide',
      'autoPlay': 'true',
      'bufferSize': '120',
      'duration': (video.duration-this.pos)/1000,
      'debug': 0
    }
    for(name in params){
      var p = document.createElement('param');
      p.name = name;
      p.value = params[name];
      this.player.appendChild(p);
    }
    element.replaceWith(this.player);
  }
  if(this.muted)
    this.mute();
  this.isPlaying=true;
}

CortadoPlayer.prototype.pause = function() {
  this.pos = this.get();
  if(this.isPlaying) {
    this.player.doStop();
    var element = $('<div />');
    element.attr('id', playerID);
    $(this.player).replaceWith(element);
  }
  this.isPlaying=false;
}

//  ----------------------------------------------------------------------------
//  Player detection Functions
//  ----------------------------------------------------------------------------
function supportedMimeType(mimetype) {
  for (var i = navigator.plugins.length; i-- > 0; ) {
    var plugin = navigator.plugins[i];
    if (typeof plugin[mimetype] != "undefined")
      return true;
  }
  return false;
}

function detectVLC() {
  var mimetype="application/x-vlc-plugin";
  var vlc = false;
  var totem = false;
  for (var i = navigator.plugins.length; i-- > 0; ) {
    var plugin = navigator.plugins[i];
    if (typeof plugin[mimetype] != "undefined") {
      if(plugin.name.toLowerCase().match('totem')) {
        totem = true;
      } else {
       vlc = true;
      }
    }
  }
  if(totem) vlc=false;
  return vlc;
}

function detectTotem() {
  var mimetype="video/ogg";
  for (var i = navigator.plugins.length; i-- > 0; ) {
    var plugin = navigator.plugins[i];
    if (typeof plugin[mimetype] != "undefined") {
      if(plugin.name.toLowerCase().match('totem')) {
        return true;
      }
    }
  }
  return false;
}


function detectPlayer() {
  var selectedPlayer = '';
  //native video tag support
  var video = document.createElement('video');
  if (video.canPlayType && video.canPlayType('video/ogg;codecs="theora,vorbis"') == "probably") {
    selectedPlayer = 'video';
  }
  //detect plugins
  if(!selectedPlayer) {
    if(supportedMimeType('application/x-java-applet') || navigator.javaEnabled()) {
      selectedPlayer = 'cortado';
    } else if (detectTotem()) {
      selectedPlayer = 'totem';
    } else if($.browser.safai && supportedMimeType('video/ogg')) {
      selectedPlayer = 'ogg';
    }
  }
  return selectedPlayer;
}

function strpad(str, pad, len, dir) {
  while (str.length < len) {
  if (dir == 'left')
    str = pad + str;
  else if (dir == 'right')
    str = str + pad;
  }
  return str;
}

function pos2npt(pos) {
  var s, ss, mm, ms, hh, npt;
  s = parseInt(pos / 1000)
  ms = pos - s * 1000;
  ss = s % 60;
  mm = ((s - ss) / 60) % 60;
  hh = ((s - (mm * 60) - ss) / 3600) % 60;
  npt = hh+':'+strpad(mm.toString(), '0', 2, 'left');
  npt += ':'+strpad(ss.toString(), '0', 2, 'left');
  npt += '.'+strpad(ms.toString(), '0', 3, 'left');
  return npt;
}


