﻿
(function($) {

	$.fn.sort = function(sortAttr, sortDesc) {
		if (typeof (sortAttr) === "undefined") {
			return $(this);
		}
		if (sortAttr == "") {
			return $(this);
		}
		if (typeof (sortAttr) === "string") {

			var retObj = $(this).get().sort(function(a, b) {
				var mya = parseInt($(a).attr(sortAttr));
				var myb = parseInt($(b).attr(sortAttr));
				if (typeof (mya) === "number") { return mya > myb ? 1 : -1; }
				else { return $(a).attr(sortAttr).toLowerCase() > $(b).attr(sortAttr).toLowerCase() ? 1 : -1; }
			});
			if (getSort(sortDesc)) {
				return $(retObj.reverse());
			}
			else {
				return $(retObj);
			}
		}
		if (typeof (sortAttr) === "object") {
			if ((sortAttr).length) {
				var retObj = $(this).get().sort(function(a, b) {
					var i = 0;
					var retval = 1;
					while (i < sortAttr.length) {
						var al = $(a).attr(sortAttr[i]).toLowerCase();
						var bl = $(b).attr(sortAttr[i]).toLowerCase();

						if (al > bl) { retval = 1; break; }
						if (bl > al) { retval = -1; break; }
						i++;
					}
					return retval;

				});
				if (getSort(sortDesc)) {
					return $(retObj.reverse());
				}
				else {
					return $(retObj);
				}
			}
			else {
				var retObj = $(this).get().sort(function(a, b) {
					var attrLen = 0;
					for (var v in sortAttr) {
						var al = $(a).attr(v).toLowerCase();
						var bl = $(b).attr(v).toLowerCase();
						if (al > bl) { return (getSort(sortAttr[v])) ? -1 : 1; }
						if (bl > al) { return (getSort(sortAttr[v])) ? 1 : -1; }
					}

				});
				return $(retObj);

			}
		}
	}
	function getSort(sortDesc) {
		if (typeof sortDesc == "boolean") {
			return sortDesc;
		}
		else if (sortDesc.toLowerCase() == "desc") {
			return true;
		}
		else return false;
	}
})(jQuery);