// - Controls
var play = document.querySelector("#play");
var prev = document.querySelector("#prev");
var next = document.querySelector("#next");
var stop = document.querySelector("#stop");
// - Time
var elapsedTime = document.querySelector("#elapsedtime");
var totalTime = document.querySelector("#totaltime");
var progressBar = document.querySelector("#progressbar");
var audioControls = document.querySelector("#controls");
// - UI elements
var audio = document.querySelector("#mytrack");
var tracks = document.querySelector("#tracks");
var artwork = document.querySelector("#artwork");
var background = document.querySelector("#background");
// - Interval
var timer;
// - Volume
var volume = audio.volume = 0.4;
// - Theme
var colorTheme = "orange";
colorTheme += "/";
// - Project root
var projectDir = "http://www.michaelmammoliti.com/projects/audioJS/";
// - Project folders
var tracksDir = projectDir + "songs/";
var artworksFolder = projectDir + "artworks/";
var iconsFolder = projectDir + "icons/" + colorTheme;
// - Tracks
var defaultTrack = 1;
var currentTrack = defaultTrack;
var playlist = [];
// - Audio
var duration;
var audioState = "pause";
// - Auto
var autoPlay = false;
var autoRepeat = true;
// - Audio Controls
function playAudio()
{
// If no track loaded
if(audio.getAttribute("src") === "")
{
audio.src = tracksDir + addZero(defaultTrack + 1, 2) + ".mp3";
}
// Play
audio.play();
audioState = "play";
changeBackgroundImage(play, iconsFolder + "pause.png");
// Update the time
timer = setInterval(
function()
{
updateTime();
},
100
);
}
// - Control's functions
function pauseAudio()
{
audio.pause();
audioState = "pause";
changeBackgroundImage(play, projectDir + "icons/darkblue/play.png");
clearInterval(timer);
}
function stopAudio()
{
audio.currentTime = 0;
clearInterval(timer);
}
// - Update DOM elements
// Activate the track
function updateActiveTrack(num)
{
tracks.children[num-1].classList.add("active");
}
// Chamge audio tag song
function changeSong(num)
{
// Set new song
currentTrack = parseInt(num);
// Delete CSS classes to all tracks
for(var i = 0; i < playlist.length; i++)
{
tracks.children[i].removeAttribute("class");
}
// CSS Highlight activated track
updateActiveTrack(currentTrack);
// Change track
audio.src = tracksDir + addZero(currentTrack, 2) + ".mp3";
// Update image
var artworkSrc = artworksFolder + addZero(currentTrack,2) + ".jpg";
artwork.src = artworkSrc;
changeBackgroundImage(artwork, artworkSrc);
changeBackgroundImage(document.body, artworkSrc);
// Check if the audio is playing and then play it
if(audioState === "play")
{
playAudio();
}
}
// - TIME
function getAudioSeconds(string)
{
var seconds = string % 60;
seconds = addZero(Math.floor(seconds), 2);
if(seconds < 60)
{
return seconds;
}
else
{
return "00";
}
}
function getAudioMinutes(string)
{
var minutes = (string / 60);
minutes = addZero(Math.floor(minutes), 2);
if(minutes < 60)
{
return minutes;
}
else
{
return "00";
}
}
// - FIX ZERO - Nice functions i made, i think sharing will it helps
// Add howManyZero to from the begin
function addZero(word, howManyZero)
{
word = String(word);
while(word.length < howManyZero)
{
word = "0" + word;
}
return word;
}
// - Remove howManyZero from the begin
function removeZero(word, howManyZero)
{
word = String(word);
var i = 0;
while(i < howManyZero)
{
if(word[0] === "0")
{
word = word.substr(1, word.length);
}
else { break; }
i++;
}
return word;
}
// - Manage DOM Nodes
function insertDOMElement(parent, htmlString)
{
parent.insertAdjacentHTML("beforeend", htmlString);
}
function createTrackItem(trackNum, trackTitle, trackArtist, trackImage)
{
var div = "";
div += "";
div += "" + trackNum + ". " + trackArtist + " - " + trackTitle + "";
return div;
}
function populateTrack()
{
for(var i = 0; i < tracks.children.length; i++)
{
var trackName = tracks.children[i].getAttribute("trackname");
var trackArtist = tracks.children[i].getAttribute("trackartist");
var trackartwork = tracks.children[i].getAttribute("trackartwork");
playlist.push({title: trackName, artist: trackArtist, artwork: trackartwork});
insertDOMElement(
tracks.children[i],
createTrackItem(addZero( (i+1) ,2),
playlist[i].title,
playlist[i].artist,
artworksFolder + playlist[i].artwork)
);
tracks.children[i].removeAttribute("trackname");
tracks.children[i].removeAttribute("trackartist");
tracks.children[i].removeAttribute("trackartwork");
tracks.children[i].setAttribute("tracknum", i+1);
}
}
// - DOM Animation / Styles / Updates
function changeBackgroundImage(element, image)
{
element.style.backgroundImage = "url(" + image + ")";
}
function updateProgressBarPosition()
{
var percentage = audio.currentTime * 100 / duration;
progressBar.children[0].style.width = percentage + "%";
}
function updateTime()
{
var audioTime = getAudioMinutes(audio.currentTime) + ":" + getAudioSeconds(audio.currentTime);
updateProgressBarPosition();
elapsedTime.innerHTML = audioTime;
if(audio.ended)
{
if(currentTrack === (playlist.length))
{
currentTrack = defaultTrack;
changeSong(currentTrack);
}
else
{
currentTrack = currentTrack + 1;
changeSong(currentTrack);
}
if(autoRepeat === true)
{
playAudio();
}
}
}
// - POPULATE HTML
populateTrack();
// - EVENTS
window.onload = function()
{
changeSong(defaultTrack);
};
audio.addEventListener(
'loadedmetadata',
function()
{
duration = audio.duration;
totalTime.innerHTML = getAudioMinutes(duration) + ":" + getAudioSeconds(duration);
}
);
play.addEventListener(
"click",
function()
{
if(audioState === "pause")
{
playAudio();
updateActiveTrack(currentTrack);
}
else if(audioState === "play")
{
pauseAudio();
}
}
);
stop.addEventListener(
"click",
function()
{
stopAudio();
pauseAudio();
updateTime();
}
);
prev.addEventListener(
"click",
function()
{
if(currentTrack > 1)
{
stopAudio();
changeSong(currentTrack - 1);
}
else if(currentTrack === 1)
{
stopAudio();
changeSong(currentTrack);
}
}
);
next.addEventListener(
"click",
function()
{
if(currentTrack < playlist.length)
{
stopAudio();
updateTime();
changeSong(currentTrack + 1);
}
else
{
currentTrack = 1;
changeSong(currentTrack);
}
}
);
progressBar.addEventListener(
"click",
function(e)
{
var mouse,
percentage,
newTime;
if(e.offsetX){ mouseX = e.offsetX; }
if(mouseX == undefined && e.layerX){ mouseX = e.layerX; }
percentage = mouseX / progressBar.offsetWidth;
newTime = audio.duration * percentage;
audio.currentTime = newTime;
}
);
// - Add events to all tracks
for(var i = 0; i < playlist.length; i++)
{
tracks.children[i].addEventListener(
"click",
function()
{
if(this.classList[0] !== "active")
{
tracks.children[1].removeAttribute("class");
this.classList.add("active");
changeSong(parseInt(this.getAttribute("tracknum")));
}
}
);
}
// - Add events to all audioControls
for(var i = 0; i < audioControls.children.length; i++)
{
audioControls.children[i].addEventListener(
"mousedown",
function()
{
if(this.classList[0] !== "shadow")
{
for(var x = 0; x < audioControls.children.length; x++)
{
audioControls.children[x].classList.remove("shadow");
}
this.classList.add("shadow");
}
}
);
audioControls.children[i].addEventListener(
"mousedown",
function()
{
changeBackgroundImage(this, iconsFolder + this.id + ".png");
if(this.classList[0] !== "shadow")
{
for(var x = 0; x < audioControls.children.length; x++)
{
audioControls.children[x].classList.remove("shadow");
}
this.classList.add("shadow");
}
}
);
audioControls.children[i].addEventListener(
"mouseup",
function()
{
changeBackgroundImage(this, projectDir + "icons/darkblue/" + this.id + ".png");
this.classList.remove("shadow");
}
);
}