1 // Copyright (c) 2005 spinelz.org (http://script.spinelz.org/)
\r
3 // Permission is hereby granted, free of charge, to any person obtaining
\r
4 // a copy of this software and associated documentation files (the
\r
5 // "Software"), to deal in the Software without restriction, including
\r
6 // without limitation the rights to use, copy, modify, merge, publish,
\r
7 // distribute, sublicense, and/or sell copies of the Software, and to
\r
8 // permit persons to whom the Software is furnished to do so, subject to
\r
9 // the following conditions:
\r
11 // The above copyright notice and this permission notice shall be
\r
12 // included in all copies or substantial portions of the Software.
\r
14 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
\r
15 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
\r
16 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
\r
17 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
\r
18 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
\r
19 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
\r
20 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\r
23 SortableTableGridEx = Class.create();
\r
24 Object.extend(Object.extend(SortableTableGridEx.prototype, SortableTable.prototype), {
\r
26 initialize: function(element) {
\r
27 this.element = $(element);
\r
28 Element.setStyle(this.element, {visibility: 'hidden'});
\r
30 var options = Object.extend({
\r
35 }, arguments[1] || {});
\r
36 this.options = options;
\r
38 this.handle = options.handle ? $(options.handle) : this.element.rows[0];
\r
39 this.ascImg = options.ascImg ? options.ascImg : 'images/spinelz/sortableTable_down.gif';
\r
40 this.descImg = options.descImg ? options.descImg : 'images/spinelz/sortableTable_up.gif';
\r
41 this.sortType = options.sortType;
\r
43 this.currentOrder = 'default';
\r
44 this.defaultOrder = new Array();
\r
45 for (var i = 0; i < this.element.rows.length; i++) {
\r
46 this.defaultOrder[i] = this.element.rows[i];
\r
49 Element.setStyle(this.element, {visibility: 'visible'});
\r
52 addEvents: function() {
\r
53 var rows = this.handle.rows[0];
\r
56 for (var i = 0; i < rows.cells.length; i++) {
\r
57 Element.cleanWhitespace(rows.cells[i]);
\r
58 Element.cleanWhitespace(rows.cells[i].firstChild);
\r
59 this.addEvent(rows.cells[i].firstChild.firstChild);
\r
63 addEvent: function(handle) {
\r
65 handle.style.cursor = 'pointer';
\r
66 Event.observe(handle, 'click', this.sortTable.bindAsEventListener(this));
\r
70 sortTable: function(event) {
\r
71 var target = Event.element(event);
\r
72 if (target.tagName.toUpperCase() == 'IMG') {
\r
73 target = target.parentNode;
\r
76 if (cell.tagName.toUpperCase() != 'TD' && cell.tagName.toUpperCase() != 'TH') {
\r
77 cell = Element.getParentByTagName(['TD','TH'], cell);
\r
79 var tmpColumn = cell.cellIndex;
\r
80 if (this.targetColumn != tmpColumn) {
\r
81 this.currentOrder = 'default';
\r
83 this.targetColumn = tmpColumn;
\r
85 var newRows = new Array();
\r
86 for (var i = 0; i < this.element.rows.length; i++) {
\r
87 newRows[i] = this.element.rows[i];
\r
89 if (newRows.length < 1) return;
\r
91 if (this.currentOrder == 'default') {
\r
92 newRows.sort(this.getSortFunc());
\r
93 this.currentOrder = 'asc';
\r
95 } else if (this.currentOrder == 'asc') {
\r
96 newRows = newRows.reverse();
\r
97 this.currentOrder = 'desc';
\r
98 } else if (this.currentOrder == 'desc') {
\r
99 newRows = this.defaultOrder;
\r
100 this.currentOrder = 'default';
\r
103 for (var i = 0; i < newRows.length; i++) {
\r
104 this.element.tBodies[0].appendChild(newRows[i]);
\r
108 if (this.options.callBack) this.options.callBack(this.element);
\r
111 mark: function(cell) {
\r
112 var row = this.options.handle ? this.options.handle.rows[0] : this.element.rows[0];
\r
114 var imgs = row.getElementsByTagName('IMG');
\r
116 for (var i = 0; i < imgs.length; i++){
\r
117 var parent = imgs[i].parentNode;
\r
118 parent.removeChild(imgs[i]);
\r
121 if (this.currentOrder == 'asc') imgFile = this.ascImg;
\r
122 else if (this.currentOrder == 'desc') imgFile = this.descImg;
\r
125 cell.appendChild(Builder.node('IMG', {src: imgFile, alt: 'sortImg'}));
\r