--- /dev/null
+var webdeveloper_currentTableSortColumn = 0;
+var webdeveloper_previousTableSortColumn = 0;
+var webdeveloper_sortAscending = false;
+
+// Makes all tables on the page with a sortable class sortable
+function webdeveloper_makeTablesSortable()
+{
+ var tableHeaderLength = null;
+ var tableHeaderList = null;
+ var tableList = webdeveloper_evaluateXPath(document, "//table[@class='sortable']");
+ var tableLength = tableList.length;
+
+ // Loop through the tables
+ for(var i = 0; i < tableLength; i++)
+ {
+ tableHeaderList = tableList[i].getElementsByTagName("th");
+ tableHeaderLength = tableHeaderList.length;
+
+ // Loop through the table headers
+ for(var j = 0; j < tableHeaderLength; j++)
+ {
+ tableHeaderList[j].addEventListener("click", webdeveloper_sortTable, false);
+ }
+ }
+}
+
+// Sorts a table
+function webdeveloper_sortTable(event)
+{
+ // If the event is set
+ if(event)
+ {
+ var newTableRowList = new Array();
+ var tableHeader = event.target;
+ var node = tableHeader;
+ var styleSheet = document.getElementById("webdeveloper-generated-content-stylesheet");
+ var tableHeaderRow = tableHeader.parentNode;
+ var table = tableHeaderRow.parentNode;
+ var tableRow = null;
+ var tableRowList = table.childNodes;
+ var tableRowLength = tableRowList.length;
+
+ webdeveloper_currentTableSortColumn = 0;
+
+ // Loop through the previous siblings
+ while((node = node.previousSibling) != null)
+ {
+ webdeveloper_currentTableSortColumn++;
+ }
+
+ // If the current sort column is the same as the previous sort column
+ if(webdeveloper_currentTableSortColumn == webdeveloper_previousTableSortColumn)
+ {
+ webdeveloper_sortAscending = !webdeveloper_sortAscending;
+ }
+ else
+ {
+ var previousTableHeader = tableHeaderRow.cells[webdeveloper_previousTableSortColumn];
+
+ webdeveloper_previousTableSortColumn = webdeveloper_currentTableSortColumn;
+ webdeveloper_sortAscending = true;
+
+ // If the previous table header has a class attribute
+ if(previousTableHeader.hasAttribute("class"))
+ {
+ previousTableHeader.removeAttribute("class");
+ }
+ }
+
+ // If sorting in ascending order
+ if(webdeveloper_sortAscending)
+ {
+ tableHeader.setAttribute("class", "sort-ascending");
+ }
+ else
+ {
+ tableHeader.setAttribute("class", "sort-descending");
+ }
+
+ // Loop through the table rows excluding the header row
+ for(var i = 1; i < tableRowLength; i++)
+ {
+ newTableRowList[i - 1] = tableRowList[i];
+ }
+
+ newTableRowList.sort(webdeveloper_sortTableRows);
+ webdeveloper_removeAllChildElements(table);
+ table.appendChild(tableHeaderRow);
+
+ // Loop through the sorted table rows
+ for(i = 0; i < newTableRowList.length; i++)
+ {
+ tableRow = newTableRowList[i];
+
+ // If this is an even row
+ if(i % 2 == 0)
+ {
+ // If this row has a class attribute
+ if(tableRow.hasAttribute("class"))
+ {
+ tableRow.removeAttribute("class");
+ }
+ }
+ else
+ {
+ tableRow.setAttribute("class", "shaded");
+ }
+
+ table.appendChild(tableRow);
+ }
+
+ // Disable and enable the style sheet to force the styles to reapply
+ if(styleSheet)
+ {
+ styleSheet.disabled = true;
+ styleSheet.disabled = false;
+ }
+ }
+}
+
+// Sorts two table rows
+function webdeveloper_sortTableRows(rowOne, rowTwo)
+{
+ var sortValue = 1;
+
+ // If row one and row two are set
+ if(rowOne && rowTwo)
+ {
+ var columnOne = webdeveloper_getElementText(rowOne.cells[webdeveloper_currentTableSortColumn]);
+ var columnTwo = webdeveloper_getElementText(rowTwo.cells[webdeveloper_currentTableSortColumn]);
+
+ // If the columns are equal
+ if(columnOne == columnTwo)
+ {
+ return 0;
+ }
+ else if(columnOne < columnTwo)
+ {
+ sortValue = -1;
+ }
+ }
+
+ // If sorting in descending order
+ if(!webdeveloper_sortAscending)
+ {
+ sortValue *= -1;
+ }
+
+ return sortValue;
+}
+
+webdeveloper_makeTablesSortable();
\ No newline at end of file