'use strict'; define( ['underscore', 'Config'], function (_, Config) { return function () { var originalSetSorting = this.prototype.setSorting; this.prototype.setSorting = function (sortKey, order, options) { var sortMapping = this._getSortMapping(sortKey); options = _.defaults({ sortValue: sortMapping.sortValue }, options || {}); return originalSetSorting.call(this, sortMapping.sortKey, order, options); }; this.prototype._getSortMappings = function () { var result = {}; if (this.sortMappings) { _.each(this.sortMappings, function (values, key) { var item = { name: key, sortKey: values.sortKey || key, sortValue: values.sortValue }; result[key] = item; result[item.sortKey] = item; }); } return result; }; this.prototype._getSortMapping = function (key) { var sortMappings = this._getSortMappings(); return sortMappings[key] || { name: key, sortKey: key }; }; this.prototype._getSecondarySorting = function () { var sortKey = this.state.secondarySortKey; var sortOrder = this.state.secondarySortOrder || -1; if (!sortKey || sortKey === this.state.sortKey) { return null; } var sortMapping = this._getSortMapping(sortKey); if (!sortMapping.sortValue) { sortMapping.sortValue = function (model, attr) { return model.get(attr); }; } return { key : sortKey, order : sortOrder, sortValue : sortMapping.sortValue }; }; this.prototype._makeComparator = function (sortKey, order, sortValue) { var state = this.state; var secondarySorting = this._getSecondarySorting(); sortKey = sortKey || state.sortKey; order = order || state.order; if (!sortKey || !order){ return; } if (!sortValue) { sortValue = function (model, attr) { return model.get(attr); }; } return function (left, right) { var l = sortValue(left, sortKey); var r = sortValue(right, sortKey); var t; if (order === 1) { t = l; l = r; r = t; } if (l === r) { if (secondarySorting) { var ls = secondarySorting.sortValue(left, secondarySorting.key); var rs = secondarySorting.sortValue(right, secondarySorting.key); var ts; if (secondarySorting.order === 1) { ts = ls; ls = rs; rs = ts; } if (ls === rs) { return 0; } if (ls < rs) { return -1; } return 1; } return 0; } else if (l < r) { return -1; } return 1; }; }; return this; }; } );