var LAST_HOVER = 0;
var PLAYLIST_HOVER = 1;
var TRACK_HOVER = 2;
var SEARCH_HOVER = 3;
var TRACKEDIT_OPEN = false;
var PLAYLISTEDIT_OPEN = false;
var KEYBOARD_LOADED = false;

var PlaylistList = new Class({
  initialize: function( playlistsuccess, playlisterror, ajaxerror, notloggedin ){
    this.playlistArray    = null;
    this.playlistsuccess  = playlistsuccess;
    this.playlisterror    = playlisterror;
    this.ajaxerror        = ajaxerror;
    this.notloggedin      = notloggedin;
    this.playlistajax     = null;
  },
  load:function(){
    if( !loggedIn ){
      this.playlistArray = null;
      if( this.notloggedin ) this.notloggedin();
    }else{
      if( this.playlistajax ) this.playlistajax.abort();
      this.playlistajax = new Ajax( this.playlistloadhandler.bind(this), this.ajaxerror.bind(this) );
      var uri = "/media/listplaylist!ajax.action?gen="+generateLine();
      this.playlistajax.get( uri, null, false );
    }
  },
  setplaylist: function( playlistArray ){
    this.playlistArray = playlistArray;
  },
  playlistloadhandler:function( obj, jsont ){
    var json = eval( '(' + jsont + ')' );
    if(json.status == 'failure'){
      this.playlistArray = null;
      this.playlisterror( json.errorMessage );
    }else{
      this.playlistArray = json.Playlist;
      this.playlistsuccess( this.playlistArray );
    }
  },
  getnextplaylist: function( playlistnumber ){
    if( playlistnumber != null && this.playlistArray != null ){
      var a = 0;
      for( ; a < this.playlistArray.length; a++){
        if( this.playlistArray[a].playlist_number == playlistnumber ) break;
      }
      if( a < this.playlistArray.length - 1 ){
        return this.playlistArray[a+1];
      }
    }
    return null;
  },
  getprevplaylist: function( playlistnumber ){
    if( playlistnumber != null && this.playlistArray != null ){
      var a = 0;
      for( ; a < this.playlistArray.length; a++){
        if( this.playlistArray[a].playlist_number == playlistnumber ) break;
      }
      if( a > 0 ){
        return this.playlistArray[a-1];
      }
    }
  }
});


var LoadedPlaylist = new Class({
  initialize: function( writer, playlisterror, ajaxerror ){
    this.currenttrack = null;
    this.playlistnumber = null;
    this.writer = writer;
    this.viewplaylistajax = null;
    this.ajaxerror = ajaxerror;
    this.playlisterror = playlisterror;
    this.playlist = null;
  },
  viewcurrent: function(){
    if( this.playlistnumber == null ) return;
    this.view( this.playlistnumber );
  },
  view:function( playlistnumber ){
    this.playlistnumber = playlistnumber;
    if( this.playlistnumber == 0 ){
      if( this.viewplaylistajax ) this.viewplaylistajax.abort();
      this.writer( sessionplaylist_getplaylist() );
    }else{
      if( this.viewplaylistajax ) this.viewplaylistajax.abort();
      this.viewplaylistajax = new Ajax( this.viewhandler.bind(this), viewplaylisterror.bind(this) );
      var uri = "/media/listplaylist!ajax.action?gen="+generateLine()+"&playlistNumber=" + encodeURIComponent(this.playlistnumber);
      this.viewplaylistajax.get( uri, null, false );
    }
  },
  viewhandler:function( obj, jsont ){
    var json = eval( '(' + jsont + ')' );
    if(json.status != 'failure'){
      this.playlist = json.Playlist;
      this.writer( json.Playlist );
    }else{
      this.playlisterror();
    }
  },
  setplaylist:function( playlist ){
    this.playlist = playlist;
  },
  getplaylist:function(){
    return this.playlist;
  },
  getplaylistnumber:function(){
    return this.playlistnumber;
  },
  setcurrenttrack: function( currenttrack ){
    this.currenttrack = currenttrack;
  },
  getcurrenttrack: function(){
    return this.currenttrack;
  },
  getsongbytrack: function(){
    for( var a = 0; this.playlist != null && a < this.playlist.length; a++){
      if( this.playlist[a].id == this.currenttrack ) return this.playlist[a];
    }
    return null;
  },
  getnexttrack: function(){
    if( this.currenttrack != null && this.playlist != null ){
      var a = 0;
      for( ; a < this.playlist.length; a++){
        if( this.playlist[a].id == this.currenttrack ) break;
      }
      if( a < this.playlist.length - 1 ){
        return this.playlist[a+1];
      }
    }
    return null;
  },
  getprevtrack: function(){
    if( this.currenttrack != null && this.playlist != null ){
      var a = 0;
      for( ; a < this.playlist.length; a++){
        if( this.playlist[a].id == this.currenttrack ) break;
      }
      if( a > 0 ){
        return this.playlist[a-1];
      }
    }
    return null;
  }
});

/**************************************************/
var _xmousex_ = 0;
var _ymousey_ = 0;


function loadOtherBrowserStuff(){
  
  $(window).removeEvents('mouseover');
  $(window).removeEvents('keydown');


  $(window).addEvent('mouseover', function(evt){ _xmousex_ = evt.page.x; _ymousey_ = evt.page.y; });
  $(window).addEvent('keydown', function(event){
      var result = handleKeyboardNavigation( event );
      if( result == false ) return false;

      if( LAST_HOVER == TRACK_HOVER ){
        trackUpDownHandler( event );
        return false;
      }

      if( LAST_HOVER == SEARCH_HOVER ){
        $('search_console_container').fireEvent( 'keydown', [ event, "" ] );
      }

  });

  addWindowClickEvent( 'playlist_click', function(event){

      var x = _xmousex_;
      var y = _ymousey_;
       
      if( $('track_console') != null ){
        var top = $('track_console').getCoordinates().top;
        var left = $('track_console').getCoordinates().left;
        var bottom = top + $('track_console').getCoordinates().height;
        var right = left + $('track_console').getCoordinates().width;
        if( left <= x && x <= right && top <= y && y <= bottom ){
          LAST_HOVER = TRACK_HOVER;
          return false;
        }
      }      

      closeAllEdits();
      
      if( $('search_console_container') != null ){
        top = $('search_console_container').getCoordinates().top;
        left = $('search_console_container').getCoordinates().left;
        bottom = top + $('search_console_container').getCoordinates().height;
        right = left + $('search_console_container').getCoordinates().width;
        if( left <= x && x <= right && top <= y && y <= bottom ){
          LAST_HOVER = SEARCH_HOVER;
          return false;
        }
      }else{
      }
      LAST_HOVER = 0;
  });
}


function loadIETracking(){

  addDocumentClickEvent( 'playlist_checkedit', function(event){
    var x = _xmousex_;
    var y = _ymousey_;
    if( $('track_console') != null ){
      var top = $('track_console').getCoordinates().top;
      var left = $('track_console').getCoordinates().left;
      var bottom = top + $('track_console').getCoordinates().height;
      var right = left + $('track_console').getCoordinates().width;
      if( left <= x && x <= right && top <= y && y <= bottom ){
        return false;
      }
    }
    closeAllEdits();
  });
}


function handleKeyboardNavigation( event ){
    if( event.shift && event.code == 84 ){
      LAST_HOVER = TRACK_HOVER;
      $('track_console').focus();
      return false;
    }else if( event.shift && event.code == 188 ){ // <      
       var playlist = PLAYLISTLIST.getprevplaylist( LOADEDPLAYLIST.playlistnumber );
      if( playlist != null ){
        setplaylistfocus( playlist.playlist_number );
      }
      LAST_HOVER = TRACK_HOVER;
      $('track_console').focus();
      return false;
    }else if( event.shift && event.code == 190 ){ // >
      var playlist = PLAYLISTLIST.getnextplaylist( LOADEDPLAYLIST.playlistnumber );
      if( playlist != null ){
        setplaylistfocus( playlist.playlist_number );
      }
      LAST_HOVER = TRACK_HOVER;
      window.focus();
      $('track_console').focus();
      return false;
    }else if( event.shift && event.key == 'right' ){
      PLAYER.nextSong();
      return false;
    }else if( event.shift && event.key == 'left' ){
      PLAYER.prevSong();
      return false;
    }
    return true;
}


function keyboardIENavigation(){
  if( KEYBOARD_LOADED == true ) return;
  KEYBOARD_LOADED = true;
  $(document).addEvent('keydown', function(event){
     if( event.shift && event.code == 84 ){
       LAST_HOVER = TRACK_HOVER;
       return false;       
     }else if( event.key == 'down' ){
       if( LAST_HOVER == TRACK_HOVER ){
         trackUpDownHandler( event ); return false;
       }
     }else if( event.key == 'up' ){
       if( LAST_HOVER == TRACK_HOVER ){
         trackUpDownHandler( event ); return false;
       }
     }
     return handleKeyboardNavigation( event );
  });
}


/***************************************************
* view playlist functions 
***************************************************/
function viewplaylistwriter( playlistArray ){
  if( playlistArray == null || playlistArray.length == 0){
    $('track_console').innerHTML = '<span style="color:#FFF">Your playlist is Empty</span>';
    LOADEDPLAYLIST.setplaylist( null );
  }else{
    var playlist = playlistArray[0];
    if( playlist.playlist_number == 0 ){
      $('playlist_info').innerHTML = 'Unsaved Playlist &nbsp;&nbsp;&nbsp;&nbsp;' +
         '<a href="#" class="whitelink" onclick="showsaveplaylist();return false">[SAVE]</a>';
    }else{
      $('playlist_info').innerHTML = playlist.name + ' &nbsp;&nbsp;&nbsp;&nbsp;' +
         '<a href="#" class="whitelink" onclick="deleteplaylist('+ playlist.playlist_number +');return false">[Delete]</a>';
    }

    if( playlist.songs == null || playlist.songs.length == 0){
      $('track_console').innerHTML = '<span style="color:#FFF">Your playlist is Empty</span>';
      LOADEDPLAYLIST.setplaylist( null );
    }else{
      var html = '<div id="track_list">';
      var playingselect = false;
      for( var a = 0; a < playlist.songs.length; a++ ){
        if( playlist.songs[a].title == PLAYER.title && playlist.songs[a].url == PLAYER.url ){
          playingselect = true; break;
        }
      }
      for( var a = 0; a < playlist.songs.length; a++ ){
        LOADEDPLAYLIST.setplaylist( playlist.songs );
        var title = playlist.songs[a].title;
        if( DEADLINKS.get( playlist.songs[a].url ) != null ){
          var deleteclick = "deleteSong( '"+ playlist.playlist_number +"', '"+ playlist.songs[a].id +"' );return false";
          title = '<img style="height:11px;cursor:pointer" title="Delete" ' + 
                  '     onclick="'+deleteclick+'"src="'+statichost+'/images/mediaconsole/delete_button.png"> &nbsp;'+
                  '<span style="color:#F00">'+title+'</span>';
        }
        var selectclass =  '';
        if( playlist.songs[a].title == PLAYER.title && playlist.songs[a].url == PLAYER.url ){
          selectclass = ' class="row_sel" ';
        }
        if( a == 0 && !playingselect ){
          LOADEDPLAYLIST.setcurrenttrack( playlist.songs[a].id );
          selectclass = ' class="row_sel" ';
        }
        html += '<table id="'+(a+0)+'" class="console_list" cellpadding="0" cellspacing="0" width="99%" align="center">';
        html += '  <tr><td '+selectclass+' tn="' + playlist.songs[a].id  +'"><div>' + title + '</div></td></tr>';
        html += '</table>';
      }
      html += '</div>';
      $('track_console').innerHTML = html;
      makeSortable("track_list", playlist.playlist_number );
    }
  }
  finalizetrackconsole();
}
function viewplaylistajaxerror(){
  $('track_console').innerHTML = '<span style="color:#FFF">Error loading playlist track(s)</span>';
  finalizetrackconsole();
}
function viewplaylisterror(){
  $('track_console').innerHTML = '<span style="color:#FFF">'+json.errorMessage+'</span>';
  finalizetrackconsole();
}

function finalizetrackconsole(){
  new ScrollBar().init('track_console_container','track_console','track_slider_bar');
  $$('#track_list td').each( function(el){
      el.addEvent('click', function(){
        var newclick  = true;
        var newnumber = this.getAttribute("tn");
 
        LOADEDPLAYLIST.setcurrenttrack( this.getAttribute("tn") );
        $$('#track_list td').each( function(el){ 
          if( el.getAttribute('class') == 'row_sel' || el.getAttribute('className') == 'row_sel' ){
            if( el.getAttribute("tn") == newnumber ) newclick = false;            
          }
          el.setAttribute('class',''); el.setAttribute('className', ''); 
        });
        if( newclick ) closeAllEdits();
        this.setAttribute('class','row_sel'); this.setAttribute('className', 'row_sel');
        new ScrollBar().adjust('track_console_container','track_console','track_slider_bar', this);
      });

     el.addEvent('mousedown', function(event){
       document.getElementsByTagName("body")[0].oncontextmenu = function(){ return false; }
     });
     el.addEvent('mouseup', function(event){
        if( event.rightClick == false ){
          document.getElementsByTagName("body")[0].oncontextmenu = function(){ return true; }
          return true;
        }
        LOADEDPLAYLIST.setcurrenttrack( this.getAttribute("tn") );
        $$('#track_list td').each( function(el){ el.setAttribute('class',''); el.setAttribute('className', ''); } );
        this.setAttribute('class','row_sel'); this.setAttribute('className', 'row_sel');
        new ScrollBar().adjust('track_console_container','track_console','track_slider_bar', this);
        trackEdit( event );
        setTimeout( "clearRC()", 100 );
     });     
  });
   
  $('track_console').removeEvents();

  if( browser.isIE ){
    //$('track_console').addEvent('keydown', function(event){
    //  trackUpDownHandler( event );
    //  return false;
    //});
    loadIETracking();
    keyboardIENavigation();
  }else{
    loadOtherBrowserStuff();
  }

  $('track_console').addEvent('dblclick', function(event){
    var track = LOADEDPLAYLIST.getsongbytrack();
    playSong( track.url, track.title, null, true, LOADEDPLAYLIST.getplaylist(), LOADEDPLAYLIST.getplaylistnumber(), track.id );
  });
}

/************ Playlist / Track Right CLick ******************/
function closeAllEdits(){
  $$('.rightclickmenu').each( function(e){
    document.getElementsByTagName("body")[0].removeChild( e );
  });
  TRACKEDIT_OPEN = false;
  PLAYLISTEDIT_OPEN = false;
}

function playlistEdit( event ){
  if( PLAYLISTEDIT_OPEN == true || TRACKEDIT_OPEN == true ){
    closeAllEdits();
  }
  PLAYLISTEDIT_OPEN = true;
  var table = $(document.createElement('table'));
  var tbody = document.createElement('tbody');
  var tr_delete  = document.createElement('tr');
  var tr_close   = document.createElement('tr');
  tbody.appendChild( tr_delete );
  tbody.appendChild( tr_close );
  table.appendChild( tbody );

  table.addClass('rightclickmenu');
  table.setStyle('top', event.page.y );
  table.setStyle('left', 8 + event.page.x );

  var td_delete = $(document.createElement('td'));
  var td_close = $(document.createElement('td'));
  tr_delete.appendChild( td_delete );
  tr_close.appendChild( td_close );
  td_delete.addEvent( 'mouseover', function(){ this.addClass('over'); });
  td_delete.addEvent( 'mouseout', function(){ this.removeClass('over'); });
  td_delete.addEvent( 'click', function(){
    var track = LOADEDPLAYLIST.getsongbytrack(); 
    deleteplaylist( LOADEDPLAYLIST.getplaylistnumber() );
    closeAllEdits();
  });
  td_close.addEvent( 'mouseover', function(){ this.addClass('over'); });
  td_close.addEvent( 'mouseout', function(){ this.removeClass('over'); });
  td_close.addEvent( 'click', function(){ closeAllEdits(); });
  td_delete.innerHTML = "Delete";
  td_close.innerHTML = "Close";
  document.getElementsByTagName("body")[0].appendChild( table );
}


function trackEdit( event ){
  if( PLAYLISTEDIT_OPEN == true || TRACKEDIT_OPEN == true ){
    closeAllEdits();
  }

  TRACKEDIT_OPEN = true;
  var table = $(document.createElement('table'));
  var tbody = document.createElement('tbody');
  var tr_edit    = document.createElement('tr');
  var tr_share   = document.createElement('tr');
  var tr_delete  = document.createElement('tr');
  var tr_close   = document.createElement('tr');
  tbody.appendChild( tr_edit );
  tbody.appendChild( tr_share );
  tbody.appendChild( tr_delete );
  tbody.appendChild( tr_close );
  table.appendChild( tbody );

  table.addClass('rightclickmenu');
  table.setStyle('top', event.page.y );
  table.setStyle('left', 8 + event.page.x );

  var td_edit = $(document.createElement('td'));
  var td_share = $(document.createElement('td'));
  var td_delete = $(document.createElement('td'));
  var td_close = $(document.createElement('td'));
  tr_edit.appendChild( td_edit );
  tr_share.appendChild( td_share );
  tr_delete.appendChild( td_delete );
  tr_close.appendChild( td_close );

  td_edit.addEvent( 'mouseover', function(){ this.addClass('over'); });
  td_edit.addEvent( 'mouseout', function(){ this.removeClass('over'); });
  td_edit.addEvent( 'click', function(){
    var track = LOADEDPLAYLIST.getsongbytrack();
    showmodifysong( track.title, track.url, track.id, LOADEDPLAYLIST.getplaylistnumber() );
    closeAllEdits();
  });

  td_share.addEvent( 'mouseover', function(){ this.addClass('over'); });
  td_share.addEvent( 'mouseout', function(){ this.removeClass('over'); });
  td_share.addEvent( 'click', function(){
    var track = LOADEDPLAYLIST.getsongbytrack();
    showsharemedia( track.title, track.url );
    closeAllEdits();
  });

  td_delete.addEvent( 'mouseover', function(){ this.addClass('over'); });
  td_delete.addEvent( 'mouseout', function(){ this.removeClass('over'); });
  td_delete.addEvent( 'click', function(){
    var track = LOADEDPLAYLIST.getsongbytrack();
    deleteSong( LOADEDPLAYLIST.getplaylistnumber(), track.id );
    closeAllEdits();
  });
  td_close.addEvent( 'mouseover', function(){ this.addClass('over'); });
  td_close.addEvent( 'mouseout', function(){ this.removeClass('over'); });
  td_close.addEvent( 'click', function(){ closeAllEdits(); });

  td_edit.innerHTML  = "Edit";
  td_share.innerHTML = "Share";
  td_delete.innerHTML = "Delete";
  td_close.innerHTML = "Close";
  document.getElementsByTagName("body")[0].appendChild( table );
}




function clearRC(){
  document.getElementsByTagName("body")[0].oncontextmenu = function(){ return true; }
}

function trackUpDownHandler( event ){
  if( event.key == 'down' || event.key == 'up' ){
      var track = null;
      if( event.key == 'down' ) track = LOADEDPLAYLIST.getnexttrack();
      else if( event.key == 'up' ) track = LOADEDPLAYLIST.getprevtrack();
      if( track != null ){
        $$('#track_list td').each( function(el){ el.setAttribute('class',''); el.setAttribute('className', ''); } );
        $$('#track_list td').each( function(el){
          if( el.getAttribute("tn") == track.id ){
            el.setAttribute('class','row_sel'); el.setAttribute('className', 'row_sel');
            LOADEDPLAYLIST.setcurrenttrack( track.id );
            new ScrollBar().adjust('track_console_container','track_console','track_slider_bar', el);
          }
        });
      }
      return false;
  }else if( event.key == 'enter' ){
      var track = LOADEDPLAYLIST.getsongbytrack();
      playSong( track.url, track.title, null, true, LOADEDPLAYLIST.getplaylist(), LOADEDPLAYLIST.getplaylistnumber(), track.id );
  }else if( event.key == 'delete' ){
      var track = LOADEDPLAYLIST.getsongbytrack();
      deleteSong( LOADEDPLAYLIST.getplaylistnumber(), track.id );
  }
}

/***************************************************
* playlist list functions
**************************************************/
function setplaylistfocus( ID ){
  var cookie = new Hash.Cookie('playlistfocus', {duration:30, domain: 'flashwidgetz.com', path: '/'} );
  var playlistNumber = cookie.set('playlistNumber', ID );
  LOADEDPLAYLIST.view( ID );
}

function playlistloadsuccess( playlistArray ){
  var sessionplaylistArray = sessionplaylist_getplaylist();
  var sessionplaylisthassongs = ( sessionplaylistArray != null && sessionplaylistArray.length != 0 &&
                                  sessionplaylistArray[0].songs != null && sessionplaylistArray[0].songs.length != 0 );

  var cookie = new Hash.Cookie('playlistfocus', {duration:30, domain: 'flashwidgetz.com', path: '/'} );
  var playlistNumber = cookie.get('playlistNumber');

  var local_playlistArray = new Array();
  
  if( playlistArray != null && playlistArray.length > 0 ){
    local_playlistArray = playlistArray;
  }
  if( sessionplaylisthassongs ){
    local_playlistArray[local_playlistArray.length] = sessionplaylistArray[0];
  }

  PLAYLISTLIST.setplaylist( local_playlistArray );

  if( playlistNumber == null ){
    if( sessionplaylisthassongs ){
      setplaylistfocus( 0 );
    }else if( playlistArray != null && playlistArray.length > 0 ){
      setplaylistfocus( playlistArray[0].playlist_number );
    }else{
      $('track_console').innerHTML = '' +
        '<center><span style="color:#FFF">You currently do not have a playlist.<br>'+
        'Click <a href="#" class="lightbluelink" onclick="showcreateplaylist();return false">here</a> to create a playlist</span></center>';
    }
  }else{
    var foundPlaylist = null;
    for( var a = 0; a < local_playlistArray.length; a++ ){
      if( playlistNumber == local_playlistArray[a].playlist_number ){
        foundPlaylist = local_playlistArray[a]; break;
      }
    }
    if( foundPlaylist != null ){
      setplaylistfocus( foundPlaylist.playlist_number );
    }else{
      cookie.set('playlistNumber', null );
      if( local_playlistArray.length != 0 ){
        setplaylistfocus( local_playlistArray[0].playlist_number );
      }else{
        $('track_console').innerHTML = '' +
          '<center><span style="color:#FFF">You currently do not have a playlist.<br>'+
          'Click <a href="#" class="lightbluelink" onclick="showcreateplaylist();return false">here</a> to create a playlist</span></center>';
      }
    }
  }
}

function playlistloaderror( errorMessage ){
  dialogAlert('Error loadding playlist information' );
}

function playlistajaxerror(){
  dialogAlert('Error retreiving information from the server');
}

function playlistnotloggedin(){
  $('playlist_info').innerHTML = 'Unsaved Playlist (Login to Save Playlist) &nbsp;&nbsp;&nbsp;&nbsp;' + 
    '<a href="#" class="whitelink" onclick="showsaveplaylist();return false">[SAVE]</a>';
  LOADEDPLAYLIST.view( 0 );
}


/***************************************************
* Sortable
***************************************************/
function makeSortable( id, playlistNumber ){
  var mySort = new Sortables( $(id),
  {
     constrain: true,
     clone: true,
     revert: true,
     onComplete: function(){
       var result = ""+mySort.serialize();
       var array = result.split(",");
       var order = '';
       var inorder = true;
       for(var a = 0; a < array.length; a++){
         order += array[a].replace(/^s+/, '').replace(/s+$/, '');
         if(a != array.length-1) order += '.';
         if( a < array.length-1 && parseInt(array[a]) > parseInt(array[a+1]) ){ inorder = false; }
       }
       var index = 0;
       mySort.serialize(function(element){
         element.id = index;
         index++;
       });
       if( inorder == true ) return;
       if( playlistNumber == 0 ){
         sessionplaylist_reorder( order );
         LOADEDPLAYLIST.view( 0 );
       }else{
         var reloadfunc = function(num){  LOADEDPLAYLIST.view(num) }.pass( playlistNumber );
         var ajax = new Ajax( reloadfunc, ajaxError );
         var uri = "/media/reorderplaylist!ajax.action?playlistNumber="+playlistNumber+
           "&order="+encodeURIComponent(order)+"&gen="+ generateLine();
           ajax.get( uri, null, false );
       }
     }
  });
}


var PLAYLISTLIST = new PlaylistList( playlistloadsuccess, playlistloaderror, playlistajaxerror, playlistnotloggedin );
var LOADEDPLAYLIST = new LoadedPlaylist( viewplaylistwriter, viewplaylisterror, viewplaylistajaxerror );


