git-svn-id: svn://euphorik.ch/pompage@45 02bbb61a-6d21-0410-aba0-cb053bdfd66a
[pompage.git] / doc / webdeveloper / generated / table_sort.js
diff --git a/doc/webdeveloper/generated/table_sort.js b/doc/webdeveloper/generated/table_sort.js
new file mode 100644 (file)
index 0000000..2ccfe2e
--- /dev/null
@@ -0,0 +1,152 @@
+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