//=============
// Mediaplayer
//=============

var player = null, controls, timer;

var currentVolume, currentMuteState, currentPosition, oldPosition, currentPlayState, duration, playerHeight, playerWidth, hasCaptions, isPlaylist, currentCaptionState, type, reference, initiated = false;

// Initialize. Called when player ready.
function playerReady(obj) {
  player = $('#'+obj['id']).get(0);
  reference = $(player).closest('.mediaPlayer');
  
  if ( initiated ) return;
  
  initiated = true;
  
  //make the player not focusable by keyboard
  $(player).attr('tabindex','-1');
  
  isPlaylist = ( player.getConfig().type == undefined ) ? true : false;
  
  type = player.getConfig().type == 'sound' ? 'sound' : 'video';
  
  currentVolume = player.getConfig().volume;
  currentMuteState = false;
  currentPosition = player.getConfig().start;
  player.hideCaptions(true);
  if ( isPlaylist ) {
    hasCaptions = player.getPlaylist()[0].captions ? true : false;
  } else {
    hasCaptions = player.getConfig().captions ? true : false;
  }
  currentCaptionState = false;
    
  oldPosition = currentPosition;
  duration = player.getPlaylist()[0].duration;
  playerHeight = player.getConfig().height;
  playerWidth = player.getConfig().width;
  
  controls = createControls();
  timer = createTimer();
  timer.current.find('strong').text(formatTime(currentPosition));
  timer.duration.find('strong').text(formatTime(duration));
  
  
  if ( isPlaylist ) {
    createPlaylist();
  }
  
  updateVolume();
  
  addListeners();
  
  setInterval(updateTimer, 500);

  // Timeprogress
  timer.progress.click(function(e) {
    // relative click position inside the div
    var x = e.pageX - Math.ceil($(this).offset().left);
	  var calcpos = duration * ( x / $(this).innerWidth() );
	  
	  player.sendEvent("SEEK", calcpos);
  });  

  // Play
  controls.play.click(function() {
    player.sendEvent("PLAY");
    return false;
  });
  
  // Stop
  controls.stop.click(function() {
    player.sendEvent("STOP");
    if ( type != 'sound' && !controls.resize.hasClass('smallSize') )
      controls.resize.trigger('click');
    return false;
  });
  
  // Go back by 5% of length, unless that is less than 10 seconds
  controls.seekBackward.click(function() {
    var skiptime = 10;
    if (duration / 20 > 10) {
      skiptime = Math.floor(eval(duration / 20));
    } 
    var calcpos = currentPosition - skiptime;
    player.sendEvent("SEEK", calcpos);
    return false;
  });
  
  // Go forward by 5% of length, unless that is less than 10 seconds
  controls.seekForward.click(function() {
    var skiptime = 10;
    if (duration / 20 > 10) {
      skiptime = Math.floor(eval(duration / 20));
    } 
    var calcpos = currentPosition + skiptime;
    player.sendEvent("SEEK", calcpos);
    return false;
  });
  
  // Volume Bar
  controls.volume.click(function(e) {
    // relative click position inside the div
    var x = e.pageX - Math.ceil($(this).offset().left);
	  var volume = Math.round(100 * ( x / $(this).innerWidth() ));
	  
    player.sendEvent("VOLUME", volume);
  });
  
  // Volume Down
  controls.volumeDown.click(function() {
    var volume = currentVolume - 10;
    volume = ( volume <= 0 ) ? 0 : volume;
    player.sendEvent("VOLUME", volume);
    return false;
  });
  
  // Volume Up
  controls.volumeUp.click(function() {
    var volume = currentVolume + 10;
    volume = ( volume >= 100 ) ? 100 : volume;
    player.sendEvent("VOLUME", volume);
    return false;
  });
  
  // Mute
  controls.mute.click(function() {
    player.sendEvent("MUTE");
    return false;
  });
  
  // Resize
  if ( type != 'sound' ) {
    controls.resize.click(function() {
      if ( $(this).hasClass('smallSize') ) {
        $(this)
          .removeClass('smallSize')
          .attr('title', 'Verkleinern')
          .html('<span class="hidden">Verkleinern</span>');
        reference.addClass('bigSize');
        var bigHeight = Math.floor(920 / (playerWidth / playerHeight));
        reference.find('.objectWrapper').css( { width: '960px', height: bigHeight+'px', verticalAlign: 'middle'} );
      } else {
        $(this)
          .addClass('smallSize')
          .attr('title', 'Vergrößern')
          .html('<span class="hidden">Vergrößern</span>');
        reference.removeClass('bigSize');
        reference.find('.objectWrapper').css( { width: playerWidth+'px', height: playerHeight+'px'} );
      }
      return false;
    });
  }
  
  // Captions
  controls.captions.click(function() {
    if ( currentCaptionState == false ) {
      player.hideCaptions(false);
      currentCaptionState = true;
      $(this)
        .addClass('on')
        .attr('title', 'Untertitel aussschalten')
        .html('<span class="hidden">Untertitel aussschalten</span>');
    } else {
      player.hideCaptions(true);
      currentCaptionState = false;
      $(this)
        .removeClass('on')
        .attr('title', 'Untertitel einschalten')
        .html('<span class="hidden">Untertitel einschalten</span>');
    }
    return false;
  });
  
  function createControls () {
   reference.find('.objectWrapper').after('<div class="mediaControlPanel"><span class="hidden">Videosteuerung</span><ul class="mediaControls clearfix"></ul></div>');
    if ( type == 'sound' ) {
      reference.find('.objectWrapper').css( { height: playerHeight+'px', opacity: 0} );
      reference.find('.mediaControlPanel').css({marginTop: '-20px'}).find('span').text('Audiosteuerung');
    }
   reference.find('.mediaControlPanel').width(playerWidth+'px');
    var controls =reference.find('.mediaControls');
    var controlsObject = {};
    var defineControls = {
      play: '<li class="mediaPlayControls"><a class="mediaplay" title="Start" href="#"><span class="hidden">Start</span></a></li>',
      stop: '<li class="mediaPlayControls"><a class="mediastop" title="Stop" href="#"><span class="hidden">Stop</span></a></li>',
      seekBackward: '<li class="mediaPlayControls"><a class="mediaseekBackward" title="Zurück" href="#"><span class="hidden">Zurück</span></a></li>',
      seekForward: '<li class="mediaPlayControls"><a class="mediaseekForward" title="Vor" href="#"><span class="hidden">Vor</span></a></li>',
      volumeDown: '<li class="mediaVolumeControls"><a class="mediavolumeDown" title="Leiser" href="#"><span class="hidden">Leiser</span></a></li>',
      volume: '<li class="mediaVolumeControls mediavolume"><span class="hidden"></span><div class="mediavolumeInner" /></li>',
      volumeUp: '<li class="mediaVolumeControls"><a class="mediavolumeUp" title="Lauter" href="#"><span class="hidden">Lauter</span></a></li>',
      mute: '<li class="mediaVolumeControls"><a class="mediamute" title="Ton ausschalten" href="#"><span class="hidden">Ton ausschalten</span></a></li>'
    };
    
    if ( type != 'sound' ) {
      defineControls['resize'] = '<li class="mediaExtrasControls"><a class="mediaresize smallSize" title="Vergrößern" href="#"><span class="hidden">Vergrößern</span></a></li>';
      defineControls['captions'] = '<li class="mediaExtrasControls"><a class="mediacaptions" title="Untertitel einschalten" href="#"><span class="hidden">Untertitel einschalten</span></a></li>';
    }
    
    $.each(defineControls, function(key, value) {
      controls.append(value);
      controlsObject[key] = controls.find('.media'+key);
    });
    
    if ( type != 'sound' && !hasCaptions ) {
      controlsObject.captions.parent().hide();
    }
    
    reference.find('.mediaPlayControls').wrapAll('<ul class="mediaPlayControls"></ul>');
    reference.find('.mediaVolumeControls').wrapAll('<ul class="mediaVolumeControls"></ul>');
    reference.find('.mediaExtrasControls').wrapAll('<ul class="mediaExtrasControls"></ul>');
    
    reference.find('.copyright').remove().clone().appendTo('.mediaControlPanel', reference).show();
    reference.addClass('controlsAdded');
    
    return controlsObject;
  }
  
  function createTimer () {
   reference.find('.mediaControls').before('<div class="mediaTimer clearfix"></div>');
    var timer = reference.find('.mediaTimer');
    var timerObject = {};
    
    $.each({
      current: '<div class="timercurrent"><span class="hidden">Aktuelle Position</span> <strong></strong></div>',
      progress: '<div class="timerprogress"><div class="timerinnerProgress"></div></div>',
      duration: '<div class="timerduration"><span class="hidden">Aktuelle Position</span> <strong></strong></div>'
    }, function(key, value) {
      timer.append(value);
      timerObject[key] = timer.find('.timer'+key);
    });
    
    reference.addClass('timerAdded');
    
    return timerObject;
  }
  
  function createPlaylist () {
   reference.find('.mediaControlPanel').addClass('isPlaylist').prepend('<ol class="playlist"></ol>');
    var playlist =reference.find('.playlist');
    
    $.each(player.getPlaylist(), function(i, item) {
      playlist.append('<li class="clearfix"><a href="#" class="playlistItem'+i+'">'+item.title+'</a> <span>'+formatTime(item.duration)+'</span></li>');
    });
    
    playlist.find('li').each(function(i) {
      $(this)
      .hover(
        function() {
          $(this).addClass('hover');
        },
        function() {
          $(this).removeClass('hover');
        }
      )
      .click(function() {
        playlist.find('li').removeClass('active');
        $(this).addClass('active');
        player.sendEvent("ITEM", i);
        return false;
      });
      
      if ( i == 0 ) $(this).addClass('active');
      
      if ( type == 'sound' && reference.find('.audioDownload').length ) {
        updateAudioDownload(player.getPlaylist()[0]);
      }
    });
  }
  
  function updateTimer () {
    if (currentPosition != oldPosition) {
      var percent = ((currentPosition / duration)*100) + '%';
      reference.find('.timerinnerProgress').css('width', percent);
      timer.current.find('strong').text(formatTime(currentPosition));
    }
    
    oldPosition = currentPosition;
  }
}

/*---------- Listeners ------------- */

// add Eventlisteners
function addListeners () {
  if ( player ) {
    player.addModelListener('STATE', 'playListener');
    player.addModelListener("TIME", "timeListener");
    player.addControllerListener("ITEM", "itemListener");
    player.addControllerListener("VOLUME", "volumeListener"); 
    player.addControllerListener("MUTE", "muteListener");
  } else {
    setTimeout(addListeners, 100);
  }
}

// Listen to Play
function playListener (obj) {
  currentPlayState = obj.newstate;
  var isPlay = ( currentPlayState == 'PLAYING' || currentPlayState == 'BUFFERING' ) ? true : false;
  
  if ( isPlay ) {
    controls.play
      .addClass('pause')
      .attr('title', 'Pause')
      .html('<span class="hidden">Pause</span>');
  } else {
    controls.play
      .removeClass('pause')
      .attr('title', 'Start')
      .html('<span class="hidden">Start</span>');
  }
}

// Listen to changed Playlistitem Event
function itemListener (obj) {
  duration = player.getPlaylist()[obj.index].duration;
  timer.duration.find('strong').text(formatTime(duration));
  
  if ( type == 'sound' ) {
    updateAudioDownload(player.getPlaylist()[obj.index]);
    return;
  } 
  
  var getCaptions = isPlaylist ? player.getPlaylist()[obj.index].captions : player.getConfig().captions
  hasCaptions = getCaptions ? true : false;
  
  if ( hasCaptions ) {
    controls.captions.parent().show();
    if ( currentCaptionState ) {
      player.hideCaptions(false);
    }
  } else {
    controls.captions.parent().hide();
    player.hideCaptions(true);
  }

}

// Listen to Volumechanges
function volumeListener (obj) {
  currentVolume = obj.percentage;
  updateVolume();
}

// Listen to Mutechanges
function muteListener (obj) {
  currentMuteState = obj.state;
  var volumeElement = reference.find('.mediavolume');
  if ( currentMuteState == true ) {
    controls.mute
      .addClass('unmute')
      .attr('title', 'Ton einschalten')
      .html('<span class="hidden">Ton einschalten</span>');
    volumeElement.attr('title', 'Lautstärke: Lautlos').children().addClass('muted');
  } else {
    controls.mute
      .removeClass('unmute')
      .attr('title', 'Ton ausschalten')
      .html('<span class="hidden">Ton ausschalten</span>');
    volumeElement.children().removeClass('muted');
    updateVolume();
  }
}

// Listen to Timechanges
function timeListener (obj) {
  currentPosition = obj.position;
}

/*---------- Helper Functions ------------- */

// Format a time in seconds
function formatTime (seconds) {
  var pos = Math.floor(seconds);
  
  var curSec = Math.floor(pos%60)+'';
  curSec = curSec.length == 1 ? '0'+curSec : curSec;
  var curMin = Math.floor(pos/60)+'';
  curMin = curMin.length == 1 ? '0'+curMin : curMin;
  
  return ( curMin + ':' + curSec );
}

function updateVolume () {
  var volumeElement = reference.find('.mediavolume');
  var volumeText = 'Lautstärke: '+currentVolume+'%';
  volumeElement
    .attr('title', volumeText)
    .children('span').text(volumeText)
    .next('.mediavolumeInner').css('width', currentVolume+'%');
}

// update Download Link of Audio Playlists
function updateAudioDownload (item) {
  reference.find('.audioDownload a').attr('href', item.file);
}
