// JavaScript Document
// Code copyright Savraj Singh 2008.

var count = 1;
var interval = null;
var bpm = 60;
var bpc = 4;
var s;
var beats;
var initialized = false;
var accentBeats = [];
var completedCycles = 0;
var MAX_ACCENTS = 99;

function animator() {
		if(count > bpc) count = 1;

		var e = document.getElementById("box1");
		if (accentBeats[count]) { e.style.backgroundColor = 'red'; soundManager.play('tick'); }
		else { e.style.backgroundColor = 'black'; soundManager.play('tock'); }
		e.innerHTML = count;

		if (count==bpc) { 
			count = 1;
			completedCycles++;
			document.getElementById("compcyc").innerHTML = completedCycles;
		}
		else count++; 
}

function resetCycles() {
	completedCycles = 0;
	document.getElementById("compcyc").innerHTML = completedCycles;
}

function buttonCheck() {
        if(document.getElementById("startButton").innerHTML == "Start") {
				document.getElementById("box1").className = "running";
                document.getElementById("startButton").innerHTML = "Stop";
				animator();
				interval = setInterval("animator()", 60000/bpm);
        } 
		else {
                document.getElementById('startButton').innerHTML = "Start";
				count = 1;
                clearInterval(interval);
        }
}

function getTempoName(bpm) {
	if (bpm <= 20) return "Larghissimo";
	if (bpm <= 40) return "Largamente";
	if (bpm <= 60) return "Largo";
	if (bpm <= 66) return "Larghetto";
	if (bpm <= 76) return "Adagio";
	if (bpm <= 80) return "Adagietto";
	if (bpm <= 108) return "Andante";
	if (bpm <= 120) return "Moderato";
	if (bpm <= 168) return "Allegro";
	if (bpm <= 200) return "Presto";
	if (bpm <= 300) return "Prestissimo";
}

function initializeSMetronome() {
	
	setupAccentBeats();
	
	s = new Slider(document.getElementById("slider-1"), document.getElementById("slider-input-1"));

	s.onchange = function () {
		bpm = s.getValue();
		document.getElementById("bpmspan").innerHTML = bpm;
		document.getElementById("bpmname").innerHTML = getTempoName(bpm);
		if (document.getElementById("startButton").innerHTML == "Stop") {
			clearInterval(interval);
			interval = setInterval("animator()", 60000/bpm);
		}
		updateLink();
	}

	s.setMaximum(220);
	s.setMinimum(1);

	beats = new Slider(document.getElementById("slider-2"), document.getElementById("slider-input-2"));

	beats.onchange = function () {
		bpc = beats.getValue();
		showString = bpc;
		if (bpc == 1) showString += " Beat";
		else showString += " Beats";
		document.getElementById("bpcspan").innerHTML = showString;
		updateLink();
		updateAccentBeats();
	}

	beats.setMaximum(MAX_ACCENTS);
	beats.setMinimum(1);
	initialized = true;
}

function updateLink() {
	var url = "http://webmetronome.com/";
	if (initialized) {
		var t = s.getValue();
		var b = beats.getValue(); 
		url = url + "?t=" + t + "&b=" + b + "&a=";
		
		for (i = 1; i <= b; i++) {
			if (accentBeats[i]) {
				url = url + "1";
			}
			else {
				url = url + "0";
			}
		}
	}
	document.getElementById("beatlink").value = url;
}

function createBeatDivs() {
	beatlist = document.getElementById("accent_beats");
	
	for (i = 1; i <= MAX_ACCENTS; i++) {
		var tog_link;

		if (accentBeats[i]) {
			var tog_link = '<div id="bf'+i+'" class="accentBeatLink" style="display:none;"><a href="javascript:toggleAccentBeat('+i+');">';
		}
		else {
			var tog_link = '<div id="bf'+i+'" class="regularBeatLink" style="display:none;"><a href="javascript:toggleAccentBeat('+i+');">';
		}
			
		beatlist.innerHTML += tog_link + i +"</a></div> ";
		if (i%8==0) {
			beatlist.innerHTML += "<div style='clear:both;'/>";
		}
	}
	beatlist.innerHTML += "<div style='clear:both;'/>";	
}

function setupAccentBeats() {
	for (i = 1; i <= MAX_ACCENTS; i++) {
		accentBeats[i] = 0;
	}
	accentBeats[1] = 1;

	createBeatDivs();
	updateAccentBeats();
}

function toggleAccentBeat(number) {
	accentBeats[number] = !accentBeats[number];
	updateAccentBeats();
}

function loadAccents(accent_string) {
	accent_array = accent_string.split("");

	for (i = 0; i <= accent_array.length; i++) {
		if (accent_array[i] == 1) {
			accentBeats[i+1] = 1;
		}
		else {
			accentBeats[i+1] = 0;
		}
	}
	
	updateAccentBeats();
}

function updateAccentBeats() {
	
	for (i = 1; i <= MAX_ACCENTS; i++) {
		beat_flag = document.getElementById("bf"+i);
		if (i > bpc) {	
			beat_flag.style.display = "none"; 
		}
		else {
			if (accentBeats[i]) { 
				beat_flag.className = "accentBeatLink"; 
			}
			else {
				beat_flag.className = "regularBeatLink";
			}
			beat_flag.style.display = "block";
		}
	}	
	
	updateLink();
}

function updateBPM(change) {
	s.setValue(s.getValue()+change);
}
