/**
 * Projekt ONI - js/admin.js
 * (c) 2010 datahouse AG
 */

// helper functions

function strip_id(el) {
    var id = el.attr('id');
    id = id.substr(1,id.length - 1);
    return parseInt(id);
}
function num_col() {
    return $('#matrix tr.names th').length;
}
function num_row() {
    return $('#matrix th').length - num_col();
}
function num_entry() {
    return num_col() * num_row();
}
function get_col(m) {
    return m % num_col();
}
function get_row(m) {
    return Math.floor(m / num_col());
}

// matrix logic

var col_state = function(nr) {
    var col = $('#c' + nr);
    if (col.hasClass('curr')) return true;
    return false;
};
var row_state = function(nr) {
    var row = $('#r' + nr);
    if (row.hasClass('curr')) return true;
    return false;
};
var entry_state = function(nr) {
    var c = get_col(nr);
    var r = get_row(nr);
    if (col_state(c) && row_state(r)) return 2;
    for (var i = 0; i < num_col(); ++i) {
        if (i != c && col_state(i)) return 0;
    }
    for (var i = 0; i < num_row(); ++i) {
        if (i != r && row_state(i)) return 0;
    }
    if (col_state(c) || row_state(r)) return 1;
    return 0;
};
var col_set = function(nr,set) {
    var el = $('#c' + nr);
    if (set) $('img',el).attr('src','img/name' + nr + '_hover.png');
    else if (!col_state(nr)) $('img',el).attr('src','img/name' + nr + '.png');
};
var row_set = function(nr,set) {
    var el = $('#r' + nr);
    if (set) el.addClass('active');
    else if (!row_state(nr)) el.removeClass('active');
};
var entry_set = function(nr,set) {
    var el = $('#m' + nr);
    if (el.length == 0) return;
    var c = get_col(nr);
    var r = get_row(nr);
    var es = entry_state(nr);
    if (es == 2) return;
    if (set == 2) $('img',el).attr('src','img/has_hover.gif');
    else if (set == 0 && es == 0) $('img',el).attr('src','img/has_normal.gif');
    else $('img',el).attr('src','img/has_active.gif');
};
var col_active = function(el,active) {
    var c = strip_id(el);
    col_set(c,active);
    var ne = num_entry();
    var nc = num_col();
    for (var i = c; i < ne; i += nc) {
        if (active) entry_set(i,1);
        else entry_set(i,0);
    }
};
var row_active = function(el,active) {
    var r = strip_id(el);
    row_set(r,active);
    var nc = num_col();
    for (var i = r * nc; i < (r + 1) * nc; ++i) {
        if (active) entry_set(i,1);
        else entry_set(i,0);
    }
};
var entry_active = function(el,active) {
    var i = strip_id(el);
    var c = get_col(i);
    var r = get_row(i);
    col_set(c,active);
    row_set(r,active);
    if (active) entry_set(i,2);
    else entry_set(i,0);
};

// hover functions

var col_on = function() {
    col_active($(this),true);
};  
var col_off = function() {
    col_active($(this),false);
};
var row_on = function() {
    row_active($(this),true);
};
var row_off = function() {
    row_active($(this),false);
};
var entry_on = function() {
    entry_active($(this),true);
};
var entry_off = function() {
    entry_active($(this),false);
};

// bind handlers

$(function() {
$('#matrix td a').each(function() {
    $(this).hover($.proxy(entry_on,$(this)),$.proxy(entry_off,$(this)));   
});
$('#matrix tr.names th a').each(function() {
    $(this).hover($.proxy(col_on,$(this)),$.proxy(col_off,$(this))); 
});
$('#matrix th a').not('#matrix tr.names th a').each(function() {
    $(this).hover($.proxy(row_on,$(this)),$.proxy(row_off,$(this)));
});
});

// preload images

$(function() {
    var has_active = $('<img />').attr('src','img/has_active.gif');
    var has_hover = $('<img />').attr('src','img/has_hover.gif');
    var nc = num_col();
    for (var i = 0; i < nc; ++i) {
        if (col_state(i)) {
            var img = $('<img />').attr('src','img/name' + i + '.png');
        } else {
            var img = $('<img />').attr('src','img/name' + i + '_hover.png');
        }
    }
});
