%PDF- %PDF-
| Direktori : /home/vacivi36/intranet.vacivitta.com.br/protected/vendor/npm-asset/at.js/src/ |
| Current File : /home/vacivi36/intranet.vacivitta.com.br/protected/vendor/npm-asset/at.js/src/app.coffee |
# At.js central contoller(searching, matching, evaluating and rendering.)
class App
# @param inputor [HTML DOM Object] `input` or `textarea`
constructor: (inputor) ->
@currentFlag = null
@controllers = {}
@aliasMaps = {}
@$inputor = $(inputor)
this.setupRootElement()
this.listen()
createContainer: (doc) ->
@$el?.remove()
$ doc.body
.append @$el = $ "<div class='atwho-container'></div>"
setupRootElement: (iframe, asRoot=false) ->
if iframe
@window = iframe.contentWindow
@document = iframe.contentDocument || @window.document
@iframe = iframe
else
@document = @$inputor[0].ownerDocument
@window = @document.defaultView || @document.parentWindow
try
@iframe = @window.frameElement
catch error
@iframe = null
if $.fn.atwho.debug
throw new Error """
iframe auto-discovery is failed.
Please use `setIframe` to set the target iframe manually.
#{error}
"""
this.createContainer if @iframeAsRoot = asRoot then @document else document
controller: (at) ->
if @aliasMaps[at]
current = @controllers[@aliasMaps[at]]
else
for currentFlag, c of @controllers
if currentFlag is at
current = c
break
if current then current else @controllers[@currentFlag]
setContextFor: (at) ->
@currentFlag = at
this
# At.js can register multiple at char (flag) to every inputor such as "@" and ":"
# Along with their own `settings` so that it works differently.
# After register, we still can update their `settings` such as updating `data`
#
# @param flag [String] at char (flag)
# @param settings [Hash] the settings
reg: (flag, setting) ->
controller = @controllers[flag] ||=
if @$inputor.is '[contentEditable]'
new EditableController this, flag
else
new TextareaController this, flag
# TODO: it will produce rubbish alias map, reduse this.
@aliasMaps[setting.alias] = flag if setting.alias
controller.init setting
this
# binding jQuery events of `inputor`'s
listen: ->
@$inputor
.on 'compositionstart', (e) =>
this.controller()?.view.hide()
@isComposing = true
null
.on 'compositionend', (e) =>
@isComposing = false
setTimeout((e) => @dispatch(e))
null
.on 'keyup.atwhoInner', (e) =>
this.onKeyup(e)
.on 'keydown.atwhoInner', (e) =>
this.onKeydown(e)
.on 'blur.atwhoInner', (e) =>
if c = this.controller()
c.expectedQueryCBId = null
c.view.hide(e,c.getOpt("displayTimeout"))
.on 'click.atwhoInner', (e) =>
this.dispatch e
.on 'scroll.atwhoInner', do =>
# make returned handler handle the very first call properly
lastScrollTop = @$inputor.scrollTop()
(e) =>
currentScrollTop = e.target.scrollTop
if lastScrollTop != currentScrollTop
@controller()?.view.hide(e)
lastScrollTop = currentScrollTop
true # ensure we don't stop bubbling
shutdown: ->
for _, c of @controllers
c.destroy()
delete @controllers[_]
@$inputor.off '.atwhoInner'
@$el.remove()
dispatch: (e) ->
if undefined == e
return
c.lookUp(e) for _, c of @controllers
onKeyup: (e) ->
switch e.keyCode
when KEY_CODE.ESC
e.preventDefault()
this.controller()?.view.hide()
when KEY_CODE.DOWN, KEY_CODE.UP, KEY_CODE.CTRL, KEY_CODE.ENTER
$.noop()
when KEY_CODE.P, KEY_CODE.N
this.dispatch e if not e.ctrlKey
else
this.dispatch e
# coffeescript will return everywhere!!
return
onKeydown: (e) ->
# return if not (view = this.controller().view).visible()
view = this.controller()?.view
return if not (view and view.visible())
switch e.keyCode
when KEY_CODE.ESC
e.preventDefault()
view.hide(e)
when KEY_CODE.UP
e.preventDefault()
view.prev()
when KEY_CODE.DOWN
e.preventDefault()
view.next()
when KEY_CODE.P
return if not e.ctrlKey
e.preventDefault()
view.prev()
when KEY_CODE.N
return if not e.ctrlKey
e.preventDefault()
view.next()
when KEY_CODE.TAB, KEY_CODE.ENTER, KEY_CODE.SPACE
return if not view.visible()
return if not this.controller().getOpt('spaceSelectsMatch') and e.keyCode == KEY_CODE.SPACE
return if not this.controller().getOpt('tabSelectsMatch') and e.keyCode == KEY_CODE.TAB
if view.highlighted()
e.preventDefault()
view.choose(e)
else
view.hide(e)
else
$.noop()
return