$(function() {
  var ADD_TRACKS = "Add Tracks to Your Tape";
  var ADDING = "Adding...";

  $("body#create").each(function() {
    $("#tape-name").focus();
  });
  
  $("body#mixtape").each(function() {
    
    // wait for soundmanager to init, then load tracks from the SC api
    soundManager.onload = function() {

      // load the tracks from the backend
      var trackIds = $("#trackslist").text();
      if(trackIds === "" || trackIds === "None") {
        $("ul.trackslist").html('<li class="track empty"><div class="name"><span class="artist">This tape is empty</span></div></li>');
        $("#edit-tape").click();
      } else {
        $.getJSON("http://api.soundcloud.com/tracks.js?ids=" + trackIds + "&callback=?", function(tracks) {
          // sort the tracks array correctly
          var tracksSorted = $("#trackslist").text().split(",");
          $.each(tracks,function() { // some moderately ugly sorting code
            var trackPos = $.inArray(this.id.toString(), tracksSorted);
            if(trackPos !== -1) {
              tracksSorted[trackPos] = this;
            }
          });
          
          $("ul.trackslist").html("");
          var totalTapeLength = 0;
          $.each(tracksSorted,function() {
            totalTapeLength += this.duration;
            insertMixTapeItem(this);
          });
          $("#tape-info").html(tracks.length + " tracks, " + prettyPrintMs(totalTapeLength) + " minutes");        
        });
      }
    }
    
    // fade in loading anim
    $("ul.trackslist li").fadeIn(5000);
    
    // browse genre links
    $("#genres a").click(function() {
      $(this).siblings("a").removeClass("selected");
      $(this).addClass("selected");
      displayTrackSearchResults(this.id.substr(6));
      return false;
    });
    
    // browse hot tracks
    $("#chooser a.hot-tracks-link").click(function() {
      $("#hot-tracks-form").show();
      $("#search-tracks,#fav-tracks").hide();
      $(this).parents("li").siblings().find("a").removeClass("hilite");
      $(this).addClass("hilite");
      displayTrackSearchResults('all');
      return false;
    });
    
    // search tracks
    $("#chooser a.search-tracks-link").click(function() {
      $("#hot-tracks-form,#fav-tracks").hide();
      $("#search-tracks").show();
      $(this).parents("li").siblings().find("a").removeClass("hilite");
      $(this).addClass("hilite");
      $("#q").val("").focus();
      return false;
    });

    // fav tracks
    $("#chooser a.fav-tracks-link").click(function() {
      $("#hot-tracks-form,#search-tracks").hide();
      $("#fav-tracks").show();
      $(this).parents("li").siblings().find("a").removeClass("hilite");
      $(this).addClass("hilite");
      $("#fav-q").val("").focus();
      return false;
    });
    
    // popup the add tracks dialog
    $("#edit-tape").click(function() {
      if($(this).text() === ADDING) {
        $(this).text(ADD_TRACKS);
        $("#chooser").animate({width:'hide',height:0,opacity:'hide'},300,'easeOutExpo');
      } else {
        $(this).text(ADDING);
        $("#chooser").animate({width:'show',height:410,opacity:'show'},300,'easeOutExpo',function() {
          $("#q").val("").focus();
        });        
      }
      return false;
    })    
    
    // close the add tracks dialog
    $("#done").click(function() {
      $("#edit-tape").text(ADD_TRACKS);
      $("#chooser").animate({width:'hide',height:0,opacity:'hide'},700,'easeOutExpo');
    });
    $("body#mixtape.edit ul.trackslist").sortable({
      containment: 'parent',
      opacity : 0.6,
      revert : true,
      update : function(e,ui) {
        saveTape();
      }
    });

    $("#result-list")[0].offset = 0;
    // search for any track
    $("#search-form").submit(function() {
      var list = $("#result-list");
      list.html("");
      list[0].endOfList = false;
      list[0].loading = false;
      list[0].offset = 0;
      loadResultList("http://api.soundcloud.com/tracks.js?filter=public&order=hotness&callback=?&q=" + $("#q").val(),list);
      return false;
    });

    $("#fav-result-list")[0].offset = 0;

    // search for user favs
    $("#fav-form").submit(function() {
      var userUrl = $("#fav-q").val();
      if(userUrl.lastIndexOf("/") != -1) {
        userUrl = userUrl.substring(userUrl.lastIndexOf("/")+1);
      }
      var list = $("#fav-result-list");
      list.html("");
      list[0].endOfList = false;
      list[0].loading = false;
      list[0].offset = 0;
      loadResultList("http://api.soundcloud.com/users/" + userUrl + "/favorites.js?filter=public&callback=?",list);
      return false;
    });

    $("#fav-result-list").scroll(function() {
      // start pre-loading more if reaching nearer than 400px to the bottom of list 
      if(this.scrollHeight-(this.scrollTop+this.clientHeight) < 200) {
        var userUrl = $("#fav-q").val();
        if(userUrl.lastIndexOf("/") != -1) {
          userUrl = userUrl.substring(userUrl.lastIndexOf("/")+1);
        }
        loadResultList("http://api.soundcloud.com/users/" + userUrl + "/favorites.js?filter=public&callback=?",$("#fav-result-list"));
      }
    });
    $("#result-list").scroll(function() {
      // start pre-loading more if reaching nearer than 400px to the bottom of list 
      if(this.scrollHeight-(this.scrollTop+this.clientHeight) < 200) {
        loadResultList("http://api.soundcloud.com/tracks.js?filter=public&order=hotness&callback=?&q=" + $("#q").val(),$("#result-list"));
      }
    });
    $("#hot-tracks-list").scroll(function() {
      // start pre-loading more if reaching nearer than 400px to the bottom of list 
      if(this.scrollHeight-(this.scrollTop+this.clientHeight) < 200) {
        loadResultList("http://api.soundcloud.com/tracks.js?filter=streamable&order=hotness&callback=?&genres=" + $("#hot-tracks-list")[0].genre,$("#hot-tracks-list"));
      }
    });

    function loadResultList(tracksUrl, list) {
      var url = tracksUrl + "&offset=" + list[0].offset;
      if(!list[0].endOfList && !list[0].loading) {
        $("<li class='loading'>Loading...</li>").hide().appendTo(list);
        list.find("li:last").hide().fadeIn(5000);
        list[0].loading = true;
        $.getJSON(url, function(tracks) {
          if(tracks.length == 0 && list[0].offset == 0) {
            list.html("<li class='loading'>Sorry, no tracks were found.</li>");
          } else {
            list[0].offset += 50;
            if(tracks.length < 50) {
              list[0].endOfList = true;
            }
            // if events mode, then parse out the tracks first
            $("> li:last",list).remove();

            $.each(tracks,function() {
              var track = this;
              if(track.streamable) {
                var li = $("<li><a href='http://soundcloud.com/" + track.user.permalink + "/" + track.permalink + "'>" + track.user.username + " - " + track.title + "</a></li>").appendTo(list);
                li.find("a").click(function() {
                  insertMixTapeItem(track);
                  $.scrollTo("ul.trackslist li:last", {easing: 'easeOutExpo', speed : 1000, axis: 'y'});
                  saveTape();
                  return false;
                });
                li.hide().fadeIn();              
              }
            });
            
          }

          //show new tracks with fade fx
          //$("tr.track-hidden",self.list).removeClass('track-hidden');
          list[0].loading = false;
        });
      }
    }

    // show track search results, and genre lists
    function displayTrackSearchResults(genre) {
      if(!genre || genre === 'all') {
        var genre = "";
      }
      
      var list = $("#hot-tracks-list");
      list[0].genre = genre;
      list.html("");
      list[0].endOfList = false;
      list[0].loading = false;
      list[0].offset = 0;
      loadResultList("http://api.soundcloud.com/tracks.js?filter=streamable&order=hotness&callback=?&genres=" + genre,list);
    };
    
  });
  
  // persist playlist
  function saveTape() {
    var tracksToSave = new Array();
    $("body#mixtape.edit ul.trackslist li[id^='track']:not(.ui-sortable-helper)").each(function() {
      tracksToSave.push(parseInt($(this).attr("id").substr(6)));
    });
    // ajax code to save the list
     $.post("/tape",{"tracks":tracksToSave.toString()},function() {
       // saved!
     });
  };
  
  // takes millis, outputs min:secs, with minimal you get 0..1..2, etc
  function prettyPrintMs(ms, minimal) {
    var min = Math.floor(ms / 60000);
    var secs = Math.floor((ms/1000) % 60);
    if (secs < 10 && !minimal) {
      secs = "0" + secs;
    }
    if (min < 1 && minimal) {
      return secs;
    } else {
      return min + ":" + secs;      
    }
  }

  // insert a line in a tapecloud
  function insertMixTapeItem(track) {
    // don't insert track if it's already in the playlist
    var insertTrack = true;
    $("ul.trackslist li.empty").remove();
    $("ul.trackslist li").each(function() {
      if(this.id.substr(6) == track.id) {
        insertTrack = false;
      }
    });
    
    if(insertTrack) {
      var item = $("#stripe-template li").clone();
      soundManager.createSound({
        id: 'track-'+track.id,
        url: track.stream_url,
        whileloading: function() {
          item.find(".loaded").text(Math.floor(this.bytesLoaded*100/this.bytesTotal) + "%");
        },
        whileplaying: function() {
          item.find(".clock").text(prettyPrintMs(this.position)+" / ");
          item.find(".progress-bar").css("width",this.position*100/track.duration + "%");
          document.title = prettyPrintMs(this.position) + " - " + track.user.username + " - " + track.title + "/ TapeCloud";
        },
        onfinish: function() {
          // check what is the next or if i'm at the end of a list
          item.removeClass('hilite');
          item.find(".clock").html("");
          if(item.next("li").length !== 0) {
            item.next("li").addClass('hilite');
            soundManager.sounds[item.next("li").attr("id")].play();
            soundManager.sounds[item.next("li").attr("id")].setPosition(0);
          }
        }
      });

      if($.browser.safari) {
        item.css({backgroundImage:"url(" + track.waveform_url + ")"});
      }
      
      
      item.click(function() { // item is stopped
        item.siblings().removeClass('paused');
        if(item.hasClass("hilite")) {
          soundManager.pause('track-'+track.id);
          item.removeClass('hilite');
          item.addClass('paused');
        } else { // item is playing
          //soundManager.stopAll();
          $("ul.trackslist li").removeClass("hilite").find(".clock").text("");
          for(i in soundManager.sounds) { soundManager.pause(soundManager.sounds[i].sID) };
          soundManager.sounds['track-'+track.id].play();
          if(!item.hasClass('paused')) {
            soundManager.sounds['track-'+track.id].setPosition(0);              
          } else {
            item.removeClass('paused');              
          }
          document.title = track.user.username + " - " + track.title + "/ TapeCloud";
          item.addClass('hilite');
        }
      })
      .hover(function() {
        item.addClass("hover");
      },function() {
        item.removeClass("hover");
      })
      .attr("id","track-"+track.id)
      .find(".artist").text(track.user.username).end()
      .find(".title").text(track.title).end()
      .find(".info strong").text(prettyPrintMs(track.duration)).end()
      .find(".info .buy a").attr("href",track.permalink_url).end()
      .find("a.remove-link").click(function(ev) {
        $(ev.target).parents("li").fadeOut('fast',function() {
          soundManager.pause($(ev.target).parents("li").attr("id"));
          $(ev.target).parents("li").remove();
          saveTape();
        });
        ev.stopPropagation();
        return false;
      }).end()
      .appendTo($("ul.trackslist"))
      .hide().fadeIn("slow");
      
      // show purchase url if it exists
      if(track.purchase_url) {
        item.find(".info .buy span a").attr("href",track.purchase_url).end();
        item.find(".info .buy span").show();
      }
    }
  }
  
  // key up action on create tape
  $("#tape-name").keyup(function() {
    var fixed = jQuery.trim($("#tape-name").val()).replace(/[^\w]+/g, "");
    $("#tape-name-facto").html("tapecloud.com/"+fixed);
    $("#tape-name-2").val(fixed);
  })  
  
});

// init soundmanager
soundManager.url = 'scripts';
soundManager.flashVersion = 8;
soundManager.useConsole = true;
soundManager.waitForWindowLoad = false;
soundManager.consoleOnly = true;

// disable debug mode after development/testing..
soundManager.debugMode = false;
