/*!
* fst popup search
* http://fanseethemes.com/
*
* Copyright (c) fanseethemes
*
* License: GPL
* https://www.gnu.org/licenses/gpl-3.0.html
*/
(function($){
'use strick';
if($){
var prefix = 'fst-popup-search';
var icons = {
enterIcon : '\
\
\
',
closeIcon: ''
};
var classNames = {
wrapper : prefix+'-wrapper',
firstTab : prefix+'-first-tabindex',
lastTab : prefix+'-last-tabindex',
close : prefix+'-close',
clear : prefix+'-clear',
form : prefix+'-form',
label : prefix+'-label',
overlay : prefix+'-overlay',
btnSubmit: prefix+'-submit',
btnWrapper: prefix+'-btns',
active : prefix+'-active',
};
var TXT = {
placeholderText : 'Search...',
labelText: 'What are you looking for?',
elementNotExit: 'provided element not exist on DOM',
};
var defaultOptions = {
action: '',
method: 'get',
closeIcon: icons.closeIcon,
clearIcon: icons.clearIcon,
enterIcon: icons.enterIcon,
placeholderText: TXT.placeholderText ,
labelText: TXT.labelText
};
/******************************
* Main function
******************************/
$.fn.fstPopupSearch = function( options ){
//Ensure that provided element is exist on DOM
if(0 === $(this).length ){
console.info(TXT.elementNotExist);
return this;
};
// Ensure that provided only one fst popup search exist
if (!$.data(document.body, prefix)) {
$.data(document.body, prefix, true);
$.fn.fstPopupSearch.settings = $.extend( {}, defaultOptions, options);
$.fn.fstPopupSearch.init(this);
};
};
/******************************
* Initialize the plugin
******************************/
$.fn.fstPopupSearch.init = function(ele){
var settings = this.settings;
var $body = $('body');
appendSearchForm();
listenClickEvent();
listenEscKey();
this.enableAccessibility();
/**
* Generate search pop form template
* @returns {strings}
*/
function getSearchFormTemplate(settings){
var labelText = settings.labelText ? '
'+settings.labelText+'
' : '';
return '\
\
\
'+labelText+'\
\
\
';
};
/**
* Append search form on DOM
* @returns {void}
*/
function appendSearchForm(){
var templateSettings = {
action: settings.action,
method: settings.method,
placeholderText: settings.placeholderText,
labelText: settings.labelText
}
var template = getSearchFormTemplate(templateSettings);
!$(`.${classNames.wrapper}`).length && $body.append(template);
};
/**
* Check search is open or not
* @returns {boolean}
*/
function isSearchOpen(){
return $('body').hasClass(classNames.active);
};
/**
* Focus on search input
* @returns {void}
*/
function focusOnSearch(){
setTimeout(function(){
$(`.${classNames.wrapper} input`).focus();
}, 500)
};
/**
* Open the popup search
* @retuns {void}
*/
function openSearch(){
$body.addClass(classNames.active);
focusOnSearch();
}
/**
* Focus search opener button
* @returns {void}
*/
function focusBtnSearchOpener(){
$(ele).focus();
};
/**
* Close the popup search
* @return {void}
*/
function closeSearch (){
$body.removeClass(classNames.active);
focusBtnSearchOpener();
}
/**
* Clear input
* @returns {void}
*/
function clearInput(){
isSearchOpen() && $(`.${classNames.wrapper} input`).val('');
};
/**
* Close popup search on press esc key
* @returns {void}
*/
function listenEscKey(){
$(document).on('keydown', function(e){
if(27 === e.keyCode)
closeSearch();
})
}
/**
* Listen click events
* @return {void}
*/
function listenClickEvent(){
$(ele).on('click', openSearch);
$(`.${classNames.close}`).on('click', closeSearch);
$(`.${classNames.clear}`).on('click', function(e){
e.preventDefault();
clearInput();
});
};
};
/******************************
* Accessibility tab loop
******************************/
$.fn.fstPopupSearch.enableAccessibility = function(){
$(document).on('focus', '.'+classNames.firstTab, function(e){
$(e.target).parents('.'+classNames.wrapper).find(`.${classNames.btnSubmit}`).focus();
});
$(document).on('focus', '.'+classNames.lastTab, function(e){
$(e.target).parents('.'+classNames.wrapper).find(`.${classNames.close}`).focus();
});
};
};
})(window.jQuery || window.$);