var sortFunctions = (function() {
var weekday_names = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
/**
* Comparing Strings
* Weekday String is compared in order of the weekday.
*/
var compareString = function(a, b) {
a = a.trim();
b = b.trim();
var a_week_index = weekday_names.indexOf(a);
var b_week_index = weekday_names.indexOf(b);
if (a_week_index >= 0 && b_week_index >= 0) {
a = a_week_index;
b = b_week_index;
}
if (a == b) {
return 0;
} else {
if (a > b) {
return 1;
} else {
return -1;
}
}
}
/**
* 2 つの tr の順序を与えられた order によって比較する
* @a
* @b
* @order_array [[number, order], ...] order は並び順(昇順なら1), number は td の順次(0 から始まる)
* @sort_array
*/
var compareTr = function(a, b, order_array, sort_array) {
var a_tds = $(a).find('td');
var b_tds = $(b).find('td');
for (var i = 0; i < sort_array.length; i++) {
value = compareString(
a_tds.eq(sort_array[i]).text(),
b_tds.eq(sort_array[i]).text());
if (value != 0) {
return value * order_array[sort_array[i]];
}
}
return 0;
}
/**
* Generate Order array
* @index 変更対象のカラムのindex
* @last_index
*/
var composeOrder = function(index, order_array, sort_array) {
// 最後にソート対象になっていた場合は逆順にソートするように設定する。
if (sort_array.length > 0 && index == sort_array[0]) {
order_array[index] *= -1;
} else {
var remove_index = -1;
for (var i = 1; i < sort_array.length; i++) {
if (sort_array[i] == index) {
remove_index = i;
break;
}
}
if (remove_index > 0) {
sort_array.splice(remove_index, 1);
}
sort_array.unshift(index);
}
}
/**
* Sort rows
*/
var sortRows = function(rows, order_array, sort_array) {
rows.sort(function(a, b) {
return compareTr(a, b, order_array, sort_array);
});
return rows;
}
var AscChar = '▼';
var DescChar = '▲';
/**
* テーブル行の並び替え
* @target_table 並び替え対象のテーブル
* @orders 並び替えの順番
* @sort_orders 並び替えの優先順位
*/
var _sort = function(order_array, sort_array, start_object) {
var target_table = $(start_object).parent().parent().parent();
var head = target_table.find('thead>tr>th');
var rows = target_table.find('tbody>tr');
var index = $(head).index(start_object);
if (sort_array.length > 0) {
var text = $(head).eq(sort_array[0]).text();
if (order_array[sort_array[0]] > 0) {
text = text.replace(AscChar, '');
} else {
text = text.replace(DescChar, '');
}
$(head).eq(sort_array[0]).text(text);
}
// ソート順序を決定する。
composeOrder(index, order_array, sort_array);
// 並び替える。
var new_rows = sortRows(rows, order_array, sort_array);
target_table.children('tbody').empty().append(new_rows);
var head_text = "";
if (order_array[sort_array[0]] > 0) {
head_text += AscChar;
} else {
head_text += DescChar;
}
$(head).eq(sort_array[0]).text(
head_text + $(head).eq(sort_array[0]).text());
}
return {sort: _sort};
})();