////////////////////////////////////////////
//
// Meditation Timer 0.2.1
//
// Copyright 2009, Peter L. McArthur
//
// Released under the license: Creative Commons Attribution 2.0 UK:
// England & Wales.  See
// http://creativecommons.org/licenses/by/2.0/uk/ for details.

var menu;

function initialise() {
    menu = new Menu(document.getElementById("menu"));
}

function Sound(id) {
    var sound_object = document.getElementById(id);
    this.play = function() {
	try {
	    sound_object.Play();
	} catch(e) {
	    sound_object.DoPlay();
	}
    }
}

function Menu(form) {
    var self = this;
    var seconds_in_minute = 60;
    
    var get_ticks = function() {
	return (form.minutes.selectedIndex + 1) * seconds_in_minute;
    }
    var get_bells = function() {
	return form.bells.selectedIndex + 1;
    }

    var start = function() {
	form.minutes.disabled = true;
	form.bells.disabled = true;
	form.action.value = "Pause";
	form.stop.disabled = false;

	bells = new Bells(get_bells(), get_ticks(), "pay-attention-sound", "finished-sound");
	bells.start_ticks();
    }

    var pause = function() {
	bells.stop_ticks();
	form.action.value = "Resume";
    }

    var resume = function() {
	form.action.value = "Pause";
	bells.start_ticks();
    }

    this.stop = function() {
	bells.stop_ticks();
	bells.clear();
	form.minutes.disabled = false;
	form.bells.disabled = false;
	form.action.value = "Start";
	form.stop.disabled = true;
    }

    this.do_action = function() {
	if (form.action.value == "Start")
	    start();
	else if (form.action.value == "Pause")
	    pause();
	else if (form.action.value == "Resume")
	    resume();
    }

    this.finished = function() {
	bells.stop_ticks();
	form.minutes.disabled = false;
	form.bells.disabled = false;
	form.action.value = "Start";
	form.stop.disabled = true;
    }
}
	
function Countdown(ticks) {
    var self = this;

    this.ticks_left = ticks;
    var text_node = function() {
	var min = Math.floor(self.ticks_left/60);
	var sec = self.ticks_left % 60;
	if (sec < 10) sec = "0" + sec;
	return document.createTextNode("   " + min + ":" + sec);
    }

    this.div = document.createElement("span");
    this.div.appendChild(text_node());

    this.tick = function() {
	--self.ticks_left;
	self.div.replaceChild(text_node(), self.div.firstChild);
	return self.ticks_left;
    }
}

function Bells(total_bells, ticks, pay_attention_sound_id, finished_sound_id) {
    var self = this;

    this.bells_left = total_bells;

    var div = document.getElementById("countdown");

    var pay_attention = new Sound(pay_attention_sound_id);
    var finished = new Sound(finished_sound_id);

    this.clear = function() {
	while (div.firstChild)
	    div.removeChild(div.firstChild);
    }
    this.clear();

    var countdowns = Array(total_bells);
    for (var i = 0; i < total_bells; ++i) {
	countdowns[i] = new Countdown(ticks);
	div.appendChild(countdowns[i].div);
    }

    this.tick = function() {
	var countdown = countdowns[total_bells - self.bells_left];
	if (!countdown.tick()) {
	    if (--self.bells_left) {
		pay_attention.play();
	    } else {
		menu.finished();
		finished.play();
	    }
	}
    }
    this.start_ticks = function() {
	self.interval_handle = setInterval("bells.tick()", 1000);
    }
    this.stop_ticks = function () {
	clearInterval(self.interval_handle);
    }
}

