var SPREADSHEET_TABLE_CLASS_NAME = 'table-builder-spreadsheet';
var SPREADSHEET_BODY_CLASS_NAME = 'table-builder-spreadsheet';
var SPREADSHEET_HEAD_CLASS_NAME = 'table-builder-spreadsheet';
var SPREADSHEET_FOOT_CLASS_NAME = 'table-builder-spreadsheet';

var SPACE = ' ';
//var SPACE = String.fromCharCode(8594);
var UARR = String.fromCharCode(8593);
var DARR = String.fromCharCode(8595);

var RESIZE_AREA_LEFT_WIDTH = 2;
var RESIZE_AREA_RIGHT_WIDTH = 2;

var data = new Array;
var cursor_start_x = 0;
var resize = false;
var increase_object = null;
var increase_object_start_width = 0;
var decrease_object = null;
var decrease_object_start_width = 0;

var first_event = null, second_event = null;
var sort_by = '';
var direction = '';

/****************************
        spreadsheet
****************************/

function startSpreadsheets()
{
    var tables = document.getElementsByTagName('TABLE');
    var number = 0;
    for (var i = 0; i < tables.length; i ++) {
        if (tables[i].className && tables[i].className == SPREADSHEET_TABLE_CLASS_NAME) {
            tables[i].setAttribute('number', number);
            setSpreadsheet(tables[i]);
            number ++;
        }
    }
    
}

function setSpreadsheet(table)
{
    //set head cells
    var head = getTableHead(table);

    var head_rows = head.getElementsByTagName('TR');
    
    var cells = new Array;
    for (var i = 0; i < head_rows[0].childNodes.length; i ++) {
        if (head_rows[0].childNodes[i].tagName && head_rows[0].childNodes[i].tagName.toUpperCase() == 'TH') {
            cells[cells.length] = head_rows[0].childNodes[i];
        }
    }

    for (var i = 0; i < cells.length; i ++) {
        /*var prev_cell = cells[i - 1];
        var next_cell = cells[i + 1];*/
        cells[i].onmousemove = function (event) {
            var increase = getCursorPosition(event).x > (getElementPosition(this).x + this.offsetWidth - RESIZE_AREA_RIGHT_WIDTH);
            var decrease = getCursorPosition(event).x < (getElementPosition(this).x + RESIZE_AREA_LEFT_WIDTH);
            if (increase || decrease) {
                this.style.cursor = 'w-resize';
            } else {
                this.style.cursor = 'default';
            }
            if (resize) {
                var interval = getCursorPosition(event).x - cursor_start_x;
                if (increase_object_start_width + interval > 0 && decrease_object_start_width - interval > 0) {
                    increase_object.style.width = increase_object_start_width + interval + 'px';
                    decrease_object.style.width = decrease_object_start_width - interval + 'px';
                }
            }
        }
        
        cells[i].onmouseover = function (event) {
        }

        cells[i].onmouseout = function () {
        }

        cells[i].onmousedown = function (event) {
            var increase = getCursorPosition(event).x > (getElementPosition(this).x + this.offsetWidth - RESIZE_AREA_RIGHT_WIDTH);
            var decrease = getCursorPosition(event).x < (getElementPosition(this).x + RESIZE_AREA_LEFT_WIDTH);
            if (increase || decrease) {

                //get prev sibling
                var prev_cell = this.previousSibling;
                while (prev_cell && !(prev_cell.tagName && prev_cell.tagName.toUpperCase() == 'TH')) {
                    prev_cell = prev_cell.previousSibling;
                }

                //get next sibling
                var next_cell = this.nextSibling;
                while (next_cell && !(next_cell.tagName && next_cell.tagName.toUpperCase() == 'TH')) {
                    next_cell = next_cell.nextSibling;
                }
                
                if ((decrease && prev_cell && prev_cell.tagName && prev_cell.tagName.toUpperCase() == 'TH')
                 || (increase && next_cell && next_cell.tagName && next_cell.tagName.toUpperCase() == 'TH')) {
                    //alert([prev_cell.innerHTML, next_cell]);
                    if (increase) {
                        increase_object = this;
                        decrease_object = next_cell;
                    } else {
                        increase_object = prev_cell;
                        decrease_object = this;
                    }
                    //alert([decrease_object.innerHTML, increase_object.innerHTML]);
                    increase_object_start_width = increase_object.offsetWidth;
                    decrease_object_start_width = decrease_object.offsetWidth;
                    resize = true;
                    cursor_start_x = getCursorPosition(event).x;
                }
            }
        }
        
        cells[i].onmouseup = function () {
            if (resize) {
                resize = false;
            } else {
                var cell = this;
                if (!first_event) {
                    first_event = setTimeout(function() {setOrder(table, cell)}, 100);
                } else {
                    second_event = setTimeout(function() {setOrder(table, cell)}, 100);
                }
            }
            this.style.cursor = 'default';
        }
        
        cells[i].innerHTML = SPACE + cells[i].innerHTML;
        
    }
    
    var max_height = table.offsetHeight;

    if (!is_browser_ie()) {
        var content = document.getElementById('content');
        var container = document.getElementById('container');
        var middle = document.getElementById('middle');

        var content_pad = 120;//max_height - content.offsetHeight;
        if (is_browser_opera()) {
            content_pad += 20;
        }
        var container_pad = content_pad + container.offsetHeight - content.offsetHeight;
        var middle_pad = container_pad + middle.offsetHeight - container.offsetHeight;
        
        content.style.height = (max_height + content_pad) + 'px';
        container.style.height = (max_height + container_pad) + 'px';
        middle.style.height = (max_height + middle_pad) + 'px';
    }
}

function doOrder()
{
    clearTimeout(first_event);
    first_event = false;
    clearTimeout(second_event);
    second_event = false;
    window.location = '?sys_order=' + sort_by + '&sys_dir=' + direction;
}

function doEdit(id)
{
    clearTimeout(first_event);
    first_event = false;
    clearTimeout(second_event);
    second_event = false;
    window.location = '~edit?id=' + id;
}

function doMark(id)
{
    if (!first_event) {
        first_event = setTimeout(function() {checkBox(id);markRow(id);}, 300);
    } else {
        second_event = setTimeout(function() {checkBox(id);markRow(id);}, 300);
    }
}

function setTableData(table)
{
    var table_num = table.getAttribute('number');

    //set body cells
    var body = getTableBody(table);
    
    //make table data
    var body_rows = body.getElementsByTagName('TR');
    data[table_num] = new Array;
    for (var i = 0; i < body_rows.length; i ++) {
        data[table_num][data[table_num].length] = new Array;
        var cells = body_rows[i].childNodes;
        for (var j = 0; j < cells.length; j ++) {
            if (cells[j].tagName && cells[j].tagName.toUpperCase() == 'TD') {
                var value = cells[j].innerHTML;
                if (parseInt(value) == value) {
                    value = parseInt(value);
                }
                data[table_num][data[table_num].length - 1][data[table_num][data[table_num].length - 1].length] = value;
            }
        }
    }
}

function getTableBody(table)
{
    var TBODYs = table.getElementsByTagName('TBODY');
    var i = 0;
    var body;
    while (body = TBODYs[i]) {
        if (body.className == SPREADSHEET_BODY_CLASS_NAME) {
            break;
        }
    };
    return body;
}

function getTableHead(table)
{
    var THEADs = table.getElementsByTagName('THEAD');
    var i = 0;
    var head;
    while (head = THEADs[i]) {
        if (head.className == SPREADSHEET_HEAD_CLASS_NAME) {
            break;
        }
    };
    return head;
}

function resetOrder(table)
{
    var head = getTableHead(table);
    
    var head_rows = head.getElementsByTagName('TR');
    
    var cells = head_rows[0].childNodes;
    for (i = 0; i < cells.length; i ++) {
        if (cells[i].tagName && cells[i].tagName.toUpperCase() == 'TH') {
            cells[i].className = 'default';
            cells[i].innerHTML = cells[i].innerHTML.replace(new RegExp('^(' + SPACE + '|' + DARR + '|' + UARR + ')'), SPACE);
        }
    }
}

function setOrder(table, cell)
{
    if (cell.className == 'order') {
        direction = cell.innerHTML.match(new RegExp('^' + UARR)) ? 'asc' : 'desc';
    } else {
        direction = 'asc';
    }
    sort_by = cell.id.replace(new RegExp('^sort_'), '');
    
    resetOrder(table);

    cell.className = 'order';
    var arrow = direction == 'asc' ? DARR : UARR;
//    cell.innerHTML = cell.innerHTML.replace(new RegExp('^(' + SPACE + '|' + DARR + '|' + UARR + ')'), arrow);
    cell.innerHTML = cell.innerHTML.replace(new RegExp('^(' + SPACE + '|' + DARR + '|' + UARR + ')'), '');
    cell.innerHTML = arrow + cell.innerHTML;
    
    setTableData(table);
    var table_data = data[table.getAttribute('number')];
    
    //get cell number
    var head = getTableHead(table);
    
    var head_rows = head.getElementsByTagName('TR');
    
    var cells = head_rows[0].childNodes;
    var number = 0;
    for (i = 0; i < cells.length; i ++) {
        if (cells[i] === cell) {
            break;
        }
        if (cells[i].tagName && cells[i].tagName.toUpperCase() == 'TH') {
            number ++;
        }
    }
    
    var weight = new Array;
    for (var i = 0; i < table_data.length; i ++) {
        weight[i] = 0;
    }
    
    for (var i = 0; i < table_data.length; i ++) {
        for (var j = i + 1; j < table_data.length; j ++) {
            var compare = table_data[i][number] > table_data[j][number];
            if (direction == 'desc') {
                compare = !compare;
            }
            if (compare) {
                weight[i] ++;
            } else {
                weight[j] ++;
            }
        }
    }
    
    var order = new Array;
    for (var i = 0; i < weight.length; i ++) {
        order[weight[i]] = i;
    }
    
    //body cells
    var tbody = getTableBody(table);

    //make table data
    var tbody_rows = tbody.getElementsByTagName('TR');
    var new_tbody = tbody.cloneNode(false);
    for (var i = 0; i < order.length; i ++) {
        new_tbody.appendChild(tbody_rows[order[i]].cloneNode(true));
    }
    table.replaceChild(new_tbody, tbody);
}
