@Trigger = (->

  mouseover = (element, options) ->
    $element = $(element)
    event = createMouseEvent('mouseover', options)
    dispatch($element, event)

  mouseenter = (element, options) ->
    $element = $(element)
    event = createMouseEvent('mouseenter', options)
    dispatch($element, event)

  mousedown = (element, options) ->
    $element = $(element)
    event = createMouseEvent('mousedown', options)
    dispatch($element, event)

  mouseout = (element, options) ->
    $element = $(element)
    event = createMouseEvent('mouseout', options)
    dispatch($element, event)

  mouseleave = (element, options) ->
    $element = $(element)
    event = createMouseEvent('mouseleave', options)
    dispatch($element, event)

  mouseup = (element, options) ->
    $element = $(element)
    event = createMouseEvent('mouseup', options)
    dispatch($element, event)

  click = (element, options) ->
    $element = $(element)
    event = createMouseEvent('click', options)
    dispatch($element, event)

  focus = (element, options) ->
    $element = $(element)
    $element.focus()

  clickSequence = (element, options) ->
    $element = $(element)
    mouseover($element, options)
    mousedown($element, options)
    focus($element, options)
    mouseup($element, options)
    click($element, options)

  hoverSequence = (element, options) ->
    $element = $(element)
    mouseover($element, options)
    mouseenter($element, options)

  unhoverSequence = (element, options) ->
    $element = $(element)
    mouseout($element, options)
    mouseleave($element, options)

  dispatch = ($element, event) ->
    $element.each ->
      this.dispatchEvent(event)
      
  # Can't use the new MouseEvent constructor in IE11 because computer.
  # http://www.codeproject.com/Tips/893254/JavaScript-Triggering-Event-Manually-in-Internet-E
  createMouseEvent = (type, options = {}) ->
    defaults =
      view: window,
      cancelable: true,
      bubbles: true,
      detail: 0,
      screenX: 0,
      screenY: 0,
      clientX: 0,
      clientY: 0,
      ctrlKey: false,
      altKey: false,
      shiftKey: false,
      metaKey: false,
      button: 0,
      relatedTarget: null
    options = Object.assign({}, defaults, options)
    event = document.createEvent('MouseEvent')
    event.initMouseEvent(type,
      options.bubbles,
      options.cancelable,
      options.view,
      options.detail,
      options.screenX,
      options.screenY,
      options.clientX,
      options.clientY,
      options.ctrlKey,
      options.altKey,
      options.shiftKey,
      options.metaKey,
      options.button,
      options.relatedTarget
    )
    event      

  mouseover: mouseover
  mouseenter: mouseenter
  mousedown: mousedown
  mouseup: mouseup
  mouseout: mouseout
  mouseleave: mouseleave
  click: click
  clickSequence: clickSequence
  hoverSequence: hoverSequence
  unhoverSequence: unhoverSequence
  createMouseEvent: createMouseEvent
  
)()