<!DOCTYPE html>
<html>

  <head>
    <script data-require="zone.js@*" data-semver="0.4.1" src="https://cdn.rawgit.com/angular/zone.js/v0.8.11/dist/zone.js"></script>
    <script data-require="zone.js@*" data-semver="0.4.1" src="https://cdn.rawgit.com/angular/zone.js/v0.8.11/dist/long-stack-trace-zone.js"></script>
    <link rel="stylesheet" href="style.css" />
  </head>

  <body>
    <h1>Hello Zone!</h1>
    <form name="user">
      <div>
        <label>Enter your name:</label> 
        <input name="name"> saved: <span>0</span>
      </div>
      <button type="submit" name="save">Save</button>
    </form>
    <script src="script.js"></script>
  </body>

</html>
// Code goes here



function callOncePerTask(listener) {
  const spec = new OncePerTaskSpec()
  const zone = Zone.current.fork(spec)
  
  return (...args) => {
    return zone.run(() => {
      if (!spec.hasTasks) {
        return listener(...args)
      }
    })
  }
}

class OncePerTaskSpec {
  constructor() {
    this.hasTasks = false
  }
  
  onHasTask(delegate, currentZone, targetZone, hasTask) {
    delegate.hasTask(targetZone, hasTask)
    this.hasTasks = hasTask.macroTask || hasTask.microTask
  }
}


function main() {
  const form = document.forms.user
  let i = 0
  
  form.addEventListener('submit', event => event.preventDefault(), false)
  form.addEventListener('submit', callOncePerTask(event => {
    form.name.nextElementSibling.textContent = ++i
    
    const originalText = form.save.textContent
    form.save.textContent = 'Loading...'
    
    setTimeout(() => {
      localStorage.name = form.name.value
      form.save.textContent = originalText
    }, 1500)
  }), false)
  
  setTimeout(() => console.log('opa'), 10000)
}

Zone.current.run(main)

/* Styles go here */