function ArraySortable () {
	var newArraySortable = new Array();

	if (arguments.length) {

		for (var i = 0; i < arguments.length; i++) {
			newArraySortable[i] = arguments[i];
		}
	}

	newArraySortable.sortByField = Array_sortByField;

	return newArraySortable;
}

// ArraySortable.prototype = new Array;
// Array.prototype.sortByField = Array_sortByField

function Array_sortByField (field, order, caseInsensitive) {
	this.sortProperties = new Object();
	this.sortProperties.sortField = field;
	this.sortProperties.isAscending = (order > 0);
	this.sortProperties.caseInsensitive = caseInsensitive;

	for (var i in this) {

		if (typeof(this[i]) == "object") {
			this[i].sortProperties = new Object();
			this[i].sortProperties.parent = this;
		}
	}

	this.sort(Array_sortByFieldSort);
}

function Array_sortByFieldSort (a, b) {
	var sortField = a.sortProperties.parent.sortProperties.sortField;
	var isAscending = a.sortProperties.parent.sortProperties.isAscending;
	var aField = a[sortField];
	var bField = b[sortField];

	if (a.sortProperties.parent.sortProperties.caseInsensitive && typeof(aField) == "string") aField = aField.toLowerCase();
	if (b.sortProperties.parent.sortProperties.caseInsensitive && typeof(bField) == "string") bField = bField.toLowerCase();

	if (aField < bField) return (isAscending) ? -1 : 1;
	if (aField > bField) return (isAscending) ? 1 : -1;

	return 0;
}

function SortByField (arr, sortField, sortOrder, caseInsensitive) {

	function Sort (a, b) {

		var aField = a[sortField];
		var bField = b[sortField];

		if (caseInsensitive && typeof(aField) == "string") aField = aField.toLowerCase();
		if (caseInsensitive && typeof(bField) == "string") bField = bField.toLowerCase();

		if (aField < bField) return (sortOrder > 0) ? -1 : 1;
		if (aField > bField) return (sortOrder > 0) ? 1 : -1;
		return 0;
	}

	if (arguments.length < 2) return arr.sort();
	if (arguments.length < 3) sortOrder = 1;
	arr.sort(Sort);
	return arr;
}