//TODO: Если в колонке сумма будет равна нуля то плагин подумает что это текстовая колонка и не выведет результата, а спрячет его

jQuery.fn.calcColSums = function(options){
    var $this = $(this);
    var defaults = {
        'misscols': [0], // индексы колонок, которые не нужно подсчитывать
        'trclass': 'total', // класс который присваивается строке(tr) с результатами подсчетов 
        'tdvalues': { // значения которые будут записаны в ячейку перед суммой
            '0': 'Total' // "Total" будет записано в ячейку с индексом "0", которая находится в строке с результатами
        },
        'hidenull': 1, // bool, 1 - значит если подсчет равен 0 - тогда мы не пишем нуль а вставляем пустую строку
        'hidenegative': 1 // прятать отрицательные занчения (если текст то тотал отрицательный)
    }
    
    var settings = $.extend({},defaults,options);

    // выполняем для массива таблиц
    $this.each(function(){
        // получаем массив сумм для колонок таблицы
        var totals = calcColumn($(this));
        // втсавляем в таблицу строку с подсчитанными результатами
        pasteTotals($(this), totals, settings);
    })


/* приватные функции */

/*
    Подсчитываем суммы для колонок таблицы
    @table - объект таблицы, где будем производить расчеты
    @colIndex - индекс колонки которую надо подсчитать
*/
    function calcColumn(table, colIndex){
        var cell_values = []; // массив значений сумм колонок

        table.find('tbody tr').each(function(){
            var cells = $(this).find('td');
            if(cells.length){// если есть ячейки
                
                cells.each(function(index){
                    var val = $(this).text(); // получаем содержимое ячейки
                    if(isNum(val)){ // если оно являетя числом
                        val = isNum(val, true);
                    }else{ // если в ячейке текст
                        val = (-1); 
                    }

                    if(cell_values[index] == null){
                        cell_values.push([]);
                    }
                    /*
                        Создаем массив следующей конструкции, пример:

                        cell_values[0][5,7,56]
                        cell_values[1][6,78,15]
                        
                        0,1 - индексы колонок
                    */        
                    cell_values[index].push(val);
                    
                    
                });
            }
            
        });
        
        // подсчитываем суммы для каждой из колонок
        /*
            Создаем массив следующей конструкции, пример:

            total[0] = 1235(сумма колонки)
            total[1] = 7895(сумма колонки)
            
            0,1 - индексы колонок
        */        
        var total = [];
        for(var i=0; i < cell_values.length; i++){
            var tot = 0;
            for(var j=0; j < cell_values[i].length; j++){
                tot += cell_values[i][j];
            }
            total.push(tot);
        }
        return total;
    }
    
/*
    Вставляем в таблицу строку в которой будут результаты
    @table - объект таблицы, где будем производить расчеты
    @totals - массив сумм всех колонок
    @settings - настройки
*/
    function pasteTotals(table,totals,settings){
        if(hasSums(totals)){// если существует хоть одна колонка с подсчитанной суммой

            // подсчитываем количество колонок в таблице
            var count_cols = table.find('tbody tr:first').find('td').length;
    
            // Формируем html код табличной строки
            var tr_class = '';
            if(settings.trclass != ''){ // если нужно добавить класс строке
                tr_class = 'class="'+settings.trclass+'"';            
            }
    
            var tr_str = '<tr '+tr_class+'>';
            // формируем html для ячеек
            for(var i=0; i < count_cols; i++){
                var column_total = ''; // строка содержащая число(сумму)
                var index = $.inArray(i,settings.misscols);
                if(index == '-1'){// для этой ячейки нет в "массиве пропуска ячеек" 
                    
                    column_total = totals[i];
                    if(settings.hidenull && column_total == 0){// если тотал = 0 и нули надо прятать
                        column_total = '';// формируем пустую строку
                    }
                    if(settings.hidenegative && column_total < 0){// если тотал < 0 и нули надо прятать
                        column_total = '';// формируем пустую строку
                    }
                }
                if(settings.tdvalues[i] != null){// если нужно добавить дополнительный текст в ячейку
                    var td_value = settings.tdvalues[i];
                }else{
                    var td_value = '';
                }
                tr_str += '<td class="td'+i+'">'+td_value+' '+column_total+'</td>'; // также каждй ячейке добавляется класс td[index]
            }
            tr_str += '</tr>';
            
            var tr = $(tr_str); // создаем объект из html кода 
            tr.appendTo( table.find('tbody') ); // вставлем строку в конец таблицы
            
            return true;
        }
        
        return false;
    }

/*
    Проверяем является ли строка числом
    @string - строка, которую надо проверить
    @returnNum - bool. Нужно ли вернуть число?
    
    пример строк, которые вернут тру
    1. "12 560"
    2. "12560,23"
    3. "12 236.65"

    пример строк, которые вернут фолс
    1. "12,23,23"
    2. "12.12.2008"
    3. "12/45/54"
    
*/
    function isNum(string, returnNum){
        returnNum = returnNum || false;
        
        string = $.trim(string);
        while(string.indexOf(' ') != '-1'){
            string = string.replace(' ','');
        }
        string = string.replace(',','.');
        
        var isNumber = string.length ? !isNaN(string) : false;
        if(returnNum && isNumber){
            return parseFloat(string);
        }else{
            return isNumber;
        }
        
        
        //alert(reserv+" это число - "+!isNaN(test)+'\n' +test+' После преобразования ');
    }

/*
    Проверяем существует хоть одна колонка с подсчитанной суммой больше нуля

*/
    function hasSums(totals){
        for(var i=0; i<totals.length; i++){
            if(totals[i]>0) return true;
        }
        return false
    }

}

