diff --git a/sorting/ip-address.js b/sorting/ip-address.js index 7ea648a..28ff323 100644 --- a/sorting/ip-address.js +++ b/sorting/ip-address.js @@ -1,11 +1,11 @@ /** - * Sorts a column containing IP addresses in typical dot notation. This can - * be most useful when using DataTables for a networking application, and - * reporting information containing IP address. Also has a matching type - * detection plug-in for automatic type detection. + * Sorts a column containing IP addresses (IPv4 and IPv6) in typical dot + * notation / colon. This can be most useful when using DataTables for a + * networking application, and reporting information containing IP address. * * @name IP addresses * @summary Sort IP addresses numerically + * @author Dominique Fournier * @author Brad Wasson * * @example @@ -18,16 +18,75 @@ jQuery.extend( jQuery.fn.dataTableExt.oSort, { "ip-address-pre": function ( a ) { - var m = a.split("."), x = ""; - - for(var i = 0; i < m.length; i++) { - var item = m[i]; - if(item.length == 1) { - x += "00" + item; - } else if(item.length == 2) { - x += "0" + item; - } else { - x += item; + var i, item; + var m = a.split("."), + n = a.split(":"), + x = "", + xa = ""; + + if (m.length == 4) { + // IPV4 + for(i = 0; i < m.length; i++) { + item = m[i]; + + if(item.length == 1) { + x += "00" + item; + } + else if(item.length == 2) { + x += "0" + item; + } + else { + x += item; + } + } + } + else if (n.length > 0) { + // IPV6 + var count = 0; + for(i = 0; i < n.length; i++) { + item = n[i]; + + if (i > 0) { + xa += ":"; + } + + if(item.length === 0) { + count += 0; + } + else if(item.length == 1) { + xa += "000" + item; + count += 4; + } + else if(item.length == 2) { + xa += "00" + item; + count += 4; + } + else if(item.length == 3) { + xa += "0" + item; + count += 4; + } + else { + xa += item; + count += 4; + } + } + + // Padding the :: + n = xa.split(":"); + var paddDone = 0; + + for (i = 0; i < n.length; i++) { + item = n[i]; + + if (item.length === 0 && paddDone === 0) { + for (var padding = 0 ; padding < (32-count) ; padding++) { + x += "0"; + paddDone = 1; + } + } + else { + x += item; + } } } @@ -41,4 +100,4 @@ jQuery.extend( jQuery.fn.dataTableExt.oSort, { "ip-address-desc": function ( a, b ) { return ((a < b) ? 1 : ((a > b) ? -1 : 0)); } -} ); +}); \ No newline at end of file