diff --git a/Source/Interface/HtmlTable.Sort.js b/Source/Interface/HtmlTable.Sort.js index 91941fe0..d8bdbcb8 100644 --- a/Source/Interface/HtmlTable.Sort.js +++ b/Source/Interface/HtmlTable.Sort.js @@ -50,7 +50,7 @@ HtmlTable = Class.refactor(HtmlTable, { initialize: function (){ this.previous.apply(this, arguments); if (this.occluded) return this.occluded; - this.sorted = {index: null, dir: 1}; + this.sorted = {index: null, reverse: [], order: [], lastSortOrder: []}; if (!this.bound) this.bound = {}; this.bound.headClick = this.headClick.bind(this); this.sortSpans = new Elements(); @@ -126,22 +126,28 @@ HtmlTable = Class.refactor(HtmlTable, { previousSerialization.sortIndex = this.sorted.index; previousSerialization.sortReverse = this.sorted.reverse; } + previousSerialization.sortOrder = this.sorted.lastSortOrder; return previousSerialization; }, restore: function(tableState){ if(this.options.sortable && tableState.sortIndex){ - this.sort(tableState.sortIndex, tableState.sortReverse); + this.sorted.lastSortOrder = tableState.sortOrder; + this.sorted.reverse = tableState.sortReverse; + this.sorted.index = tableState.sortIndex; + this.reSort(); } this.previous.apply(this, arguments); }, - setSortedState: function(index, reverse){ - if (reverse != null) this.sorted.reverse = reverse; - else if (this.sorted.index == index) this.sorted.reverse = !this.sorted.reverse; - else this.sorted.reverse = this.sorted.index == null; + setSortedState: function(index, reverse, pre){ + if (index != null) { + if (reverse != null) this.sorted.reverse[index] = reverse; + else if (this.sorted.reverse[index] != null) this.sorted.reverse[index] = !this.sorted.reverse[index]; + else this.sorted.reverse[index] = false; - if (index != null) this.sorted.index = index; + if (!pre) this.sorted.index = index; + } }, setHeadSort: function(sorted){ @@ -151,7 +157,7 @@ HtmlTable = Class.refactor(HtmlTable, { if (!head.length) return; if (sorted){ head.addClass(this.options.classHeadSort); - if (this.sorted.reverse) head.addClass(this.options.classHeadSortRev); + if (this.sorted.reverse[this.sorted.index]) head.addClass(this.options.classHeadSortRev); else head.removeClass(this.options.classHeadSortRev); } else { head.removeClass(this.options.classHeadSort).removeClass(this.options.classHeadSortRev); @@ -193,21 +199,25 @@ HtmlTable = Class.refactor(HtmlTable, { return item.value; }, - getParser: function(){ - var parser = this.parsers[this.sorted.index]; + getParser: function(index){ + var parser; + + if (index) parser = this.parsers[index]; + else parser = this.parsers[this.sorted.index]; + return typeOf(parser) == 'string' ? HtmlTable.Parsers[parser] : parser; }, sort: function(index, reverse, pre){ if (!this.head) return; - if (!pre){ - this.clearSort(); - this.setSortedState(index, reverse); - this.setHeadSort(true); - } + this.sorted.order.push(index); + + if (!pre) this.clearSort(); + this.setSortedState(index, reverse, pre); + if (!pre) this.setHeadSort(true); - var parser = this.getParser(); + var parser = this.getParser(index); if (!parser) return; var rel; @@ -216,22 +226,23 @@ HtmlTable = Class.refactor(HtmlTable, { this.body.dispose(); } - var data = this.parseData(parser).sort(function(a, b){ + var data = this.parseData(parser, index).sort(function(a, b){ if (a.value === b.value) return 0; return a.value > b.value ? 1 : -1; }); - if (this.sorted.reverse == (parser == HtmlTable.Parsers['input-checked'])) data.reverse(true); + if (this.sorted.reverse[index] == (parser == HtmlTable.Parsers['input-checked'])) data.reverse(true); + this.setRowSort(data, pre); if (rel) rel.grab(this.body); this.fireEvent('stateChanged'); - return this.fireEvent('sort', [this.body, this.sorted.index]); + return this.fireEvent('sort', [this.body, index]); }, - parseData: function(parser){ + parseData: function(parser, index){ return Array.map(this.body.rows, function(row, i){ - var value = parser.convert.call(document.id(row.cells[this.sorted.index])); + var value = parser.convert.call(document.id(row.cells[index])); return { position: i, value: value @@ -242,10 +253,23 @@ HtmlTable = Class.refactor(HtmlTable, { clearSort: function(){ this.setHeadSort(false); this.body.getElements('td').removeClass(this.options.classCellSort); + + this.sorted.lastSortOrder = this.sorted.order; + this.sorted.order = []; }, reSort: function(){ - if (this.sortEnabled) this.sort.call(this, this.sorted.index, this.sorted.reverse); + + var colIndex; + var reverse = this.sorted.reverse; + var lastSort = this.sorted.lastSortOrder; + + if (this.sortEnabled) { + for (var colIndex=0; colIndex