root = exports ? this

requirejs.config

shim:
  'jquery.ujs':
    deps: ['jquery', 'config/load_components']
    exports: 'jQuery.rails'

  build:
    # FIXME check that the build was loaded in a more elegant way
    # probably create a undefined plug-in for component builder
    exports: 'require.modules.seminovos/vendor/loaded'
    deps: ['ende_build']

  ende_build:
    exports: 'require.register'

paths:
  'jquery.ujs': 'jquery_ujs'

# Prevent aura from defining jquery erroniously define 'jquery' , ['config/load_components'], ->

window.jQuery = window.$ = require 'component~jquery@1.0.0'

define 'modernizr' , ['config/load_components'], ->

require 'components~modernizr@2.6.2'
window.Modernizr

define 'rivets', ['config/load_components'], -> require 'mikeric~rivets@v0.5.12'

# TODO define 'underscore', ['config/load_components'], -> require 'lodash'

# TODO figure out how to use rjs optmizer to include component builds # Use call method to avoid optmization at all define 'ende_components', ['ende_build'], {} define 'application_components', ['ende_components', 'build'], {}

# In order to start, application and ende components must be loaded define 'config/load_components', ['application_components'], ->

# TODO remove and use r.js optmizer wrapShim option, when
# optimizer gets updated
define 'jquery.inview'                  , ['jquery'], ->
  require 'ende/vendor/assets/javascripts/jquery/inview.js'

define 'jquery.mask'                    , ['jquery'], ->
  inner_lazy_require = 'ende/vendor/assets/javascripts/jquery/inputmask.js'
  require inner_lazy_require

define 'jquery.mask_extensions'         , ['jquery'], ->
  inner_lazy_require = 'ende/vendor/assets/javascripts/jquery/inputmask.extensions.js'
  require inner_lazy_require

define 'jquery.mask_numeric_extensions' , ['jquery'], ->
  inner_lazy_require = 'ende/vendor/assets/javascripts/jquery/inputmask.numeric.extensions.js'
  require inner_lazy_require

# Object.defineProperty window, 'jQuery',
#   get: -> require 'component-jquery'
#   set: -> debugger

# This may be included in build, and loaded before aurajs requires for them
# TODO also preload eventemitter2
# TODO also preload require-jstext

# Little object class to merge component require and requirejs require
loader =
  shim: ->
    component = require

    # Store loaders functions
    loader.loaders.component = component
    loader.loaders.requirejs = requirejs
    loader.activate.define   = root.define

    # Expand require fuction with requirejs configurations
    # so we can require without great problems
    aliases = ['config', 's']
    loader.require[alias] = requirejs[alias] for alias in aliases

    aliases = ['aliases', 'modules', 'alias', 'normalize', 'resolve', 'relative', 'register']
    loader.require[alias] = component[alias] for alias in aliases

  initialize: ->
    # Override global require for ouer one
    root.require = loader.require

    # TODO remove global loader and use requirejs instead
    root.loader  = @

  # Resource loaders compatibility
  loaders:
    requirejs : null
    component : null
    discovered: null

  discover: (params...) ->

    if params[0] instanceof Array
      requirer = 'requirejs'
    else
      requirer = 'component'

    @activate requirer

    requirer

  activate: (requirer) ->
    switch requirer
      when 'component'
        root.define = null
      when 'requirejs'
        root.define = @activate.define
      else
        false

    @loaders.discovered = @loaders[requirer]

    true

  require: (params...) ->
    using = loader.discover params...

    try
      # TODO rename mod to module
      mod = loader.loaders.discovered.apply @, params

    catch e
      if e.toString().indexOf('failed to require') != -1
        # TODO better loggin support
        if not app? or app.debug
          (app?.logger || console).warn "loader: Failed to load '#{params[0]}' with #{using}: \n Exception: '#{e.message}'. Trying with requirejs."

        # Since it failed to load with component, try to load with requirejs
        loader.activate 'requirejs'
        unless mod
          mod = loader.loaders.discovered.apply @, params
      else
        throw e

      # Always let requirejs active by default
    loader.activate 'requirejs'

    mod

loader.shim()
loader.initialize()