<!DOCTYPE html>
<html>
  <head>
    <script src="https://unpkg.com/core-js@2.5.1/client/shim.js"></script>
    <script src="https://unpkg.com/zone.js@0.6.23/dist/zone.js"></script>
    <script src="https://unpkg.com/reflect-metadata@0.1.3/Reflect.js"></script>
    <script src="https://unpkg.com/systemjs@0.19.31/dist/system.js"></script>
    <script src="https://unpkg.com/typescript@1.8.10/lib/typescript.js"></script>
    <script src="config.js"></script>
    <script>
      System.import('helloworld').catch(console.error.bind(console)); 
    </script>
    
    <style>.active { color: red; font-weight: bold; }</style>
  </head>

  <body>
    <my-app>
      Loading...
    </my-app>
  </body>

</html>
var uirVer = '1.0.0-beta.7';
var uirCoreVer = '5.0.5';
var rxjsVer = '5.0.1';
var ng2Ver = '4.2.0';
var ng2Pkgs = ['core', 'compiler', 'common', 'http', 'platform-browser-dynamic', 'platform-browser', 'router'];

System.config({
  //use typescript for compilation
  transpiler: 'typescript',
  //typescript compiler options
  typescriptOptions: {
    emitDecoratorMetadata: true
  },
  //map tells the System loader where to look for things
  map: Object.assign(ng2MapObject(ng2Pkgs, ng2Ver), {
    'helloworld': "./helloworld.ts",
    'rxjs': 'https://unpkg.com/rxjs@' + rxjsVer,
    '@uirouter/angular': 'https://unpkg.com/@uirouter/angular@' + uirVer + '/_bundles/ui-router-ng2',
    '@uirouter/core': 'https://unpkg.com/@uirouter/core@' + uirCoreVer + '/_bundles/ui-router-core',
    '@uirouter/visualizer': 'https://unpkg.com/@uirouter/visualizer@4'
  }),
  //packages defines our app package
  packages: Object.assign(ng2PackagesObject(ng2Pkgs), {
    rxjs: { defaultExtension: 'js' }
  })
});

function ng2MapObject(ng2Packages, ng2Ver) {
  return ng2Packages.reduce(function (acc, pkg) {
    acc['@angular/' + pkg] = 'https://unpkg.com/@angular/' + pkg + '@' + ng2Ver;
    return acc;
  }, {});
}

function ng2PackagesObject(ng2Packages) {
  return ng2Packages.reduce(function(acc, pkg) {
    acc['@angular/' + pkg] = { main: 'bundles/' + pkg + '.umd.js', defaultExtension: 'js' }
    return acc;
  }, {});
}
/** imports */

import {NgModule, Component} from '@angular/core';
import {BrowserModule} from "@angular/platform-browser";
import {platformBrowserDynamic} from '@angular/platform-browser-dynamic';
import {UIRouterModule} from "@uirouter/angular";

/** Components */

@Component({
  selector: 'my-app',
  template: `
  <a uiSref="hello" uiSrefActive="active">Hello</a>
  <a uiSref="about" uiSrefActive="active">About</a>
  <a uiSref="state" uiSrefActive="active">state</a>
  
  <ui-view></ui-view>
  `
})
export class App { }

@Component({  
  template: '<h3>Hello world!</h3>' 
})
class Hello { }

@Component({ 
  template: '<h3>Its the UI-Router hello world app!</h3>' 
})
class About { }


/** States */

let helloState = { name: 'hello', url: '/hello',  component: Hello }; 
let aboutState = { name: 'about', url: '/about',  component: About };

function configFn(router) {
  let TestState = { 
      name: 'state', 
      url: '/state', 
      onEnter(trans, state) { 
          alert(state) 
      }
  };
  
  router.stateRegistry.register(TestState);
}

/** Root Application NgModule */
@NgModule({
  imports: [ 
    BrowserModule,
    UIRouterModule.forRoot({ 
      states: [ helloState, aboutState ],
      useHash: true,
      config: configFn,
    })
  ],
  declarations: [ App, Hello, About ],
  bootstrap: [ App ]
})
class RootAppModule {}

/** Angular 2 bootstrap */

platformBrowserDynamic().bootstrapModule(RootAppModule);