<!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>
    Click "Events On" to attach listeners to buttons
    Click "Events Off" to detach listeners
    <button id="events-on">Events On</button>
    <button id="events-off">Events Off</button>
    
    
    <div style="margin-top: 20px">
      <button id="click-me">Click me</button>
      Counter: <span>0</span>
    </div>
    <script src="script.js"></script>
  </body>

</html>
// Code goes here

class TrackEventListenerSpec {
  constructor() {
    this.name = this.constructor.name
    this.properties = {
      eventTracker: this
    }
    this.tasks = []
  }
  
  onScheduleTask(delegate, currentZone, targetZone, task) {
    if (task.type === 'eventTask') {
      this.tasks.push(task)
    }
    
    return delegate.scheduleTask(targetZone, task)
  }
  
  cleanup() {
    this.tasks.forEach(task => Zone.current.cancelTask(task))
    this.tasks.length = 0
  }
}


function main() {
  const btn = document.getElementById('click-me')
  let i = 0
  
  btn.addEventListener('click', () => {
    btn.nextElementSibling.textContent = ++i
  }, false)
  
  document.getElementById('events-off').addEventListener('click', function() {
    this.previousElementSibling.disabled = false
    Zone.current.get('eventTracker').cleanup()
  })
}

document.getElementById('events-on').addEventListener('click', function() {
  this.disabled = true
  Zone.current.fork(new TrackEventListenerSpec()).run(main)
})
/* Styles go here */