$(function(){
  mediaplayer.init();
});

var mediaplayer = {
  version: '0.9.1',
  debug: false,
  container: null,
  player: null,
  playlist: null,
  song: { src: null, path: null, idx: null, loaded: false },
  ctrl: {info:{}},
  timer: { gt:0, dt:0, st:0 },
  init: function(){
    mediaplayer.assign();
    mediaplayer.get_playlist();
  },
  create: function(url){
    url = url || '';
    var $panel = $('.panel:first');
    var $player = $('#player');
    var tpl = '<object id="player" classid="CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6">' +
              '<param name="url" value="' + url + '" />' +
              '<param name="src" value="' + url + '" />' +
              '<param name="showcontrols" value="true" />' +
              '</object>';
    if(mediaplayer.util.notIE()){
      var tpl = '<object id="player" type="application/x-ms-wmp" data="' + url + '">' +
                '<param name="src" value="' + url + '" />' +
                '<param name="controller" value="true" />' +
                '</object>';
    }
    if($player.length > 0){ $player.remove(); mediaplayer.player = null; }
    $panel.empty().html(tpl);
    mediaplayer.player = $('#player')[0];
    if(mediaplayer.player){
      mediaplayer.events.sortable();
      mediaplayer.events.position();
      mediaplayer.events.bind();
      mediaplayer.events.listen();
      mediaplayer.events.volume();
      mediaplayer.events.reset();
    }
  },
  assign: function(){
    mediaplayer.container = $('#container');
    mediaplayer.playlist = $('#playlist');
    mediaplayer.playlist.empty();
    mediaplayer.ctrl.play = $('.control #ctl-play');
    mediaplayer.ctrl.stop = $('.control #ctl-stop');
    mediaplayer.ctrl.repeat = $('.control #ctl-repeat');
    mediaplayer.ctrl.prev = $('.control #ctl-prev');
    mediaplayer.ctrl.next = $('.control #ctl-next');
    mediaplayer.ctrl.volume = $('.control #ctl-volume');
    mediaplayer.ctrl.volume_txt = $('.control #ctl-volume-txt');
    mediaplayer.ctrl.position = $('.control #ctl-position');
    mediaplayer.ctrl.info.status = $('.control .info .status');
    mediaplayer.ctrl.info.artist = $('.control .info .artist');
    mediaplayer.ctrl.info.duration = $('.control .info .duration');
  },
  events: {
    sortable: function(){
      try{
        mediaplayer.playlist.sortable({
          placeholder: 'on-holder',
          containment: 'parent',
          stop: function(){
            var idx = mediaplayer.playlist.children('li').index(mediaplayer.playlist.find('.on-play'));
            mediaplayer.song.idx = idx;
          }
        });
      }catch(e){ mediaplayer.Debug(e); }
    },
    position: function(){
      window.setTimeout(function(){
        try{
          var s = mediaplayer.player.controls.currentPosition;
          var k = mediaplayer.player.currentMedia.getItemInfo('Duration');
          mediaplayer.ctrl.position.slider({
            value:0, min: 0, max: k,
            stop: function(event, ui){ mediaplayer.player.controls.currentPosition = parseFloat(ui.value); }
          });
        }catch(e){ mediaplayer.Debug(e); }
      }, 500);
    },
    volume: function(){
      window.setTimeout(function(){
        try{
          mediaplayer.ctrl.volume.slider({
            value:40, min: 0, max: 100,
            slide: function(event, ui){
              mediaplayer.ctrl.volume_txt.html(ui.value + '%').show();
              mediaplayer.player.settings.volume = ui.value;
            },
            stop: function(event, ui){ window.setTimeout('mediaplayer.ctrl.volume_txt.fadeOut()', 300); }
          });
        }catch(e){ mediaplayer.Debug(e); }
      }, 500);
    },
    ctrl: { // player control
      playsong: function(li){
        var obj = $(li).parent().parent();
        obj.trigger('dblclick');
      },
      delsong: function(li){
        if(confirm('Are you sure to delete it?')){
          var obj = $(li).parent().parent();
          if(obj.hasClass('on-play')){ mediaplayer.events.ctrl.next(); }
          obj.remove();
          mediaplayer.events.info();
        }
      },
      play: function(){
        if(mediaplayer.player){
          switch(mediaplayer.player.playState){
            case 3:
              mediaplayer.player.controls.pause();
              mediaplayer.ctrl.info.status.html('<img src="images/player-playing-pause.gif" alt="" class="playing" />');
              mediaplayer.ctrl.play.attr('src', 'images/player-play-on.gif');
              break;
            case 1: case 2:
              mediaplayer.player.controls.play();
              mediaplayer.events.fetch();
              mediaplayer.ctrl.info.status.html('<img src="images/player-playing.gif" alt="" class="playing" />');
              mediaplayer.ctrl.play.attr('src', 'images/player-play.gif');
              mediaplayer.ctrl.stop.attr('src', 'images/player-stop.gif');
              break;
          }
        }
      },
      next: function(){
        if(mediaplayer.player){
          var len = (mediaplayer.playlist.children('li').length - 1);
          if(mediaplayer.song.idx < len){
            mediaplayer.song.idx += 1;
            mediaplayer.playlist.children('li').eq(mediaplayer.song.idx).trigger('dblclick');
          }else{
            if(mediaplayer.ctrl.repeat.attr('checked')){
              mediaplayer.song.idx = 0;
              mediaplayer.playlist.children('li').eq(mediaplayer.song.idx).trigger('dblclick');
            }
          }
        }
      },
      prev: function(){
        if(mediaplayer.player){
          var len = (mediaplayer.playlist.children('li').length - 1);
          if(mediaplayer.song.idx > 0){
            mediaplayer.song.idx -= 1;
            mediaplayer.playlist.children('li').eq(mediaplayer.song.idx).trigger('dblclick');
          }else{
            mediaplayer.song.idx = len;
            mediaplayer.playlist.children('li').eq(mediaplayer.song.idx).trigger('dblclick');
          }
        }
      },
      stop: function(){
        if(mediaplayer.player){
          mediaplayer.player.controls.stop();
          mediaplayer.ctrl.stop.attr('src', 'images/player-stop-on.gif');
          mediaplayer.events.reset();
          window.clearTimeout(mediaplayer.timer.st);
          window.clearInterval(mediaplayer.timer.dt);
        }
      }
    },
    bind: function(){
      $('#ctl-play').click(function(){ mediaplayer.events.ctrl.play(); });
      $('#ctl-stop').click(function(){ mediaplayer.events.ctrl.stop(); });
      $('#ctl-prev').click(function(){ mediaplayer.events.ctrl.prev(); });
      $('#ctl-next').click(function(){ mediaplayer.events.ctrl.next(); });
      $('#ctl-playlist').click(function(){ if($(this).attr('checked')){ $('.playlist').slideDown(); }else{ $('.playlist').slideUp(); }
      });
    },
    fetch: function(){
      if(mediaplayer.player && mediaplayer.song.loaded){
        mediaplayer.timer.st = window.setTimeout(function(){
          var song = mediaplayer.playlist.children('li').eq(mediaplayer.song.idx).text();
          mediaplayer.ctrl.info.status.html('<img src="images/player-playing.gif" alt="" class="playing" />');
          mediaplayer.ctrl.info.artist.html(song).removeClass('loading');
          mediaplayer.timer.dt = window.setInterval(function(){
            try{
              var s = mediaplayer.player.controls.currentPosition;
              var k = mediaplayer.player.currentMedia.getItemInfo('Duration');
              mediaplayer.ctrl.info.duration.html(mediaplayer.util.s2d(s) + '/' + mediaplayer.util.s2d(k));
              mediaplayer.ctrl.position.slider('value', s);
            }catch(e){ mediaplayer.Debug(e); }
          }, 1000);
        }, 1000);
      }
    },
    reset: function(){
      if(mediaplayer.player && mediaplayer.song.loaded){
        var song = mediaplayer.playlist.children('li').eq(mediaplayer.song.idx).text();
        mediaplayer.ctrl.info.artist.html(song).removeClass('loading');
        //var s = mediaplayer.player.controls.currentPosition;
        //var k = mediaplayer.player.currentMedia.getItemInfo('Duration');
        mediaplayer.ctrl.info.duration.html('00:00/00:00');
        mediaplayer.ctrl.position.slider('value', 0);
      }
    },
    listen: function(){
      if(!mediaplayer.util.notIE()){
        mediaplayer.player.attachEvent("PlayStateChange", function(s){ if(s == 8){ mediaplayer.events.ctrl.next(); } });
      }
    }
  },
  get_playlist: function(){
    var params = {'lid':'1', 'uid':'1'};
    $.post('media.php', params, function(result){
      if(result){
        var tpl = function(){
          return [
            'li', {'id':this.url}, [
              'div', {'class':'items'}, (this.singer + ' - ' + this.title)
            ]
          ];
        };
        mediaplayer.playlist.tplAppend(result, tpl);
        mediaplayer.playlist.children('li').hover(function(){
          var $obj = $(this);
          $obj.addClass('on-play');
          var tpl = [
              'div', {'class':'ctrl'}, [
                'a', {'href':'#', 'onclick':'mediaplayer.events.ctrl.playsong(this)'}, ['img', {'src':'images/playlist-play.gif', 'alt':''}, null],
                'a', {'href':'#', 'onclick':'mediaplayer.events.ctrl.delsong(this)'}, ['img', {'src':'images/playlist-del.gif', 'alt':''}, null]
              ]
          ];
          $obj.createAppend(tpl);
        }, function(){
          var $obj = $(this);
          if(mediaplayer.song.idx !== mediaplayer.playlist.children('li').index($obj)){ $obj.removeClass('on-play'); }
          $obj.find('.ctrl').remove();
        });
        mediaplayer.playlist.children('li').dblclick(function(){
          window.clearTimeout(mediaplayer.timer.st);
          window.clearInterval(mediaplayer.timer.dt);
          mediaplayer.ctrl.info.status.html('');
          mediaplayer.ctrl.info.artist.html('Loading...').addClass('loading');
          var $obj = $(this);
          var url = $obj.attr('id');
          mediaplayer.playlist.children('li').removeClass('on-play');
          mediaplayer.song.path = url;
          mediaplayer.song.idx = mediaplayer.playlist.children('li').index($obj);
          mediaplayer.create(mediaplayer.song.path);
          mediaplayer.song.loaded = (mediaplayer.player.data || mediaplayer.player.url)? true: false;
          $obj.addClass('on-play');
          mediaplayer.events.fetch();
          return false;
        });
        mediaplayer.playlist.children('li').eq(0).trigger('dblclick');
      }
    }, 'json');
  },
  util: {
    s2d: function(s){
      var y, m, d, hh, mm, ss;
      dd = Math.floor(s / (24 * 3600));
      s = (s % (24 * 3600));
      hh = Math.floor(s / 3600)
      ds = (s % 3600);
      mm = Math.floor(ds / 60);
      ss = parseInt(s - hh * 3600 - mm * 60)
      return mediaplayer.util.padZero(mm, 2) + ':' + mediaplayer.util.padZero(ss, 2);
    },
    padZero: function(s, maxlen){
      var result = '';
      for(var i=0, c=s.toString().length; i<maxlen - c; i++){ result += '0'; }
      return (result + s);
    },
    notIE: function(){ return ($.support.noCloneEvent); }
  },
  Debug: function(e){ if(mediaplayer.debug){ alert(e.message); } }
};

function OnDSPlayStateChangeEvt(s) {
  if(s == 8){ mediaplayer.events.ctrl.next(); }
}

