utils = require('./utils.coffee')
delegate = require('dom-delegate')
_ = require('lodash')
keys = [utils.key_codes.esc, utils.key_codes.tab]

modal_window_class = ['.js-modal', '.js-modal_window']
close_window_classes = ['.js-close-modal_window']
modal_window = (event_delegate, selector, on_open, on_close, close_keys = keys)->
  modal_is_opened = false

  matches = (el, selector)->
    (el.matches || el.matchesSelector || el.msMatchesSelector || el.mozMatchesSelector || el.webkitMatchesSelector || el.oMatchesSelector)?.call(el,
      selector)

  close_by_keyboard = (e, element)->
    if close_keys.lastIndexOf(e.keyCode) != -1
      close_fn(e, element)
    true

  close_fn = (e, element)->
    target = e?.target
    click_in_modal = false
    is_close_trigger = false
    while target
      is_close_trigger = _.any(close_window_classes, (class_name)-> matches(target, class_name)) or is_close_trigger
      click_in_modal = _.any(modal_window_class, (class_name)-> matches(target, class_name)) or click_in_modal
      target = target.parentNode

    if click_in_modal == false or is_close_trigger == true
      window.removeEventListener('click', close_fn)
      window.removeEventListener('keydown', close_by_keyboard)
      modal_is_opened = false
      on_close(e, element)
    true

  open_fn = (e, element) ->
    #таймаут нужен чтоб не словить тот же клик, который открыл окно
    setTimeout(->
      window.addEventListener('click', close_fn)
    , 200)
    window.addEventListener('keydown', close_by_keyboard)
    modal_is_opened = true
    on_open(e, element)
    true

  toggle_modal = _.debounce((e, element)->
    if modal_is_opened then close_fn(e, element) else open_fn(e, element)
  , 150, {trailing: false, leading: true})

  event_delegate.on 'click', selector, (e, element)->
    toggle_modal(e, element)
    true

  event_delegate.on 'focus', selector, (e, element) ->
    toggle_modal(e, element)
    true

  [
    -> open_fn({}, event_delegate.rootElement.querySelector(selector)),
    -> close_fn({}, event_delegate.rootElement.querySelector(selector))
  ]



module.exports = modal_window
