var total_hours = 72;

function qel(id) {

return q('#' + id)[0];

}

function unselect_do(elements) {

for (var i = 0; i < elements.length; i++) {
    q('#' + elements[i].id).removeClass('select');
}

}

function unselect(id) {

unselect_do(q('.' + id));
switch (id) {
    case 'hour':
        unselect_do(q('.halfhour'));
        select_halfhour();
        break;
    case 'halfhour':
        unselect_do(q('.hour'));
        break
    case 'day':
    case 'program':
        unselect_do(q('.program'));
        unselect_do(q('.day'));
        break;
}

}

function select_week(e, nbr) {

e.addClass = "select"

}

function select(id, bool) {

var el = q('#' + id);
if (bool) {
    el.addClass('select');
    return true;
} else {
    el.removeClass('select');
    return false;
}

}

function select_toggle(id) {

var el = q('#' + id);
return select(id, !el.hasClass('select'));

}

function select_hours_of_day(blocks) {

unselect('halfhour');
var halfhours = blocks_to_halfhours(blocks);
for (var i = 0; i < halfhours.length; i++) {
    select_halfhour(null, halfhours[i]);
}

}

function select_day(e, nbr) {

//nbr = nbr ? nbr : parseInt(e.id[e.id.length - 1]);
var day = 'day' + nbr;
var prg = 'program' + nbr;
select_toggle(day);
if (select_toggle(prg)) {
    var blocks = q('#' + prg).getHtml();
    if (blocks != "---") {
        unselect('day');
        var programs = q('.program');
        for (var i = 0; i < programs.length; i++) {
            if (q('#' + programs[i].id).getHtml() == blocks) {
                select_toggle('day' + i);
                select_toggle('program' + i);
            }
        }
        select_hours_of_day(blocks);
    } else {
        var programs = q('.program').filter('.select');
        for (var i = 0; i < programs.length; i++) {
            if (q('#' + programs[i].id).getHtml() != "---") {
                unselect('day');
                select_day(e, nbr);
            }
        }
        unselect('hour');
    }
} else {
    // If we have a multiple selection with hours and we click again on a day,
    // this day gets highlighted alone
    var other_days = q('.day').filter('.select');
    var other_hours = q('.hour').filter('.select');
    if (other_days.length * other_hours.length > 0) {
        unselect('day');
        select(day, true);
        select(prg, true);
        select_hours_of_day(q('#program' + nbr).getHtml());
    }else {
        unselect('hour');
    }
}

}

function select_program(e, nbr) {

select_day(e, nbr)

}

function halfhour_to_hour(halfhour) {

return Math.floor(halfhour / 2) + ":" +
    ( ( halfhour % 2 ) ? "30" : "00" );

}

function hour_to_halfhour(hour) {

var h = hour.split(":");
return parseInt(h[0]) * 2 + (h[1] == "00" ? 0 : 1);

}

function halfhour_range(start, end) {

return halfhour_to_hour(start) + " - " +
    halfhour_to_hour(end);

}

function halfhours_to_blocks(halfhours) {

var blocks = [];
var start = halfhours[0], end = start;
for (var i = 1; i < halfhours.length; i++) {
    if (halfhours[i] > end + 1) {
        blocks.push(halfhour_range(start, end + 1));
        start = halfhours[i];
    }
    end = halfhours[i];
}
if (start != undefined) {
    blocks.push(halfhour_range(start, end + 1));
}
return blocks;

}

function blocks_to_halfhours(blocks_html) {

var halfhours = [];
var blocks = blocks_html ? blocks_html.split('<br>') : [];
for (var i = 0; i < blocks.length; i++) {
    var fromto = blocks[i].split(" - ");
    var start = hour_to_halfhour(fromto.shift()),
        end = hour_to_halfhour(fromto.shift());
    for (var j = start; j < end; j++) {
        halfhours.push(j);
    }
}
return halfhours;

}

function select_hour(e, nbr) {

var bool = select_toggle(e.id);
select_halfhour(null, nbr * 2, bool);
select_halfhour(null, nbr * 2 + 1, bool);

}

function select_halfhour(e, nbr, bool) {

if (nbr || e) {
    if (!e) {
        e = qel('halfhour' + nbr);
    } else if (!nbr) {
        nbr = parseInt(e.id.replace(/halfhour/, ''));
    }
    if (bool != undefined) {
        select('halfhour' + nbr, bool);
    } else {
        bool = select_toggle(e.id);
    }
    var hour = Math.floor(nbr / 2);
    if (bool) {
        bool &= q('#halfhour' + (nbr ^ 1)).hasClass("select");
    }
    select('hour' + hour, bool);
}

var halfhours_el = q('.halfhour').filter('.select');
var halfhours = [];
for (var i = 0; i < halfhours_el.length; i++) {
    halfhours.push(parseInt(halfhours_el[i].id.replace(/halfhour/, '')));
}
var blocks = halfhours_to_blocks(halfhours).join("<br>");
if (blocks == "") {
    blocks = "---";
}

var prg_el = q('.program').filter('.select');
for (var i = 0; i < prg_el.length; i++) {
    q('#' + prg_el[i].id).setHtml(blocks);
}

}

function create_td(name, align, nbr, total, str, sp) {

var span = sp ? sp : 1;
return "<td align='" + align + "' class='" + name + "' id='" + name + nbr +
    "' " + " onclick='select_" + name + "(this," + nbr + ")' " +
    "width='" + 100 / total + "%' colspan='" + span + "'>" + str + "</td>";

}

function add_tr(id, s) {

var el = q('#tr_' + id);
var str = s ? s : "";
el.setHtml("<td onclick=\"unselect('" + id.replace(/s$/, '') + "');\">" + id + "</td>" +
    "<td><table border='1' width='100%'>" +
    "<tr id='" + id + "'></tr>" + str +
    "</table></td >");

}

function add_weeks(nbr) {

add_tr('weeks');
var weeks = "";
for (var i = 1; i <= nbr; i++) {
    weeks += create_td('week', 'center', i, nbr, i);
}
q('#weeks').setHtml(weeks);

}

function add_days() {

add_tr('days', "<tr id='programs'></tr>");
var days_str = ['Lu', 'Ma', 'Me', 'Je', 'Ve', 'Sa', 'Di'];
var days = "", programs = "";
for (var i = 0; i < 7; i++) {
    days += create_td('day', 'center', i, 7, days_str[i]);
    programs += create_td('program', 'center', i, 7, "---");
}
q('#days').setHtml(days);
q('#programs').setHtml(programs);

}

function add_hours() {

add_tr('hours', "<tr id='halfhours'></tr>");
var hours = "", halfhours = "";
for (var i = 6; i <= 20; i++) {
    hours += create_td('hour', 'center', i, 15, i, 2);
    halfhours += create_td('halfhour', 'center', i * 2, 30, ":00");
    halfhours += create_td('halfhour', 'center', i * 2 + 1, 30, ":30");
}
q('#hours').setHtml(hours);
q('#halfhours').setHtml(halfhours);

}