/* By Sk 2013.01.30*/
var tableSort = function () {
this.initialize.apply(this, arguments);
}
tableSort.prototype = {
initialize: function (tableId, clickRow, startRow, endRow, classUp, classDown, selectClass) {
this.Table = document.getElementById(tableId);
this.rows = this.Table.rows; //所有行
this.Tags = this.rows[clickRow - 1].cells; //标签td
this.up = classUp;
this.down = classDown;
this.startRow = startRow;
this.selectClass = selectClass;
this.endRow = (endRow == 999 ? this.rows.length : endRow);
this.T2Arr = this._td2Array(); //所有受影响的td的二维数组
this.setShow();
},
//设置标签切换
setShow: function () {
var defaultClass = this.Tags[0].className;
for (var Tag, i = 0; Tag = this.Tags[i]; i++) {
Tag.index = i;
addEventListener(Tag, 'click', Bind(Tag, statu));
}
var _this = this;
var turn = 0;
function statu() {
for (var i = 0; i < _this.Tags.length; i++) {
_this.Tags[i].className = defaultClass;
}
if (turn == 0) {
addClass(this, _this.down)
_this.startArray(0, this.index);
turn = 1;
} else {
addClass(this, _this.up)
_this.startArray(1, this.index);
turn = 0;
}
}
},
//设置选中列样式
colClassSet: function (num, cla) {
//得到关联到的td
for (var i = (this.startRow - 1); i < (this.endRow); i++) {
for (var n = 0; n < this.rows[i].cells.length; n++) {
removeClass(this.rows[i].cells[n], cla);
}
addClass(this.rows[i].cells[num], cla);
}
},
//开始排序 num 根据第几列排序 aord 逆序还是顺序
startArray: function (aord, num) {
var afterSort = this.sortMethod(this.T2Arr, aord, num); //排序后的二维数组传到排序方法中去
this.array2Td(num, afterSort); //输出
},
//将受影响的行和列转换成二维数组
_td2Array: function () {
var arr = [];
for (var i = (this.startRow - 1), l = 0; i < (this.endRow); i++, l++) {
arr[l] = [];
for (var n = 0; n < this.rows[i].cells.length; n++) {
arr[l].push(this.rows[i].cells[n].innerHTML);
}
}
return arr;
},
//根据排序后的二维数组来输出相应的行和列的 innerHTML
array2Td: function (num, arr) {
this.colClassSet(num, this.selectClass);
for (var i = (this.startRow - 1), l = 0; i < (this.endRow); i++, l++) {
for (var n = 0; n < this.Tags.length; n++) {
this.rows[i].cells[n].innerHTML = arr[l][n];
}
}
},
//传进来一个二维数组,根据二维数组的子项中的w项排序,再返回排序后的二维数组
sortMethod: function (arr, aord, w) {
//var effectCol = this.getColByNum(whichCol);
arr.sort(function (a, b) {
x = killHTML(a[w]);
y = killHTML(b[w]);
x = x.replace(/,/g, '');
y = y.replace(/,/g, '');
switch (isNaN(x)) {
case false:
return Number(x) - Number(y);
break;
case true:
return x.localeCompare(y);
break;
}
});
arr = aord == 0 ? arr : arr.reverse();
return arr;
}
}
/*-----------------------------------*/
function addEventListener(o, type, fn) {
if (o.attachEvent) { o.attachEvent('on' + type, fn) }
else if (o.addEventListener) { o.addEventListener(type, fn, false) }
else { o['on' + type] = fn; }
}
function hasClass(element, className) {
var reg = new RegExp('(\\s|^)' + className + '(\\s|$)');
return element.className.match(reg);
}
function addClass(element, className) {
if (!this.hasClass(element, className)) {
element.className += " " + className;
}
}
function removeClass(element, className) {
if (hasClass(element, className)) {
var reg = new RegExp('(\\s|^)' + className + '(\\s|$)');
element.className = element.className.replace(reg, ' ');
}
}
var Bind = function (object, fun) {
return function () {
return fun.apply(object, arguments);
}
}
//去掉所有的html标记
function killHTML(str) {
return str.replace(/<[^>]+>/g, "");
}
var temp = new tableSort('tableid', 1, 2, 999, 'up', 'down', 'hov');
//tableid 表格ID
//1,第一行为列头
//2,第二行开始排序
//999,第999行结束(999为最后)
//up 升序标签样式
//down 降序标签样式
//hov 选中列样式