text: /*
   * Localiztion cell processor for the table control.
   */
  
  +function ($) { "use strict";
  
      // NAMESPACE CHECK
      // ============================
  
      if ($.wn.table === undefined)
          throw new Error("The $.wn.table namespace is not defined. Make sure that the table.js script is loaded.");
  
      if ($.wn.table.processor === undefined)
          throw new Error("The $.wn.table.processor namespace is not defined. Make sure that the table.processor.base.js script is loaded.");
  
      // CLASS DEFINITION
      // ============================
  
      var Base = $.wn.table.processor.string,
          BaseProto = Base.prototype
  
      var LocalizationProcessor = function(tableObj, columnName, columnConfiguration) {
          //
          // State properties
          //
  
          this.localizationInput = null
          this.popupDisplayed = false
  
          //
          // Parent constructor
          //
  
          Base.call(this, tableObj, columnName, columnConfiguration)
      }
  
      LocalizationProcessor.prototype = Object.create(BaseProto)
      LocalizationProcessor.prototype.constructor = LocalizationProcessor
  
      LocalizationProcessor.prototype.dispose = function() {
          this.removeLocalizationInput()
  
          BaseProto.dispose.call(this)
      }
  
      /*
       * Forces the processor to hide the editor when the user navigates
       * away from the cell. Processors can update the sell value in this method.
       * Processors must clear the reference to the active cell in this method.
       */
      LocalizationProcessor.prototype.onUnfocus = function() {
          if (!this.activeCell || this.popupDisplayed)
              return
  
          this.removeLocalizationInput()
  
          BaseProto.onUnfocus.call(this)
      }
  
      LocalizationProcessor.prototype.onBeforePopupShow = function() {
          this.popupDisplayed = true
      }
  
      LocalizationProcessor.prototype.onAfterPopupHide = function() {
          this.popupDisplayed = false
      }
  
      /*
       * Renders the cell in the normal (no edit) mode
       */
      LocalizationProcessor.prototype.renderCell = function(value, cellContentContainer) {
          BaseProto.renderCell.call(this, value, cellContentContainer)
      }
  
      LocalizationProcessor.prototype.buildEditor = function(cellElement, cellContentContainer, isClick) {
          BaseProto.buildEditor.call(this, cellElement, cellContentContainer, isClick)
  
          $.wn.foundation.element.addClass(cellContentContainer, 'autocomplete-container')
          this.buildLocalizationEditor()
      }
  
      LocalizationProcessor.prototype.buildLocalizationEditor = function() {
          var input = this.getInput()
  
          this.localizationInput = new $.wn.builder.localizationInput(input, $(input), {
              plugin: this.getPluginCode(input),
              beforePopupShowCallback: $.proxy(this.onBeforePopupShow, this),
              afterPopupHideCallback: $.proxy(this.onAfterPopupHide, this),
              autocompleteOptions: {
                  menu: '<ul class="autocomplete dropdown-menu table-widget-autocomplete localization"></ul>',
                  bodyContainer: true
              }
          })
      }
  
      LocalizationProcessor.prototype.getInput = function() {
          if (!this.activeCell) {
              return null
          }
  
          return this.activeCell.querySelector('.string-input')
      }
  
      LocalizationProcessor.prototype.getPluginCode = function(input) {
          var $form = $(input).closest('form'),
              $input = $form.find('input[name=plugin_code]')
  
          if (!$input.length) {
              throw new Error('The input "plugin_code" should be defined in the form in order to use the localization table processor.')
          }
  
          return $input.val()
      }
  
      LocalizationProcessor.prototype.removeLocalizationInput = function() {
          if (!this.localizationInput) {
              return
          }
  
          this.localizationInput.dispose()
  
          this.localizationInput = null
      }
  
      $.wn.table.processor.builderLocalization = LocalizationProcessor;
  }(window.jQuery);