text: /**
   * @file
   * Linkit dashboard functions
   */
  
  (function ($) {
  
  Drupal.behaviors.linkitDashboard = {
    attach: function (context, settings) {
      // Bind the insert link button.
      $('.linkit-insert', context).once('linkit-insert', function() {
        $('.linkit-insert', context).click(function() {
          // Call the insertLink() function.
          Drupal.linkit.getDialogHelper(Drupal.settings.linkit.currentInstance.helper).insertLink(Drupal.linkit.getLink());
  
          // Close the dialog.
          Drupal.linkit.modalClose();
          return false;
        });
      });
  
      // Bind the close link.
      $('#linkit-cancel', context).once('linkit-cancel', function() {
        $('#linkit-cancel', context).bind('click', Drupal.linkit.modalClose);
      });
  
      // Run the validation if the path field is populated directly.
      $('#edit-linkit-path', context).bind('keyup paste input propertychange', function(){
        Drupal.linkit.requiredFieldsValidation();
      });
  
      $(".ui-dialog-titlebar").show();
  
      // Run required field validation.
      Drupal.linkit.requiredFieldsValidation();
  
      if (!Drupal.settings.linkit.currentInstance.suppressProfileChanger) {
        // Make the profile changer
        Drupal.linkit.profileChanger(context);
      }
      if (Drupal.settings.linkit.IMCEurl && !$('#linkit-imce', context).length) {
        var $imceButton = $('<input />')
          .attr({type: 'button', id: 'linkit-imce', name: 'linkit-imce'})
          .addClass('form-submit')
          .val(Drupal.t('Open file browser'))
          .insertAfter($('.form-item-linkit-search', context))
          .click(function(e) {
            e.preventDefault();
            Drupal.linkit.openFileBrowser();
          });
      }
    }
  };
  
  /**
   * Check for mandatory fields in the form and disable for submissions
   * if any of the fields are empty.
   */
  Drupal.linkit.requiredFieldsValidation = function() {
    var allowed = true;
    $('#linkit-modal .required').each(function() {
      if (!$(this).val()) {
        allowed = false;
        return false;
      }
    });
    if (allowed) {
      $('#linkit-modal .linkit-insert')
        .removeAttr('disabled')
        .removeClass('form-button-disabled');
    }
    else {
      $('#linkit-modal .linkit-insert')
        .attr('disabled', 'disabled')
        .addClass('form-button-disabled');
    }
  };
  
  /**
   * Open the IMCE file browser
   */
  Drupal.linkit.openFileBrowser = function () {
    window.open(decodeURIComponent(Drupal.settings.linkit.IMCEurl), '', 'width=760,height=560,resizable=1');
  };
  
  /**
   * When a file is inserted through IMCE, this function is called.
   * See IMCE api for details.
   *
   * @param file
   *   The file object that was selected inside IMCE
   * @param win
   *   The IMCE window object
   */
  Drupal.linkit.IMCECallback = function(file, win) {
    Drupal.linkit.populateFields({
       path: win.imce.decode(Drupal.settings.basePath +
           Drupal.settings.linkit.publicFilesDirectory + '/' + file.relpath)
    });
    win.close();
  };
  
  /**
   * Populate fields on the dashboard.
   *
   * @param link
   *   An object with the following properties (all are optional):
   *   - path: The anchor's href.
   *   - attributes: An object with additional attributes for the anchor element.
   */
  Drupal.linkit.populateFields = function(link) {
    link = link || {};
    link.attributes = link.attributes || {};
  
    $('#linkit-modal .linkit-path-element').val(link.path);
  
    $.each(link.attributes, function(name, value) {
      $('#linkit-modal .linkit-attributes .linkit-attribute-' + name).val(value);
    });
  
    // Run required field validation.
    Drupal.linkit.requiredFieldsValidation();
  };
  
  /**
   * Retrieve a link object by extracting values from the form.
   *
   * @return
   *   The link object.
   */
   Drupal.linkit.getLink = function() {
      var link = {
        path: $('#linkit-modal .linkit-path-element ').val(),
        attributes: {}
      };
      $.each(Drupal.linkit.additionalAttributes(), function(f, name) {
       link.attributes[name] = $('#linkit-modal .linkit-attributes .linkit-attribute-' + name).val();
      });
    return link;
  };
  
  /**
   * Retrieve a list of the currently available additional attributes in the
   * dashboard. The attribute "href" is excluded.
   *
   * @return
   *   An array with the names of the attributes.
   */
  Drupal.linkit.additionalAttributes = function() {
    var attributes = [];
    $('#linkit-modal .linkit-attributes .linkit-attribute').each(function() {
      // Remove the 'linkit_' prefix.
      attributes.push($(this).attr('name').substr(7));
    });
    return attributes;
  };
  
  Drupal.linkit.profileChanger = function(context) {
    $('#linkit-profile-changer > div.form-item', context).once('linkit-change-profile', function() {
      var target = $(this);
      var toggler = $('<div id="linkit-profile-changer-toggler"></div>')
      .html(Drupal.t('Change profile'))
      .click(function() {
        target.slideToggle();
      });
      $(this).after(toggler);
    });
  
    $('#linkit-profile-changer .form-radio', context).each(function() {
      var id = $(this).attr('id');
      var profile = $(this).val();
      if (typeof Drupal.ajax[id] != 'undefined') {
        // @TODO: Jquery 1.5 accept success setting to be an array of functions.
        // But we have to wait for jquery to get updated in Drupal core.
        // In the meantime we have to override it.
        Drupal.ajax[id].options.success = function (response, status) {
          if (typeof response == 'string') {
            response = $.parseJSON(response);
          }
  
          // Update the autocomplete url.
          Drupal.settings.linkit.currentInstance.autocompletePathParsed = Drupal.settings.linkit.autocompletePath.replace('___profile___', profile);
  
          // Call the ajax success method.
          Drupal.ajax[id].success(response, status);
          $('#linkit-profile-changer > div.form-item').slideToggle();
        };
      }
    });
  };
  
  Drupal.behaviors.linkitSearch = {
    attach: function(context, settings) {
  
      $('.linkit-search-element').once('linkit-search', function() {
        // Create a synonym for this to reduce code confusion.
        var searchElement = $('.linkit-search-element');
        var callbacks = {
          constructURL: function(path, search) {
            return path + encodeURIComponent(search);
          },
  
          insertSuggestionList: function($results, $input) {
            var top = $input.position().top + $input.outerHeight() - 5;
  
            $results.width($input.outerWidth()).css({
              position: 'absolute',
              // High value because of other overlays like
              // wysiwyg fullscreen (TinyMCE) mode.
              zIndex: 211000,
              maxHeight: $(window).height() - (top + 20)
            })
            .hide()
            .insertAfter($input);
          },
  
          select: function(result) {
            if (typeof result == 'undefined') {
              return false;
            }
            // Only change the link text if it is empty.
            if (typeof result.disabled != 'undefined' && result.disabled) {
              return false;
            }
  
            Drupal.linkit.populateFields({
              path: result.path
            });
  
            // Store the result title (Used when no selection is made by the user).
            Drupal.settings.linkit.currentInstance.linkContent = result.title;
  
            $('.linkit-path-element', context).focus();
          }
        }
  
        searchElement.betterAutocomplete('init', Drupal.settings.linkit.currentInstance.autocompletePathParsed, Drupal.settings.linkit.currentInstance.autocomplete, callbacks);
      });
    }
  };
  
  
  })(jQuery);