<!DOCTYPE html>
<html>

  <head>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.0/angular.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-router/0.2.15/angular-ui-router.js"></script>
    <script src="app.config.js"></script>
  </head>

  <body ng-app="myApp">
    <h1>Routing Test</h1>    
    
  	<div ui-view></div>
  	
  	<ul>
  	  <li><a href="#/list">List</a></li>
  	  <li><a href="#/version/123/list">Version valid List</a></li>
  	  <li><a href="#/version/X/list">Version invalid List</a></li>
  	  <li><a href="#/complex/Bill/4">Complex valid</a></li>
  	  <li><a href="#/complex/B4ll/4">Complex invalid</a></li>
  	  <li><a href="#/base/1">Child state valid</a></li>
  	  <li><a href="#/base/x1">Child state invalid</a></li>
  	  <li><a href="#/custom/e1e75aa3-a413-4c11-8fff-87f7cd43243e">Custom type valid</a></li>
  	  <li><a href="#/custom/junk">Custom type invalid</a> (does not trigger otherwise)</li>
  	</ul>

  </body>
</html>
(function () {
    'use strict';

    var myApp = angular.module('myApp', ['ui.router']);
    
    myApp
        .config(routeCustomTypeConfigurator)
        .config(configurator);
    
    routeCustomTypeConfigurator.$inject = ['$urlMatcherFactoryProvider'];
        
    function routeCustomTypeConfigurator($urlMatcherFactoryProvider) {
        // http://stackoverflow.com/questions/30475790/how-to-add-guid-regex-in-angular-ui-router-state
        var GUID_REGEXP = /^[a-f\d]{8}-(?:[a-f\d]{4}-){3}[a-f\d]{12}$/i;
        
        $urlMatcherFactoryProvider.type('guid', {
            encode: angular.identity,
            decode: angular.identity,
            equals: function(a, b) { return a === b; },
            is: function(item) {
                return GUID_REGEXP.test(item);
            },
            pattern: GUID_REGEXP
        });
    }
    
    configurator.$inject = ['$stateProvider', '$urlRouterProvider'];
    
    function configurator ($stateProvider, $urlRouterProvider) {
        $stateProvider
            .state('list', {
                url: '/list',
                template: '<p>List state</p>'
            })
            .state('versionList', {
                url: '/version/{version:int}/list',
                template: '<p>Version List</p>'
            })
            .state('complex', {
                url: '/complex/{name:[A-Za-z]+}/{id:int}',
                template: '<p>Complex</p>'
            })
            .state('base', {
                abstract: true,
                url: '/base',
                template: '<h2>Base</h2><div ui-view="child1"></div>'
            })
            .state('base.child', {
                url: '/{id:int}',
                views: {
                    'child1@base': {
                        template: '<p>child1</p>'
                    }
                }
            })
            .state('custom', {
                url: '/custom/{customId:guid}',
                template: '<p>Custom type</p>'
            });

        $urlRouterProvider.otherwise('/list');
    }
}());