var st_table = new Array();
var st_col_attr = new Array();
var st_sorting = false;
var st_targetID = "";
var st_filterColAry = new Array();
var st_filterTermAry = new Array();
var st_exactFilterColAry = new Array();
var st_exactFilterTermAry = new Array();
var st_curRow = 0;
var st_rearSortCol = -1;

function st_setColAttr(st_targetID) {
	// initialize attribute of columns
	// index is 1 oriented. Column 0 is reserved for default order.
	if(st_targetID == "sort_table_ja"){
		st_col_attr[5] = new Array();
		st_col_attr[5]["align"] = "right";
		st_col_attr[6] = new Array();
		st_col_attr[6]["align"] = "right";
		st_col_attr[7] = new Array();
		st_col_attr[7]["align"] = "right";
		st_col_attr[8] = new Array();
		st_col_attr[8]["align"] = "right";
		st_col_attr[9] = new Array();
		st_col_attr[9]["align"] = "right";
		st_col_attr[12] = new Array();
		st_col_attr[12]["align"] = "right";	
	}else if(st_targetID == "sort_table_en"){
		st_col_attr[3] = new Array();
		st_col_attr[3]["align"] = "right";
		st_col_attr[4] = new Array();
		st_col_attr[4]["align"] = "right";
		st_col_attr[5] = new Array();
		st_col_attr[5]["align"] = "right";
		st_col_attr[6] = new Array();
		st_col_attr[6]["align"] = "right";
		st_col_attr[7] = new Array();
		st_col_attr[7]["align"] = "right";
		st_col_attr[10] = new Array();
		st_col_attr[10]["align"] = "right";
	}else if(st_targetID == "sort_table_for_developer"){
		st_col_attr[5] = new Array();
		st_col_attr[5]["align"] = "right";
		st_col_attr[6] = new Array();
		st_col_attr[6]["align"] = "right";
		st_col_attr[7] = new Array();
		st_col_attr[7]["align"] = "right";
		st_col_attr[8] = new Array();
		st_col_attr[8]["align"] = "right";
		st_col_attr[12] = new Array();
		st_col_attr[12]["align"] = "right";		
	}else{
		alert("sort_table: unknown st_targetID=" + st_targetID);
	} 
}

function st_load (targetID) {
	st_targetID = targetID;
	st_setColAttr(st_targetID);
	var table = document.getElementById(st_targetID);
	for (var r = 1; r < table.rows.length; r++) {
		var row = table.rows[r];
		var tmpAry = new Array();
		tmpAry.push(r);
		for (var c = 0; c < row.cells.length; c++) {
			tmpAry.push(row.cells[c].innerHTML);
		}
		st_table.push(tmpAry);
	}
	
	st_set_init_filter();
}

function st_update () {
	st_sorting = true;
	var table = document.getElementById(st_targetID);
	while (table.rows.length > 1) {
		table.deleteRow(1);
	}
	st_curRow = 0;
	st_update_rows();
}

function st_update_rows () {
	document.body.style.cursor = "wait";
	var table = document.getElementById(st_targetID);
	for (var i = 0; i < 50; i++) {
		if (st_curRow >= st_table.length) {
			break;
		}
		// filter
		var fShow = true;
		for (var j = 0; j < st_filterColAry.length; j++) {
			if (st_table[st_curRow][st_filterColAry[j]].replace(/<.+?>/g, "").indexOf(st_filterTermAry[j]) == -1) {
				fShow = false;
				break;
			}
		}
		for (var j = 0; j < st_exactFilterColAry.length; j++) {
			if (st_table[st_curRow][st_exactFilterColAry[j]].replace(/<.+?>/g, "").indexOf(st_exactFilterTermAry[j]) == -1) {
				fShow = false;
				break;
			}
		}
		if (!fShow) {
			st_curRow++;
			continue;
		}
		var row = table.insertRow(table.rows.length);
		for (var c = 1; c < st_table[st_curRow].length; c++) {
			var cell = row.insertCell(c - 1);
			if (st_col_attr[c]) {
				for (var attr in st_col_attr[c]) {
					if (Object.prototype.toString.call(st_col_attr[c][attr]) == "[object String]") {
						cell.setAttribute(attr, st_col_attr[c][attr]);
					}
				}
			}
			if (c == st_rearSortCol) {
				cell.setAttribute("align", "right");
			}
			cell.innerHTML = st_table[st_curRow][c];
		}
		st_curRow++;
	}
	if (st_curRow < st_table.length) {
		setTimeout("st_update_rows()", 0);
	} else {
		document.body.style.cursor = "default";
		st_sorting = false;
	}
}

function st_sort (col, order) {
	st_rearSortCol = -1;
	
	if (st_sorting) {
		return;
	}

	if (col > st_table[0].length) {
		col = 0;
	} else if (col < 0) {
		col = 0;
	}
		
	if (order != "desc") {
		order = "asc";
	}
	if (order == "asc") {
		st_table.sort(function(a, b) {
			if (a[col].replace(/<.+?>/g, "") > b[col].replace(/<.+?>/g, "")) {
				return 1;
			} else {
				return -1;
			}
		});
	} else {
		st_table.sort(function(a, b) {
			if (a[col].replace(/<.+?>/g, "") < b[col].replace(/<.+?>/g, "")) {
				return 1;
			} else {
				return -1;
			}
		});
	}
	st_update();
}

/**
   numerical sort function by Mitsuhashi on 2008/11/10
**/
function st_sort_numerically (col, order) {
	st_rearSortCol = -1;
	if (st_sorting) {
		return;
	}
	if (col > st_table[0].length) {
		col = 0;
	} else if (col < 0) {
		col = 0;
	}
		
	if (order != "desc") {
		order = "asc";
	}
	if (order == "asc") {
		st_table.sort(function(a, b) { return a[col] - b[col]; });
	} else {
		st_table.sort(function(a, b) { return b[col] - a[col]; });
	}
	st_update();
}

function st_sort_rear (col, order) {
	st_rearSortCol = col;
	if (col > st_table[0].length) {
		col = 0;
	} else if (col < 0) {
		col = 0;
	}
	if (order != "desc") {
		order = "asc";
	}
	if (order == "asc") {
		st_table.sort(function(a, b) {
			if (a[col].split("").reverse().join("") > b[col].split("").reverse().join("")) {
				return 1;
			} else {
				return -1;
			}
		});
	} else {
		st_table.sort(function(a, b) {
			if (a[col].split("").reverse().join("") < b[col].split("").reverse().join("")) {
				return 1;
			} else {
				return -1;
			}
		});
	}
	st_update();
}

function st_setfilter (col, query) {
	if (col > st_table[0].length) {
		return;
	} else if (col < 0) {
		return;
	}
	var fOverwrite = false;
	for (var i = 0; i < st_filterColAry.length; i++) {
		if (st_filterColAry[i] == col) {
			fOverwrite = true;
			if (query == "") {
				st_filterColAry.splice(i, 1);
				st_filterTermAry.splice(i, 1);
			} else {
				st_filterTermAry[i] = query;
			}
		}
	}
	if (!fOverwrite && query != "") {
		st_filterColAry.push(col);
		st_filterTermAry.push(query);
	}
	st_update();
}

function st_setExactFilter (col, query) {
	if (col > st_table[0].length) {
		return;
	} else if (col < 0) {
		return;
	}
	var fOverwrite = false;
	for (var i = 0; i < st_exactFilterColAry.length; i++) {
		if (st_exactFilterColAry[i] == col) {
			fOverwrite = true;
			if (query == "") {
				st_exactFilterColAry.splice(i, 1);
				st_exactFilterTermAry.splice(i, 1);
			} else {
				st_exactFilterTermAry[i] = query;
			}
		}
	}
	if (!fOverwrite && query != "") {
		st_exactFilterColAry.push(col);
		st_exactFilterTermAry.push(query);
	}
	st_update();
}
