var SortList = new Class({
    Implements: Options,

    options: {
        elements: false,
        sortLinks: false,
        sortTag: false,
        sortDirection: false
    },

    sortFunctions: {
        numeric: function (a, b) {
            return this.simple(a.toInt(), b.toInt());
        },
        simple: function (a, b) {
            if (a == b) return 0;
            if ((b == null) || (a > b)) return 1;
            if ((a == null) || (a < b)) return -1;
            return 0;
        }
    },

    /*
     * All elements should be contained by the same parent. Behavior is unspecified otherwise.
     */
    initialize: function(options) {
        this.setOptions(options);
        this.sort();
        var sortlist = this;
        $$(this.options.sortLinks).addEvent('click', function (event) {
            event.stop();
            sortlist.sort($(this).get('sorttag'), 'toggle');
        });
    },

    setSortDirection: function(sortdirection) {
        this.sort(null, sortdirection);
    },
    getSortDirection: function() {
        return ((this.options.sortDirection == -1) ? 'up' : 'down');
    },

    reverse: function() {
        this.sort(null, -this.options.sortDirecion);
    },

    // Wanneer je null invult voor een waarde wordt de vorige waarde opnieuw gebruikt
    sort: function(tagname, sortdirection) {
        tagname = tagname || this.options.sortTag;
        sortdirection = sortdirection || this.options.sortDirection;

        switch (sortdirection) {
            case 'up':
                sortdirection = -1;
                break;
            case 'down':
                sortdirection = 1;
                break;
            case 'toggle':
                if (tagname == this.options.sortTag) {
                    sortdirection = -(this.options.sortDirection)
                } else {
                    sortdirection = this.options.sortDirection;
                }
                break;
        }

        var allNumeric = true;
        (this.options.elements).each(function(el) {
            var value = el.get(tagname);
            //alert(value);
            if (value && !value.test("^[0-9]*$")) {
                allNumeric = false;
            }
        });

        if (allNumeric) {
            (this.options.elements).sort(function(a, b) {
                return this.sortFunctions.numeric(a.get(tagname), b.get(tagname)) * sortdirection;
            }.bind(this));
        } else {
            (this.options.elements).sort(function(a, b) {
                return this.sortFunctions.simple(a.get(tagname), b.get(tagname)) * sortdirection;
            }.bind(this));
        }

        (this.options.elements).each(function(el) {
            el.inject(el.getParent(), 'top');
        });

        $$(this.options.sortLinks)
            .removeClass('active')
            .removeClass('active-up')
            .removeClass('active-down');
        var currentLink = $$(this.options.sortLinks).filter('[sorttag='+tagname+']');
        if (currentLink) {
            currentLink.addClass('active').addClass((sortdirection == -1) ? 'active-up' : 'active-down');
        }

        this.options.sortTag = tagname;
        this.options.sortDirection = sortdirection;
    }
})
