Angular.js Natural Sorting for orderBy

Creates a natural sorting function for use within Angular.js's built-in orderBy filter.

HTML

<div ng-app="myApp" ng-controller="myCtrl">
    <ul>
        <li ng-repeat="item in items | orderBy:natural('name')">
            {{ item.name }}
        </li>
    </ul>
</div>

JavaScript

angular.module("myApp", ["naturalSort"]).

controller("myCtrl", ["$scope", function($scope) {
    var item = function(id, name) {
        return {id: id, name: name};
    };
    $scope.items = [
        item(1,  "number 1.jpg"),
        item(2,  "number 2.jpg"),
        item(3,  "number 11.jpg"),
        item(4,  "number 3.jpg"),
        item(5,  "number 1.121.jpg"),
        item(6,  "number 1.12.jpg"),
        item(7,  "date 1-4-2012.jpg"),
        item(8,  "date 12-12-1999.jpg"),
        item(9,  "date 04.05.2001 (3).jpg"),
        item(10, "date 04-05-2001 (10).jpg"),
        item(11, "date 04/05/2001.jpg"),
        item(11, "version 1.10.5.jpg"),
        item(11, "version 0.0.1.jpg"),
        item(11, "version 0.1.0.jpg"),
        item(11, "version 1.10.12.jpg"),
        item(11, "version 1.3.3.jpg"),
        item(11, "version 1.10.11.jpg"),
        item(11, "mixed 0.11.5 4 3/2/1999.jpg"),
        item(11, "mixed 0.1.6 4 3/2/1999.jpg"),
        item(11, "mixed 0.11.5 10 3/2/1999.jpg"),
        item(11, "mixed 0.11.5 4 4/31/1990.jpg"),
        item(11, "mixed 0.11.5 4 1/1/2013.jpg")
    ];
}]);

// Create a module for naturalSorting
angular.module("naturalSort", [])

// The core natural service
.factory("naturalService", ["$locale", function($locale) {
		// the cache prevents re-creating the values every time, at the expense of
		// storing the results forever. Not recommended for highly changing data
		// on long-term applications.
	var natCache = {},
		// amount of extra zeros to padd for sorting
        padding = function(value) {
			return '00000000000000000000'.slice(value.length);
		},
		
		// Calculate the default out-of-order date format (d/m/yyyy vs m/d/yyyy)
        natDateMonthFirst = $locale.DATETIME_FORMATS.shortDate.charAt(0) == 'm';
		// Replaces all suspected dates with a standardized yyyy-m-d, which is fixed below
        fixDates = function(value) {
			// first look for dd?-dd?-dddd, where "-" can be one of "-", "/", or "."
            return...