I have been doing some JS lately and I would like to get some constructive criticism. [The project I am working on](https://github.com/Nikamura/YoutubeToSpotify-JavaScript/) [Live demo](http://youtubetospotify.eu01.aws.af.cm/) var SpotifiedList = [], youtubeSongs, spotifySongs = 0, spotifiedSongs = 0, playNext; $(document).ready(function () { var id = window.location.hash; if (id) { $("#playlistID").val(id.substring(1)); startProcess(); } }); function resetTimer() { console.log("timer reset!") clearTimeout(playNext); } function startProcess() { $("#errorOccured").hide(); if ($("#playlistID").val().length < 5) { // Checks if there is something entered $(".alert-danger").fadeIn().html("Please enter a valid Youtube <b>playlist ID</b>."); } else { window.location.hash = $("#playlistID").val(); $("#list").html('<center>This might take some time.</center>'); $(".alert-info").html("<center>Loading</center>"); $(".alert-danger").hide(); retrieveYoutubePlaylist($("#playlistID").val(), 1, [], 1); } } function retrieveYoutubePlaylist(id, startIndex, list, k) { $("#loading").show(); $.ajax({ url: 'https://gdata.youtube.com/feeds/api/playlists/' + id + '?v=2&alt=json&start-index=' + startIndex + '&max-results=50', dataType: 'json', success: function (data) { if (typeof data.feed.entry === 'undefined') {} else { for (var i = 0; i < data.feed.entry.length; i++) { if (k == 1) $("#list").html(""); var title = data.feed.entry[i].title.$t; list.push(title); retrieveSpotify(title); k++; } retrieveYoutubePlaylist(id, startIndex + 50, list, k); youtubeSongs = list.length; } }, error: function (data, a, err) { if (err) { $(".alert-danger").fadeIn().html("Error Happened: " + err); } } }); } function retrieveSpotify(title) { var url = 'http://ws.spotify.com/search/1/track.json?q=' + parseTitle(title); $.getJSON(url, function (data) { spotifySongs += 1; if (data.tracks.length > 0) { spotifiedSongs += 1; $("#list").append('<li><a href="' + data.tracks[0].href + '" onClick="resetTimer();" title="' + data.tracks[0].artists[0].name + ' - ' + data.tracks[0].name + '">' + data.tracks[0].artists[0].name + ' - ' + data.tracks[0].name + '</a></li>'); var info = { 'url': data.tracks[0].href, 'length': Math.round(data.tracks[0].length * 1000), 'name': data.tracks[0].artists[0].name + ' - ' + data.tracks[0].name } SpotifiedList.push(info); } if (youtubeSongs == spotifySongs) { $(".alert-info").html('<div class="btn-group">\ <button type="button" class="btn btn-default" onClick="play();">\ <span class="glyphicon glyphicon-play"></span> Play/Skip\ </button>\ </div><br>Converted songs: <strong>' + spotifiedSongs + '</strong>/' + youtubeSongs); } }); } function parseTitle(title) { var newTitle = title .replace(/[-!$%^&_+|~=`{}:";'<>?,.\/]/g, '') .replace(/ /g, ' ') .replace(/\[.*\]/g, '') .replace(/lyrics/g, '') .replace(/\(.*\)/g, '') .replace(/\*.*\*/g, '') .replace(/ /g, ' '); return newTitle; } function play() { clearTimeout(playNext); var song = SpotifiedList[Math.floor((Math.random() * SpotifiedList.length))]; window.location = song.url; x = (song.length / 1000) >> 0; seconds = x % 60 x = (x / 60) >> 0; minutes = x % 60; console.log('Playing: ' + song.name + ' (' + minutes + ':' + seconds + ')'); playNext = setTimeout(play, song.length); }