135 lines
4.3 KiB
JavaScript
135 lines
4.3 KiB
JavaScript
/**
|
|
* @file
|
|
* Linkit field ui functions
|
|
*/
|
|
|
|
(function ($) {
|
|
|
|
Drupal.behaviors.linkit_field = {
|
|
attach : function(context, settings) {
|
|
// If there is no fields, just stop here.
|
|
|
|
if (settings.linkit == undefined || settings.linkit.fields == null) {
|
|
return false;
|
|
}
|
|
|
|
$.each(settings.linkit.fields, function(field_name, field) {
|
|
$('#' + field_name, context).once('linkit_field', function() {
|
|
$('.linkit-field-' + field_name).click(function() {
|
|
// Set profile.
|
|
Drupal.settings.linkit.currentInstance.profile = Drupal.settings.linkit.fields[field_name].profile;
|
|
|
|
// Set the name of the source field..
|
|
Drupal.settings.linkit.currentInstance.source = field_name;
|
|
|
|
// Set the source type.
|
|
Drupal.settings.linkit.currentInstance.helper = 'field';
|
|
|
|
// Only care about selection if the element is a textarea.
|
|
if ($('textarea#' + field_name).length) {
|
|
var selection = Drupal.linkit.getDialogHelper('field').getSelection($('#' + field_name).get(0));
|
|
// Save the selection.
|
|
Drupal.settings.linkit.currentInstance.selection = selection;
|
|
}
|
|
|
|
// Suppress profile changer.
|
|
Drupal.settings.linkit.currentInstance.suppressProfileChanger = true;
|
|
|
|
// Create the modal.
|
|
Drupal.linkit.createModal();
|
|
|
|
return false;
|
|
});
|
|
});
|
|
});
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Linkit field dialog helper.
|
|
*/
|
|
Drupal.linkit.registerDialogHelper('field', {
|
|
init : function() {},
|
|
afterInit : function () {},
|
|
|
|
/**
|
|
* Insert the link into the field.
|
|
*
|
|
* @param {Object} link
|
|
* The link object.
|
|
*/
|
|
insertLink : function(data) {
|
|
var source = $('#' + Drupal.settings.linkit.currentInstance.source),
|
|
field_settings = Drupal.settings.linkit.fields[Drupal.settings.linkit.currentInstance.source],
|
|
|
|
// Call the insert plugin.
|
|
link = Drupal.linkit.getInsertPlugin(field_settings.insert_plugin).insert(data, field_settings);
|
|
|
|
if (typeof Drupal.settings.linkit.currentInstance.selection != 'undefined') {
|
|
// Replace the selection and insert the link there.
|
|
this.replaceSelection(source.get(0), Drupal.settings.linkit.currentInstance.selection, link);
|
|
}
|
|
else {
|
|
// Replace the field value.
|
|
this.replaceFieldValue(source.get(0), link);
|
|
}
|
|
|
|
// Link field can have a title field. If they have, we populate the title
|
|
// field with the search result title if any.
|
|
if (typeof field_settings.title_field != 'undefined' && typeof Drupal.settings.linkit.currentInstance.linkContent != 'undefined') {
|
|
this.replaceFieldValue($('#' + field_settings.title_field).get(0), Drupal.settings.linkit.currentInstance.linkContent);
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Get field selection.
|
|
*/
|
|
getSelection : function(e) {
|
|
// Mozilla and DOM 3.0.
|
|
if ('selectionStart' in e) {
|
|
var l = e.selectionEnd - e.selectionStart;
|
|
return { start: e.selectionStart, end: e.selectionEnd, length: l, text: e.value.substr(e.selectionStart, l) };
|
|
}
|
|
// IE.
|
|
else if(document.selection) {
|
|
e.focus();
|
|
var r = document.selection.createRange(),
|
|
tr = e.createTextRange(),
|
|
tr2 = tr.duplicate();
|
|
tr2.moveToBookmark(r.getBookmark());
|
|
tr.setEndPoint('EndToStart',tr2);
|
|
|
|
if (r == null || tr == null) {
|
|
return { start: e.value.length, end: e.value.length, length: 0, text: '' };
|
|
}
|
|
|
|
// For some reason IE doesn't always count the \n and \r in the length.
|
|
var text_part = r.text.replace(/[\r\n]/g,'.'),
|
|
text_whole = e.value.replace(/[\r\n]/g,'.'),
|
|
the_start = text_whole.indexOf(text_part, tr.text.length);
|
|
return { start: the_start, end: the_start + text_part.length, length: text_part.length, text: r.text };
|
|
}
|
|
// Browser not supported.
|
|
else {
|
|
return { start: e.value.length, end: e.value.length, length: 0, text: '' };
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Replace the field selection.
|
|
*/
|
|
replaceSelection : function (e, selection, text) {
|
|
var start_pos = selection.start;
|
|
var end_pos = start_pos + text.length;
|
|
e.value = e.value.substr(0, start_pos) + text + e.value.substr(selection.end, e.value.length);
|
|
},
|
|
|
|
/**
|
|
* Replace the field value.
|
|
*/
|
|
replaceFieldValue : function (e, text) {
|
|
e.value = text;
|
|
}
|
|
});
|
|
|
|
})(jQuery); |