/*
objSort v 1.1
copyright 2006 Thomas Frank

This program is free software under the terms of the 
GNU General Public License version 2 as published by the Free 
Software Foundation. It is distributed without any warranty.

http://www.thomasfrank.se/sorting_things.html
*/
tfObjSort = {
    init: function() {
        Array.prototype.objSort = function() {
            tfObjSort.setThings(this);
            var a = arguments;
            var x = tfObjSort;
            x.a = []; x.d = [];
            for (var i = 0; i < a.length; i++) {
                if (typeof a[i] == "string") { x.a.push(a[i]); x.d.push(1) };
                if (a[i] === -1) { x.d[x.d.length - 1] = -1 }
            }
            return this.sort(tfObjSort.sorter);
        };
        Array.prototype.strSort = function() {
            tfObjSort.setThings(this);
            return this.sort(tfObjSort.charSorter)
        }
    },
    sorter: function(x, y) {
        var a = tfObjSort.a
        var d = tfObjSort.d
        var r = 0
        for (var i = 0; i < a.length; i++) {
            if (typeof x + typeof y != "objectobject") { return typeof x == "object" ? -1 : 1 };
            var m = x[a[i]]; var n = y[a[i]];
            var t = typeof m + typeof n;
            if (t == "booleanboolean") { m *= -1; n *= -1 }
            else if (t.split("string").join("").split("number").join("") != "") { continue };
            r = m - n;
            if (isNaN(r)) { r = tfObjSort.charSorter(m, n) };
            if (r != 0) { return r * d[i] }
        }
        return r
    },
    charSorter: function(x, y) {
        if (tfObjSort.ignoreCase) { x = x.toLowerCase(); y = y.toLowerCase() };
        var s = tfObjSort.chars;
        if (!s) { return x > y ? 1 : x < y ? -1 : 0 };
        x = x.split(""); y = y.split(""); l = x.length > y.length ? y.length : x.length;
        var p = 0;
        for (var i = 0; i < l; i++) {
            p = s.indexOf(x[i]) - s.indexOf(y[i]);
            if (p != 0) { break };
        };
        if (p == 0) { p = x.length - y.length };
        return p
    },
    setThings: function(x) {
        this.ignoreCase = x.sortIgnoreCase;
        var s = x.sortCharOrder;
        if (!s) { this.chars = false; return true };
        if (!s.sort) { s = s.split(",") };
        var a = "";
        for (var i = 1; i < 1024; i++) { a += String.fromCharCode(i) };
        for (var i = 0; i < s.length; i++) {
            z = s[i].split("");
            var m = z[0]; var n = z[1]; var o = "";
            if (z[2] == "_") { o = n + m } else { o = m + n };
            a = a.split(m).join("").split(n).join(o);
        };
        this.chars = a
    }
};
tfObjSort.init();
