/**
 * @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();
        },

        themeResult: function(result) {
          var output = [];
          if ($.type(result.title) == 'string') {
            output.push('<h4>', Drupal.checkPlain(result.title), '</h4>');
          }
          if ($.type(result.description) == 'string') {
            output.push('<p>', Drupal.checkPlain(result.description), '</p>');
          }
          return output.join('');
        }
      }

      searchElement.betterAutocomplete('init', Drupal.settings.linkit.currentInstance.autocompletePathParsed, Drupal.settings.linkit.currentInstance.autocomplete, callbacks);
    });
  }
};


})(jQuery);