: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
* @class elFinder toolbar search button widget.
* @author Dmitry (dio) Levashov
jQuery.fn.elfindersearchbutton = function(cmd) {
return this.each(function() {
disabled = fm.res('class', 'disabled'),
isopts = cmd.options.incsearch || { enable: false },
sTypes = cmd.options.searchTypes,
id = function(name){return fm.namespace + fm.escape(name);},
toolbar= fm.getUI('toolbar'),
btnCls = fm.res('class', 'searchbtn'),
.addClass('ui-widget-content elfinder-button '+btnCls)
.on('click', function(e) {
getMenuOffset = function() {
baseOffset = fmNode.offset(),
buttonOffset = button.offset();
top : buttonOffset.top - baseOffset.top,
maxHeight : fmNode.height() - 40
input.data('inctm') && clearTimeout(input.data('inctm'));
var val = jQuery.trim(input.val()),
from = !jQuery('#' + id('SearchFromAll')).prop('checked'),
mime = jQuery('#' + id('SearchMime')).prop('checked'),
if (jQuery('#' + id('SearchFromVol')).prop('checked')) {
from = fm.root(fm.cwd().hash);
type = typeSet.children('input:checked').val();
cmd.exec(val, from, mime, type).done(function() {
input.data('inctm') && clearTimeout(input.data('inctm'));
input.val('').trigger('blur');
input = jQuery('<input type="text" size="42"/>')
.on('focus', function() {
!button.hasClass('ui-state-active') && fm.getUI().click();
button.addClass('ui-state-active');
opts && opts.css(getMenuOffset()).slideDown(function() {
// Care for on browser window re-active
button.addClass('ui-state-active');
if (!opts.data('infocus')) {
opts.slideUp(function() {
button.removeClass('ui-state-active');
opts.data('infocus', false);
button.removeClass('ui-state-active');
// to avoid fm shortcuts on arrows
.on('keypress', function(e) {
.on('keydown', function(e) {
if (e.keyCode === jQuery.ui.keyCode.ENTER) {
} else if (e.keyCode === jQuery.ui.keyCode.ESCAPE) {
opts, typeSet, cwdReady, inFocus;
isopts.minlen = isopts.minlen || 2;
isopts.wait = isopts.wait || 500;
.attr('title', fm.i18n('incSearchOnly'))
.on('compositionstart', function() {
input.data('composing', true);
.on('compositionend', function() {
input.removeData('composing');
input.trigger('input'); // for IE, edge
.on('input', function() {
if (! input.data('composing')) {
input.data('inctm') && clearTimeout(input.data('inctm'));
input.data('inctm', setTimeout(function() {
if (val.length === 0 || val.length >= isopts.minlen) {
(incVal !== val) && fm.trigger('incsearchstart', {
type: typeSet? typeSet.children('input:checked').val() : 'searchName'
if (val === '' && fm.searchStatus.state > 1 && fm.searchStatus.query) {
input.val(fm.searchStatus.query).trigger('select');
input.on('keydown', function(e) {
input.data('imetm') && clearTimeout(input.data('imetm'));
input.data('composing', true);
input.data('imetm', setTimeout(function() {
input.removeData('composing');
.on('keyup', function(e) {
input.data('imetm') && clearTimeout(input.data('imetm'));
if (input.data('composing')) {
e.keyCode === jQuery.ui.keyCode.ENTER && input.trigger('compositionend');
jQuery('<span class="ui-icon ui-icon-search" title="'+cmd.title+'"></span>')
.on('mousedown', function(e) {
if (button.hasClass('ui-state-active')) {
jQuery('<span class="ui-icon ui-icon-close"></span>')
.on('mousedown', function(e) {
if (input.val() === '' && !button.hasClass('ui-state-active')) {
// wait when button will be added to DOM
fm.bind('toolbarload', function(){
var parent = button.parent();
toolbar.prepend(button.show());
// position icons for ie7
var icon = button.children(fm.direction == 'ltr' ? '.ui-icon-close' : '.ui-icon-search');
left : parseInt(button.width())-icon.outerWidth(true)
.one('init', function() {
fm.getUI('cwd').on('touchstart click', function() {
inFocus && input.trigger('blur');
.one('open', function() {
opts = (fm.api < 2.1)? null : jQuery('<div class="ui-front ui-widget ui-widget-content elfinder-button-menu elfinder-button-search-menu ui-corner-all"></div>')
jQuery('<div class="buttonset"></div>')
jQuery('<input id="'+id('SearchFromCwd')+'" name="serchfrom" type="radio" checked="checked"/><label for="'+id('SearchFromCwd')+'">'+fm.i18n('btnCwd')+'</label>'),
jQuery('<input id="'+id('SearchFromVol')+'" name="serchfrom" type="radio"/><label for="'+id('SearchFromVol')+'">'+fm.i18n('btnVolume')+'</label>'),
jQuery('<input id="'+id('SearchFromAll')+'" name="serchfrom" type="radio"/><label for="'+id('SearchFromAll')+'">'+fm.i18n('btnAll')+'</label>')
jQuery('<div class="buttonset elfinder-search-type"></div>')
jQuery('<input id="'+id('SearchName')+'" name="serchcol" type="radio" checked="checked" value="SearchName"/><label for="'+id('SearchName')+'">'+fm.i18n('btnFileName')+'</label>')
typeSet = opts.find('.elfinder-search-type');
jQuery.each(cmd.options.searchTypes, function(i, v) {
typeSet.append(jQuery('<input id="'+id(i)+'" name="serchcol" type="radio" value="'+fm.escape(i)+'"/><label for="'+id(i)+'">'+fm.i18n(v.name)+'</label>'));
opts.find('div.buttonset').buttonset();
jQuery('#'+id('SearchFromAll')).next('label').attr('title', fm.i18n('searchTarget', fm.i18n('btnAll')));
jQuery.each(sTypes, function(i, v) {
jQuery('#'+id(i)).next('label').attr('title', fm.i18n(v.title));
opts.on('mousedown', 'div.buttonset', function(e){
opts.data('infocus', true);
.on('click', 'input', function(e) {
jQuery.trim(input.val())? search() : input.trigger('focus');
.on('close', function() {
.bind('searchend', function() {
.bind('open parents', function() {
volroot = fm.file(fm.root(fm.cwd().hash));
jQuery.each(fm.parents(fm.cwd().hash), function(i, hash) {
dirs.push(fm.file(hash).name);
jQuery('#'+id('SearchFromCwd')).next('label').attr('title', fm.i18n('searchTarget', dirs.join(fm.option('separator'))));
jQuery('#'+id('SearchFromVol')).next('label').attr('title', fm.i18n('searchTarget', volroot.name));
.bind('open', function() {
.bind('cwdinit', function() {
.bind('cwdrender',function() {
.bind('keydownEsc', function() {
if (incVal && incVal.substr(0, 1) === '/') {
input.trigger('select').trigger('focus');
pattern : 'a b c d e f g h i j k l m n o p q r s t u v w x y z dig0 dig1 dig2 dig3 dig4 dig5 dig6 dig7 dig8 dig9 num0 num1 num2 num3 num4 num5 num6 num7 num8 num9',
description : fm.i18n('firstLetterSearch'),
if (! cwdReady) { return; }
var code = e.originalEvent.keyCode,
key = jQuery.ui.keyCode[(!sel.length || fm.cwdHash2Elm(sel[0]).next('[id]').length)? 'RIGHT' : 'HOME'];
jQuery(document).trigger(jQuery.Event('keydown', { keyCode: key, ctrlKey : false, shiftKey : false, altKey : false, metaKey : false }));
if (code >= 96 && code <= 105) {
val = '/' + String.fromCharCode(code);
.trigger('incsearchstart', { query: val })