(function($j,$ns){

    $ns.PlaylistView=function(){
    
      //the actual item index in the playlist
      var current_item_index=null;
      
      //the playlist, an array of objects
      var playlist=[];
      
      //configuration settings
      var configuration={repeat:'always'};
      
      //max items to show
      var max_items=3;
      
      function update_item(jquery_element,playlist_object){
        //console.log(playlist_object);
        if(playlist_object==undefined) return;
        eval('metadata='+playlist_object.description+';');
        jquery_element.find('.artist').html('').html(metadata.artist);
        jquery_element.find('.title').html('').html(metadata.title);
        jquery_element.find('.album').html('').html(metadata.album);
        jquery_element.find('.website_url').attr('href','').attr('href',metadata.website_url);
        jquery_element.find('.website_label').html('').html(metadata.website_label);
        jquery_element.find('.description').html('').html(metadata.description);
      };
      
      function update_current_item(){
        element=$j('.current_item');
        element.fadeOut(200,function(){
          update_item($j(this), playlist[current_item_index]);
          $j(this).fadeIn(200);
        });
      };
      
      function update_upcoming_items(){
        $j('.playlist').fadeOut(200,function(){
          $j('.playlist .item').remove();
          for(var index=0;index<max_items;index++){
            create_item(index);
          }
          $j('.playlist').fadeIn(200);
        });
      };
      
      function create_item(index_offset){
        playlist_index=current_item_index+index_offset+1;
        if(configuration.repeat=='always') playlist_index=playlist_index%playlist.length;
        var item=playlist[playlist_index];
        if(item==null) return;
        template=templates[index_offset%templates.length];
        element=$j(template).clone();
        element.css('display','none');
        update_item(element,item);
        $j('.playlist').append(element);
        element.fadeIn(1000);
      };
      
      function set_playlist(_playlist){
        playlist=_playlist;
        $j('.playlist_area').fadeIn(200);  
      };
      
      function set_current_item_index(index){
        if(index==null || index<0) index=0;
        if(index>playlist.length-1) index=playlist.length-1;
        if(current_item_index==index) return;
        current_item_index=index;
        update_view();
      };
      
      function update_view(){
        update_current_item();
        update_upcoming_items();    
      };
      
      function init_templates(){
        $j('.playlist .dummy').remove();
        templates=$j('.playlist .item');
        //console.log(templates);
      };
      
      function bind_to_player(){
        $j(Medianac.Player).bind('playlist',function(event,playlist){set_playlist(playlist);set_current_item_index(0);});
        $j(Medianac.Player).bind('current_item_index',function(event,index){set_current_item_index(index)});
      };
      
      function hide_playlist(){
        $j('.playlist_area').hide();  
      };
      
      return {
        init:function(){
          //console.log('init');
          hide_playlist();
          init_templates();
          bind_to_player();
          return this;
        },
        playlist:function(playlist){
          set_playlist(playlist);
        },
        current_item:function(current_item){
          set_current_item_index(current_item.index);
        },
        current_item_index:function(index){
          set_current_item_index(index);
        }
      };
    }();
}(jQuery,Medianac.Player));
jQuery(Medianac.Player).bind('ready',Medianac.Player.PlaylistView.init);
