This is a more advanced table sorting app.
Here is the basic interface:
Here is the app with a 4X4 table created:
with data added:
and sorted by Last Name, First Name and Age:
The first row is a header and is not sorted
The app consists of a html and two js files.
Here is the html:
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head profile=”http://gmpg.org/xfn/11″>
<title>Sort</title>
<style>
body {margin-left:0;margin-right:0;font:normal normal normal 15px Arial;}
a{ text-decoration: }:link { color: rgb(0, 0, 255) }:visited {color :rgb(100, 0,100) }:hover { }:active { }
table{position: relative; left: 100px; empty-cells: show; border-collapse: collapse}
td{position: relative; height: 20px; padding: 2px 10px;}
</style>
</head>
<body onload = ‘ini();’>
<table id= “tb1″ contenteditable=”true”>
<tr><td id=”norows” onclick=’document.getElementById(“norows”).innerHTML = “”;’ >Number Rows</td><td id=”nocols” onclick=’document.getElementById(“nocols”).innerHTML = “”;’>Number Columns</td><td><input type=”button” id=”set” name=”set” value=”Create Table” onclick=’setGrid();’ /></td><td><select id=”s1″ name=”s1″ onchange=’spop();’ ><option>Sort1</option><option></option></select></td><td><select id=”s2″ name=”s2″ ><option>Sort2</option><option></option></select></td><td><select id=”s3″ name=”s3″ ><option>Sort3</option><option></option></select></td><td><select id=”s4″ name=”s4″ onchange = ‘ld();’><option>Load</option></select></td><td><input type=”checkbox” id=”ch1″ name=”ch1″ value=” ” />Descend</td><td><input type=”button” id=”b1″ name=”b1″ value=”Sort” onclick=’srtd();’ /></td><td><input type=”button” id=”b3″ name=”b3″ value=”Add Rows” onclick=’addRows();’ /><td><input type=”button” id=”b4″ name=”b4″ value=”Save Data” onclick=’savData();’ /></td><td><input type=”button” id=”b2″ name=”b2″ value=”Save” onclick=’sve();’ /></td></tr>
</table>
<table id= “tb2″ contenteditable=”true”></table>
<textarea id = “d1” style = “position: absolute; top:0; left: 0; width: 100%; height: 100%; visibility: hidden” ondblclick=’document.getElementById(“d1”).style.visibility = “hidden”;document.getElementById(“b5”).style.visibility = “hidden”;’></textarea> ;
<input type=”button” id=”b5″ style = “position: absolute; top:0; left: 0; visibility: hidden” name=”b5″ value=”Close” onclick=’document.getElementById(“d1”).style.visibility = “hidden”;document.getElementById(“b5”).style.visibility = “hidden”;’ />
http://tableSort.js
http://tableSort2.js
<script type=”text/javascript”>
function setGrid() {
rs = document.getElementById(“norows”).innerHTML;
cs = document.getElementById(“nocols”).innerHTML;
for (var j = 1; j <= rs; j ++) {
stri += ‘<tr>’;
for (var i =1; i <= cs; i ++) {
stri += ‘<td id=”td’ + j + i + ‘” style=”border:1px solid black”> </td>’;
}
stri += ‘</tr>’;
}
document.getElementById(“tb2”).innerHTML = stri;
}
</script>
</body></html>
The only script in the html file is setGrid(), which creates the table:
rs = document.getElementById(“norows”).innerHTML;
cs = document.getElementById(“nocols”).innerHTML;
for (var j = 1; j <= rs; j ++) {
stri += ‘<tr>’;
for (var i =1; i <= cs; i ++) {
stri += ‘<td id=”td’ + j + i + ‘” style=”border:1px solid black”> </td>’;
}
stri += ‘</tr>’;
}
document.getElementById(“tb2”).innerHTML = stri;
}
Two loops set up the 2D table.
Most of the script is in the file tableSort.js:
function ini() {
document.getElementById(“s4”).innerHTML += ‘<option>sort1</option><option>sort2</option>’;
}
function savData() {
var nm = prompt(“Data Name”, “”) ;
document.getElementById(“d1″).innerHTML = ‘\n\nvar ‘ + nm + ‘ = \” + document.getElementById(“tb2”).innerHTML + ‘\’; \n’;
document.getElementById(“d1”).innerHTML += ‘if (document.getElementById(“s4”).value == “‘ + nm + ‘”) {document.getElementById(“tb2”).innerHTML = ‘ + nm + ‘; rs = ‘ + rs + ‘; cs = ‘ + cs + ‘;}’;
document.getElementById(“d1”).style.visibility = “visible”;
document.getElementById(“b5”).style.visibility = “visible”;
}
function addRows() {
stri = “”;
no = prompt(“How Many Rows”, “1”);
for (var j = 1; j <= no; j ++) {
stri += ‘<tr>’;
for (var i =1; i <= cs; i ++) {
stri += ‘<<d id="td' + (parseInt(rs) + j) + i + '" style="border:1px solid black"> </td>';
}
stri += '</tr>';
}
document.getElementById("tb2").innerHTML += stri;
rs = (parseInt(rs) + parseInt(no)).toString();
}
function spop() {
if (document.getElementById("s1").innerHTML == "Sort1″) {
for (var i = 1; i <= cs; i ++) {
document.getElementById("s1").innerHTML += '’ + document.getElementById(“td1″ + i).innerHTML + ‘ ‘ + i + ”;
document.getElementById(“s2″).innerHTML += ” + document.getElementById(“td1″ + i).innerHTML + ‘ ‘ + i + ”;
document.getElementById(“s3″).innerHTML += ” + document.getElementById(“td1″ + i).innerHTML + ‘ ‘ + i + ”;
}
}
}
function srtd() {
usd = “0,”
cnt = 2;
a = document.getElementById(“s1″).value.lastIndexOf(” “);
v[1] = document.getElementById(“s1”).value.substr(a + 1);
usd += v[1] + “,”;
a = document.getElementById(“s2″).value.lastIndexOf(” “);
v[2] = document.getElementById(“s2”).value.substr(a + 1);
usd += v[2] + “,”;
a = document.getElementById(“s3″).value.lastIndexOf(” “);
v[3] = document.getElementById(“s3”).value.substr(a + 1);
usd += v[3] + “,”;
for (var j = 1; j <= 2; j ++) {
for (var i = 1; i <= cs; i ++) {
if (v[1] != i.toString() && v[2] != i.toString() && v[3] != i.toString() && usd.indexOf(i.toString()) == -1) {
cnt ++;
if (cnt <= 5) {
usd += i.toString() + “,”;
}
}
}
v = usd.split(“,”);
}
if (! document.getElementById(“ch1”).checked) srt();
if (document.getElementById(“ch1”).checked) srt2();
}
function srt() {
for (var j = 2; j <= rs – 1; j ++) {
for (var i= j + 1; i <= rs; i ++) {
if (document.getElementById(“td” + i +v[1]).innerHTML < document.getElementById(“td” + j + v[1]).innerHTML) {
for (var k = 1; k <= cs; k ++) {
tmp = document.getElementById(“td” + j + v[k]).innerHTML;
document.getElementById(“td” + j + v[k]).innerHTML = document.getElementById(“td” + i + v[k]).innerHTML;
document.getElementById(“td” + i + v[k]).innerHTML = tmp;
}
}
}
}
for (var j = 2; j <= rs – 1; j ++) {
for (var i= j + 1; i <= rs; i ++) {
if (document.getElementById(“td” + i + v[1]).innerHTML == document.getElementById(“td” + j + v[1]).innerHTML && document.getElementById(“td” + i + v[2]).innerHTML < document.getElementById(“td” + j + v[2]).innerHTML) {
for (var k = 1; k <= cs; k ++) {
tmp = document.getElementById(“td” + j + v[k]).innerHTML;
document.getElementById(“td” + j + v[k]).innerHTML = document.getElementById(“td” + i + v[k]).innerHTML;
document.getElementById(“td” + i + v[k]).innerHTML = tmp;
}
}
}
}
for (var j = 2; j <= rs – 1; j ++) {
for (var i= j + 1; i <= rs; i ++) {
if (document.getElementById(“td” + i + v[1]).innerHTML == document.getElementById(“td” + j + v[1]).innerHTML && document.getElementById(“td” + i + v[2]).innerHTML == document.getElementById(“td” + j + v[2]).innerHTML && document.getElementById(“td” + i + v[3]).innerHTML < document.getElementById(“td” + j + v[3]).innerHTML) {
for (var k = 1; k <= cs; k ++) {
tmp = document.getElementById(“td” + j + v[k]).innerHTML;
document.getElementById(“td” + j + v[k]).innerHTML = document.getElementById(“td” + i + v[k]).innerHTML;
document.getElementById(“td” + i + v[k]).innerHTML = tmp;
}
}
}
}
}
function srt2() {
for (var j = 2; j <= rs – 1; j ++) {
for (var i= j + 1; i <= rs; i ++) {
if (document.getElementById(“td” + i + v[1]).innerHTML > document.getElementById(“td” + j + v[1]).innerHTML) {
for (var k = 1; k <= cs; k ++) {
tmp = document.getElementById(“td” + j + v[k]).innerHTML;
document.getElementById(“td” + j + v[k]).innerHTML = document.getElementById(“td” + i + v[k]).innerHTML;
document.getElementById(“td” + i + v[k]).innerHTML = tmp;
}
}
}
}
for (var j = 2; j <= rs – 1; j ++) {
for (var i= j + 1; i <= rs; i ++) {
if (document.getElementById(“td” + i + v[1]).innerHTML == document.getElementById(“td” + j + v[1]).innerHTML && document.getElementById(“td” + i + v[2]).innerHTML > document.getElementById(“td” + j + v[2]).innerHTML) {
for (var k = 1; k <= cs; k ++) {
tmp = document.getElementById("td" + j + v[k]).innerHTML;
document.getElementById("td" + j + v[k]).innerHTML = document.getElementById("td" + i + v[k]).innerHTML;
document.getElementById("td" + i + v[k]).innerHTML = tmp;
}
}
}
}
for (var j = 2; j <= rs – 1; j ++) {
for (var i= j + 1; i document.getElementById(“td” + j + v[3]).innerHTML) {
for (var k = 1; k <= cs; k ++) {
tmp = document.getElementById(“td” + j + v[k]).innerHTML;
document.getElementById(“td” + j + v[k]).innerHTML = document.getElementById(“td” + i + v[k]).innerHTML;
document.getElementById(“td” + i + v[k]).innerHTML = tmp;
}
}
}
}
}
function sve() {
var sav = ‘<html><head><title>Sort</title><style>body {margin-left:0;margin-right:0;font:normal normal normal 15px Arial;}a{ text-decoration: }:link { color: rgb(0, 0, 255) }:visited {color :rgb(100, 0,100) }:hover { }:active { }table{position: relative; left: 100px; empty-cells: show; border-collapse: collapse}td{position: relative; height: 20px; padding: 2px 10px;}</style></head><body><table id= “tb2”>’ +document.getElementById(“tb2″).innerHTML + ‘</table><script>window,print();<\/script><&/body>”</html>’;
var textToSaveAsBlob = new Blob([sav], {type:”text/plain”});
var textToSaveAsURL = window.URL.createObjectURL(textToSaveAsBlob);
fileNameToSaveAs = prompt(“FileName to save as”,oldURL);
oldURL = fileNameToSaveAs;
var downloadLink = document.createElement(“a”);
downloadLink.download = fileNameToSaveAs;
downloadLink.innerHTML = “Download File”;
downloadLink.href = textToSaveAsURL;
downloadLink.onclick = destroyClickedElement;
downloadLink.style.display = “none”;
document.body.appendChild(downloadLink);
downloadLink.click();
}
function destroyClickedElement(event) {
document.body.removeChild(event.target);
}
The sorting options are set by spop():
function spop() {
if (document.getElementById(“s1”).innerHTML == “Sort1”) {
for (var i = 1; i <= cs; i ++) {
document.getElementById("s1").innerHTML += '’ + document.getElementById(“td1″ + i).innerHTML + ‘ ‘ + i + ”;
document.getElementById(“s2″).innerHTML += ” + document.getElementById(“td1″ + i).innerHTML + ‘ ‘ + i + ”;
document.getElementById(“s3″).innerHTML += ” + document.getElementById(“td1″ + i).innerHTML + ‘ ‘ + i + ”;
}
}
}
Clicking Sort calls up srtd() which creates an array v to be used in the sorting:
function srtd() {
usd = “0,”
cnt = 2;
a = document.getElementById(“s1″).value.lastIndexOf(” “);
v[1] = document.getElementById(“s1”).value.substr(a + 1);
usd += v[1] + “,”;
a = document.getElementById(“s2″).value.lastIndexOf(” “);
v[2] = document.getElementById(“s2”).value.substr(a + 1);
usd += v[2] + “,”;
a = document.getElementById(“s3″).value.lastIndexOf(” “);
v[3] = document.getElementById(“s3”).value.substr(a + 1);
usd += v[3] + “,”;
for (var j = 1; j <= 2; j ++) {
for (var i = 1; i <= cs; i ++) {
if (v[1] != i.toString() && v[2] != i.toString() && v[3] != i.toString() && usd.indexOf(i.toString()) == -1) {
cnt ++;
if (cnt <= 5) {
usd += i.toString() + “,”;
}
}
}
v = usd.split(“,”);
}
if (! document.getElementById(“ch1”).checked) srt();
if (document.getElementById(“ch1”).checked) srt2();
}
srt sorts ascendingly while sort3 descends.
function srt() {
for (var j = 2; j <= rs – 1; j ++) {
for (var i= j + 1; i <= rs; i ++) {
if (document.getElementById(“td” + i +v[1]).innerHTML < document.getElementById("td" + j + v[1]).innerHTML) {
for (var k = 1; k <= cs; k ++) {
tmp = document.getElementById("td" + j + v[k]).innerHTML;
document.getElementById("td" + j + v[k]).innerHTML = document.getElementById("td" + i + v[k]).innerHTML;
document.getElementById("td" + i + v[k]).innerHTML = tmp;
}
}
}
}
After the first sort a condition is set for the second sort:
if (document.getElementById("td" + i + v[1]).innerHTML == document.getElementById("td" + j + v[1]).innerHTML && document.getElementById("td" + i + v[2]).innerHTML < document.getElementById("td" + j + v[2]).innerHTML) {
Similarly a conditio n for the third sort is set.