/*! * 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.$);