       ENTER: 13
 
     DEFAULT_CALLBACKS =
-      data_source: ->
-        []
 
       matcher: (flag, subtext) ->
         regexp = new RegExp flag+'([A-Za-z0-9_\+\-]*)$|'+flag+'([^\\x00-\\xff]*)$','gi'

          matched = if match[2] then match[2] else match[1]
        matched

      filter: (key) ->
        data = this.data_source()
        if $.isArray(data) and data.length != 0
          items = $.map data, (item,i) =>
            try
              name = if $.isPlainObject item then item[this.data_value()] else item
              regexp = new RegExp(key.text.replace("+","\\+"),'i')
              match = name.match(regexp)
            catch e
              return null
            return if match then item else null
        items

      tpl_eval = (tpl, map) ->
        try
          el = tpl.replace /\$\{([^\}]*)\}/g, (tag,key,pos) ->
            map[key]
        catch error
          ""

      highlighter = (li, query) ->
        return li if not query
        li.replace new RegExp(">\\s*(\\w*)(" + query.replace("+","\\+") + ")(\\w*)\\s*<", 'ig'), (str,$1, $2, $3) ->
            '> '+$1+'<strong>' + $2 + '</strong>'+$3+' <'

      sorter = (query, items) ->
        data_value = this.data_value()
        results = []

        for item in items
            text = item[data_value]
            continue if text.toLowerCase().indexOf(query) is -1
            item.order = text.toLowerCase().indexOf query
            results.push(item)

        results.sort (a,b) ->
            a.order - b.order
        return results


    class At

          $.noop()
        e.stopPropagation()

      render_view: (data) ->
        data = data.splice(0, this.get_opt('limit'))
        data = @callbacks["data_refactor"].call(this, data)
        search_key = this.get_opt("search_key")
        data = @callbacks["sorter"].call(this, @query.text, data, search_key)

        @view.render data

      look_up: ->
        query = this.catch_query()
        return no if not query
        log "At.look_up.query", query

        origin_data = this.get_opt("data")
        search_query = this.get_opt("search_query")
        if typeof data is "string"
          params =
            q: query.text
            limit: this.get_opt("limit")
          callback = $.proxy(this.render_view, this
          @callbacks['remote_filter'].call(this, params, callback))
        else if (data = @callbacks['filter'].call(this, query.text, origin_data, search_query)
            this.render_view data
        else
            @view.hide()
        $.noop()
