2012-03-07 17:29:20 +01:00

156 lines
3.5 KiB
JavaScript

(function ($, h5ai) {
var type = function (entry) {
var $entry = $(entry);
if ($entry.hasClass('folder-parent')) {
return 0;
} else if ($entry.hasClass('folder')) {
return 1;
}
return 2;
},
cmp = function (entry1, entry2, rev, getVal) {
var res, val1, val2;
res = type(entry1) - type(entry2);
if (res !== 0) {
return res;
}
val1 = getVal(entry1);
val2 = getVal(entry2);
if (val1 < val2) {
return rev ? 1 : -1;
} else if (val1 > val2) {
return rev ? -1 : 1;
}
return 0;
},
cmpName = function (entry1, entry2) {
return cmp(entry1, entry2, false, function (entry) {
return $(entry).find('.label').text().toLowerCase();
});
},
cmpTime = function (entry1, entry2) {
return cmp(entry1, entry2, false, function (entry) {
return $(entry).find('.date').data('time');
});
},
cmpSize = function (entry1, entry2) {
return cmp(entry1, entry2, false, function (entry) {
return $(entry).find('.size').data('bytes');
});
},
cmpNameRev = function (entry1, entry2) {
return cmp(entry1, entry2, true, function (entry) {
return $(entry).find('.label').text().toLowerCase();
});
},
cmpTimeRev = function (entry1, entry2) {
return cmp(entry1, entry2, true, function (entry) {
return $(entry).find('.date').data('time');
});
},
cmpSizeRev = function (entry1, entry2) {
return cmp(entry1, entry2, true, function (entry) {
return $(entry).find('.size').data('bytes');
});
},
sort = function (fn) {
$('#extended .entry').detach().sort(fn).appendTo($('#extended > ul'));
},
$all, orders,
sortBy = function (id) {
var order = orders[id];
$all.removeClass('ascending').removeClass('descending');
order.head.addClass(order.clas);
sort(order.fn);
h5ai.core.hash({sort: id});
},
init = function () {
var $ascending = $('<img src="' + h5ai.core.image('ascending') + '" class="sort ascending" alt="ascending" />'),
$descending = $('<img src="' + h5ai.core.image('descending') + '" class="sort descending" alt="descending" />'),
initialOrder = h5ai.core.hash('sort'),
$header = $('#extended li.header'),
$label = $header.find('a.label'),
$date = $header.find('a.date'),
$size = $header.find('a.size');
$all = $header.find('a.label,a.date,a.size');
orders = {
na: {
head: $label,
clas: 'ascending',
fn: cmpName
},
nd: {
head: $label,
clas: 'descending',
fn: cmpNameRev
},
da: {
head: $date,
clas: 'ascending',
fn: cmpTime
},
dd: {
head: $date,
clas: 'descending',
fn: cmpTimeRev
},
sa: {
head: $size,
clas: 'ascending',
fn: cmpSize
},
sd: {
head: $size,
clas: 'descending',
fn: cmpSizeRev
}
};
sortBy(initialOrder ? initialOrder : h5ai.settings.sortorder);
$label
.append($ascending.clone()).append($descending.clone())
.click(function (event) {
sortBy('n' + ($label.hasClass('ascending') ? 'd' : 'a'));
event.preventDefault();
});
$date
.prepend($ascending.clone()).prepend($descending.clone())
.click(function (event) {
sortBy('d' + ($date.hasClass('ascending') ? 'd' : 'a'));
event.preventDefault();
});
$size
.prepend($ascending.clone()).prepend($descending.clone())
.click(function (event) {
sortBy('s' + ($size.hasClass('ascending') ? 'd' : 'a'));
event.preventDefault();
});
};
h5ai.sort = {
init: init
};
}(jQuery, h5ai));