define ["domReady", "jquery", "underscore.string", "backbone", "gettext",
        "common/js/components/views/feedback_notification",
        "coffee/src/ajax_prefix", "jquery.cookie"],
(domReady, $, str, Backbone, gettext, NotificationView) ->
  main = ->
    AjaxPrefix.addAjaxPrefix jQuery, ->
      $("meta[name='path_prefix']").attr('content')

    window.CMS = window.CMS or {}
    CMS.URL = CMS.URL or {}
    window.onTouchBasedDevice = ->
      navigator.userAgent.match /iPhone|iPod|iPad|Android/i

    _.extend CMS, Backbone.Events
    Backbone.emulateHTTP = true

    $.ajaxSetup
      headers : { 'X-CSRFToken': $.cookie 'csrftoken' }
      dataType: 'json'

    $(document).ajaxError (event, jqXHR, ajaxSettings, thrownError) ->
      if ajaxSettings.notifyOnError is false
          return
      if jqXHR.responseText
        try
          message = JSON.parse(jqXHR.responseText).error
        catch error
          message = str.truncate(jqXHR.responseText, 300)
      else
        message = gettext("This may be happening because of an error with our server or your internet connection. Try refreshing the page or making sure you are online.")
      msg = new NotificationView.Error(
        "title": gettext("Studio's having trouble saving your work")
        "message": message
      )
      msg.show()

    $.postJSON = (url, data, callback) ->
      # shift arguments if data argument was omitted
      if $.isFunction(data)
        callback = data
        data = `undefined`
      $.ajax
        url: url
        type: "POST"
        contentType: "application/json; charset=utf-8"
        dataType: "json"
        data: JSON.stringify(data)
        success: callback

    domReady ->
      if onTouchBasedDevice()
        $('body').addClass 'touch-based-device'

  main()
  return main
