Newer
Older
* SEARCH AUTOCOMPLETE javascript mechanism.
*
Dominique CLAUSE
committed
// Autocomplete
$.ui.autocomplete.prototype._renderItem = function (ul, item) {
var term = this.term;
var first = ("group" in item) ? 'first' : '';
var innerHTML = '<div class="ui-autocomplete-fields ' + first + '">';
Dominique CLAUSE
committed
if (item.fields) {
$.each(item.fields, function(key, value) {
var regex = new RegExp('(' + $.trim(term) + ')', 'gi');
var output = value;
if (value.indexOf('src=') == -1 && value.indexOf('href=') == -1) {
output = value.replace(regex, "<span class='ui-autocomplete-field-term'>$1</span>");
}
innerHTML += ('<div class="ui-autocomplete-field-' + key + '">' + output + '</div>');
Dominique CLAUSE
committed
});
} else {
Dominique CLAUSE
committed
innerHTML += ('<div class="ui-autocomplete-field">' + item.label + '</div>');
Dominique CLAUSE
committed
}
innerHTML += '</div>';
var group = '';
if ("group" in item) {
Dominique CLAUSE
committed
groupId = typeof(item.group.group_id) !== 'undefined' ? item.group.group_id : '';
groupName = typeof(item.group.group_name) !== 'undefined' ? item.group.group_name : '';
group += ('<div class="ui-autocomplete-field-group ' + groupId + '">' + groupName + '</div>');
$(group).appendTo(ul);
var elem = $("<li class=ui-menu-item-" + first + "></li>" )
Dominique CLAUSE
committed
.append("<a>" + innerHTML + "</a>");
if (item.value == '') {
elem = $("<li class='ui-state-disabled ui-menu-item-" + first + " ui-menu-item'>" + item.label + "</li>" );
}
Dominique CLAUSE
committed
elem.data("item.autocomplete", item).appendTo(ul);
Dominique CLAUSE
committed
Drupal.attachBehaviors(elem);
return elem;
Dominique CLAUSE
committed
};
Dominique CLAUSE
committed
$.ui.autocomplete.prototype._resizeMenu = function() {
var ul = this.menu.element;
ul.outerWidth(Math.max(ul.width("").outerWidth() + 5, this.options.position.of == null ? this.element.outerWidth() : this.options.position.of.outerWidth()));
Dominique CLAUSE
committed
};
Drupal.behaviors.search_autocomplete = {
attach: function(context) {
if (Drupal.settings.search_autocomplete) {
$.each(Drupal.settings.search_autocomplete, function(key, value) {
Dominique CLAUSE
committed
var no_results = Drupal.settings.search_autocomplete[key].no_results;
var all_results = Drupal.settings.search_autocomplete[key].all_results;
$(Drupal.settings.search_autocomplete[key].selector).bind("mouseover", function() {
$(Drupal.settings.search_autocomplete[key].selector).addClass('ui-autocomplete-processed ui-theme-' + Drupal.settings.search_autocomplete[key].theme).autocomplete({
Dominique CLAUSE
committed
minLength: Drupal.settings.search_autocomplete[key].minChars,
source: function(request, response) {
// External URL:
if (Drupal.settings.search_autocomplete[key].type == 'external') {
$.getJSON(Drupal.settings.search_autocomplete[key].datas, { q: request.term }, function (results) {
// Only return the number of values set in the settings.
if (!results.length && no_results) {
Dominique CLAUSE
committed
results = [jQuery.parseJSON(no_results.replace(/\[search-phrase\]/g, '<span class=\\"ui-autocomplete-field-term\\">' + request.term + '</span>'))];
Dominique CLAUSE
committed
} else {
results.slice(0, Drupal.settings.search_autocomplete[key].max_sug);
Dominique CLAUSE
committed
if (all_results) {
results.push(jQuery.parseJSON(all_results.replace(/\[search-phrase\]/g, '<span class=\\"ui-autocomplete-field-term\\">' + request.term + '</span>')));
}
Dominique CLAUSE
committed
}
response(results);
});
}
// Internal URL:
else if (Drupal.settings.search_autocomplete[key].type == 'internal' || Drupal.settings.search_autocomplete[key].type == 'view') {
$.getJSON(Drupal.settings.search_autocomplete[key].datas + request.term, { }, function (results) {
// Only return the number of values set in the settings.
if (!results.length && no_results) {
Dominique CLAUSE
committed
results = [jQuery.parseJSON(no_results.replace(/\[search-phrase\]/g, '<span class=\\"ui-autocomplete-field-term\\">' + request.term + '</span>'))];
Dominique CLAUSE
committed
} else {
results.slice(0, Drupal.settings.search_autocomplete[key].max_sug);
Dominique CLAUSE
committed
if (all_results) {
results.push(jQuery.parseJSON(all_results.replace(/\[search-phrase\]/g, '<span class=\\"ui-autocomplete-field-term\\">' + request.term + '</span>')));
}
Dominique CLAUSE
committed
}
response(results);
});
}
// Static resources:
else if (Drupal.settings.search_autocomplete[key].type == 'static') {
var results = $.ui.autocomplete.filter(Drupal.settings.search_autocomplete[key].datas, request.term);
if (!results.length && no_results) {
Dominique CLAUSE
committed
results = [jQuery.parseJSON(no_results.replace(/\[search-phrase\]/g, '<span class=\\"ui-autocomplete-field-term\\">' + request.term + '</span>'))];
Dominique CLAUSE
committed
} else {
results.slice(0, Drupal.settings.search_autocomplete[key].max_sug);
Dominique CLAUSE
committed
if (all_results) {
results.push(jQuery.parseJSON(all_results.replace(/\[search-phrase\]/g, '<span class=\\"ui-autocomplete-field-term\\">' + request.term + '</span>')));
}
Dominique CLAUSE
committed
response(results);
}
},
open: function(event, ui) {
$(".ui-autocomplete li.ui-menu-item:odd").addClass("ui-menu-item-odd");
$(".ui-autocomplete li.ui-menu-item:even").addClass("ui-menu-item-even");
},
select: function(event, ui) {
if (Drupal.settings.search_autocomplete[key].auto_redirect == 1 && ui.item.link) {
document.location.href = ui.item.link;
} else if (Drupal.settings.search_autocomplete[key].auto_submit == 1 && ui.item.value) {
$(this).val(ui.item.value);
$(this).closest("form").submit();
}
Dominique CLAUSE
committed
// } else {
// event.preventDefault();
// }
Dominique CLAUSE
committed
},
focus: function (event, ui) {
if (ui.item.label === no_results) {
event.preventDefault();
}
},
appendTo: $(Drupal.settings.search_autocomplete[key].selector).parent(),
}).autocomplete("widget").attr("id", "ui-theme-" + Drupal.settings.search_autocomplete[key].theme);
});
$(Drupal.settings.search_autocomplete[key].selector).trigger('mouseover');
});
})(jQuery);