(function ($){
'use strict';
var GLOBAL_DATA=window.CandyFAQ;
var i18n=GLOBAL_DATA.i18n;
var ajaxPrefix=GLOBAL_DATA.ajaxPrefix;
var platform=GLOBAL_DATA.platform;
var settings=GLOBAL_DATA.settings;
var info=GLOBAL_DATA.info;
if(!String.prototype.trim){
String.prototype.trim=function (){
return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
};}
if(!Array.prototype.includes){
Object.defineProperty(Array.prototype, 'includes', {
value: function(searchElement, fromIndex){
if(this==null){
throw new TypeError('"this" is null or not defined');
}
var o=Object(this);
var len=o.length >>> 0;
if(len===0){
return false;
}
var n=fromIndex | 0;
var k=Math.max(n >=0 ? n:len - Math.abs(n), 0);
function sameValueZero(x, y){
return x===y||(typeof x==='number'&&typeof y==='number'&&isNaN(x)&&isNaN(y));
}
while (k < len){
if(sameValueZero(o[k], searchElement)){
return true;
}
k++;
}
return false;
}});
}
function debounce(func, wait, immediate){
var timeout;
return function (){
var context=this, args=arguments;
var later=function (){
timeout=null;
if(!immediate){
func.apply(context, args);
}};
var callNow=immediate&&!timeout;
clearTimeout(timeout);
timeout=setTimeout(later, wait);
if(callNow){
func.apply(context, args);
}};}
function throttle(delay, noTrailing, callback, atBegin){
var timeoutId;
var lastExec=0;
if(typeof noTrailing!=='boolean'){
atBegin=callback;
callback=noTrailing;
noTrailing=undefined;
}
function wrapper(){
var elapsed=+new Date() - lastExec;
var args=arguments;
var exec=function _exec(){
lastExec=+new Date();
callback.apply(this, args);
}.bind(this);
function clear(){
timeoutId=undefined;
}
if(atBegin&&!timeoutId){
exec();
}
timeoutId&&clearTimeout(timeoutId);
if(atBegin===undefined&&elapsed > delay){
exec();
}else if(noTrailing!==true){
timeoutId=setTimeout(
atBegin ?
clear :
exec,
atBegin===undefined ?
delay - elapsed :
delay
);
}}
return wrapper;
}
function addAjaxNonce(data){
data['nonce_key']=GLOBAL_DATA.nonce.nonceKey;
data['nonce_value']=GLOBAL_DATA.nonce.nonce;
return data;
}
function trackGoogleAnalytics(category, action, label, value){
if(window.ga&&typeof window.ga==='function'){
ga('send', 'event', category, action, label, value, {
nonInteraction: true
});
}}
var ajaxUrl=GLOBAL_DATA.ajaxUrl;
var $doc=$('html, body');
var $adminBar=$('#wpadminbar');
var adminOffset=$adminBar.length ? $adminBar.height():0;
var viewsCache={};
function trackArticleView(id, title){
if(viewsCache[id]){
return;
}
viewsCache[id]=true;
if(settings['track_article_views']){
trackGoogleAnalytics(
settings['ga_view_category'],
settings['ga_view_action'],
settings['ga_view_label']==='article_title' ? title:id,
settings['ga_view_value']||0
);
}
$.ajax({
method: 'POST',
url: ajaxUrl,
dataType: 'json',
data: addAjaxNonce({
action: ajaxPrefix + '_answer_view',
id: id
})
});
}
function getRatingHandler(options){
return function (e){
e.preventDefault();
var $ratingBtn=$(e.currentTarget);
var $wrap=$ratingBtn.parents('.fn-kscf-answer-extra');
var $faq=$wrap.parents('.fn-kscf-faq');
var $ratingBlock=$ratingBtn.parents('.fn-kscf-rating');
var $ratingItem=$ratingBtn.parents('.fn-kscf-rating-item');
var id=$wrap.data('id');
var title=$wrap.data('title');
var $count=$ratingItem.find('.fn-kscf-rating-count');
var votes=parseInt($count.text().trim()||0);
var showMessageAfterLike=$faq.data('showLikeMsg');
var showMessageAfterDislike=$faq.data('showDislikeMsg');
var feedbackMode=$faq.data('feedbackMode');
if(!id||$ratingBlock.hasClass('kscf-voted')){
return;
}
$ratingBlock.addClass('kscf-voted');
$count.text(++votes);
$ratingItem.removeClass('kscf-rating-item--no-votes');
$.ajax({
method: 'POST',
url: ajaxUrl,
dataType: 'json',
data: addAjaxNonce({
action: options.action,
id: id
})
}).done(function(){
if(options.trackRating){
trackGoogleAnalytics(
settings[options.trackPrefix + 'category'],
settings[options.trackPrefix + 'action'],
settings[options.trackPrefix + 'label']==='article_title' ? title:id,
settings[options.trackPrefix + 'value']||0
);
}
if(options.mode==='like'&&showMessageAfterLike||options.mode==='dislike'&&showMessageAfterDislike){
$ratingBlock.html($('<div class="kscf-rating-message">' + options.messageText + '</div>'));
}
if(feedbackMode===options.mode||feedbackMode==='any'){
addFeedbackForm($wrap);
}});
}}
function addFeedbackForm($wrap){
$wrap.find('.fn-kscf-answer-feedback-container').append($(
'<div class="kscf-feedback-form kscf-feedback-form--no-content fn-kscf-feedback-form">' +
'<div class="kscf-feedback-form__title">' +
i18n['feedback_label'] +
'</div>' +
'<div class="kscf-feedback-form__message">' +
'<textarea class="kscf-feedback-form__message-input fn-kscf-feedback-val" rows="5"></textarea>' +
(i18n['feedback_info_text'] ?
('<div class="kscf-feedback-form__info">' + i18n['feedback_info_text'] + '</div>') :
'') +
'</div>' +
'<div class="kscf-feedback-form__submit">' +
'<a href="#" class="fn-kscf-feedback-submit">' + i18n['feedback_submit_label'] + '</a>' +
'</div>' +
'</div>'
));
}
function setupFeedbackForms(){
$('.fn-kscf-answer-feedback-container').each(function(index, el){
var $feedbackContainer=$(el);
var $wrap=$feedbackContainer.parents('.fn-kscf-answer-extra');
var id=$wrap.data('id');
var title=$wrap.data('title');
function handleFeedbackSubmit(e){
var $btn=$(e.currentTarget);
var $form=$btn.parents('.fn-kscf-feedback-form');
var $content=$form.find('.fn-kscf-feedback-val');
e.preventDefault();
if(!id||!$content.val()){
return;
}
$btn
.text(i18n['feedback_submit_request_label'])
.attr('disabled', 'disabled');
$.ajax({
method: 'POST',
url: ajaxUrl,
dataType: 'json',
data: addAjaxNonce({
action: ajaxPrefix + '_article_feedback',
id: id,
content: $content.val()
})
}).done(function(){
if(settings['track_article_feedback']){
trackGoogleAnalytics(
settings['ga_feedback_category'],
settings['ga_feedback_action'],
settings['ga_feedback_label']==='article_title' ? title:id,
settings['ga_feedback_value']||0
);
}
$feedbackContainer.html('<div class="kscf-feedback-sent-message">' +
i18n['feedback_sent_text'] +
'</div>'
);
});
}
function handleFeedbackType(e){
$feedbackContainer
.find('.fn-kscf-feedback-form')
.toggleClass('kscf-feedback-form--no-content', Boolean($(e.currentTarget).val() < 1));
}
$feedbackContainer.on('click', '.fn-kscf-feedback-submit', handleFeedbackSubmit);
$feedbackContainer.on('input', '.fn-kscf-feedback-val', handleFeedbackType);
});
}
function setupFaq(){
var FAQ_HIDDEN_CLASS='mkb-faq-item-hidden';
var FAQ_SECTION_HIDDEN_CLASS='mkb-faq-section-hidden';
var QUESTION_CLASS='kscf-faq-question';
var QUESTION_OPEN_CLASS='kscf-faq-question--open';
var $faqContainer=$('.fn-kscf-faq');
if(!$faqContainer.length){
return;
}
$faqContainer.each(function(index, item){
var $container=$(item);
var $filterForm=$container.find('.fn-kscf-faq-filter');
var $filter=$filterForm.find('.fn-kscf-faq-filter-input');
var $sections=$container.find('.fn-kscf-faq-category');
var $noResults=$container.find('.fn-kscf-faq-no-results');
var isToggle=Boolean($container.data('toggle'));
var sections=[].map.call($sections, function(section){
var $section=$(section);
var $count=$section.find('.fn-kscf-faq-category-count');
var $items=[].map.call($section.find('.fn-kscf-faq-item'), function(item){
var $item=$(item)
return {
$el: $item,
question: $item.find('.fn-kb-faq-question').text().trim().toLowerCase(),
answer: $item.find('.fn-kscf-faq-answer').text().trim().toLowerCase(),
isVisible: true
};})
return {
$el: $section,
$countEl: $count.length ? $count:null,
items: $items,
visible: [].map.call($items, function(item){ return $(item) }),
hidden: []
}});
var currentFilter;
function getRange(from, to){
from=parseInt(from);
to=parseInt(to);
if(from < 0||to < 0||to < from){
return [];
}else{
var result=[];
for (; from <=to; from++){
result.push(from);
}
return result;
}}
function numbersPoolReducer(acc, item){
item=item.trim();
if(!item){
return acc;
}
return acc.concat(item.indexOf('-')!==-1 ? getRange.apply(this, item.split('-')):parseInt(item));
}
function getNumbersPool(stringValue){
return stringValue.trim().split(',').reduce(numbersPoolReducer, [])
}
var plurals=null;
function getPluralByCount(count){
if(!settings['faq_enable_advanced_plurals']){
return count===1 ? i18n['question']:i18n['questions'];
}
if(!plurals){
plurals={
singularNumbers: getNumbersPool(settings['questions_singular_numbers']),
plural1stNumbers: getNumbersPool(settings['questions_pl1_numbers']),
plural2ndNumbers: getNumbersPool(settings['questions_pl2_numbers'])
};}
if(count===1||(plurals.singularNumbers.length&&plurals.singularNumbers.includes(count))){
return i18n['question'];
}else if(plurals.plural2ndNumbers.length&&plurals.plural2ndNumbers.includes(count)){
return i18n['questions_p2'];
}else if(plurals.plural1stNumbers.length&&!plurals.plural2ndNumbers.length&&!plurals.plural1stNumbers.includes(count)){
return i18n['questions_p2'];
}else{
return i18n['questions'];
}}
function updateFilter(visCheck){
visCheck=visCheck||checkVisibility;
var totalVisible=0;
sections.forEach(function(section){
section.visible=[];
section.hidden=[];
section.items.forEach(function(item){
section[(item.isVisible=visCheck(item)) ? 'visible':'hidden'].push(item);
});
totalVisible +=section.visible.length
});
$noResults.toggleClass('ks-hidden', totalVisible > 0);
sections.forEach(function(section){
section.visible.forEach(function(item){
item.$el.removeClass(FAQ_HIDDEN_CLASS)
})
section.hidden.forEach(function(item){
item.$el.addClass(FAQ_HIDDEN_CLASS)
})
section.$countEl&&section.$countEl.html(section.visible.length +
' ' + (getPluralByCount(section.visible.length))
)
section.$el.toggleClass(FAQ_SECTION_HIDDEN_CLASS, !section.visible.length)
section.visible=[]
section.hidden=[]
})
if(settings['faq_filter_open_single']&&totalVisible===1){
var $onlyItem=$container.find('.fn-kscf-faq-item:not(.' + FAQ_HIDDEN_CLASS + ')')
if($onlyItem.length&&!$onlyItem.hasClass(QUESTION_OPEN_CLASS)){
openAnswer($onlyItem)
}}
}
var resetFilter=updateFilter.bind(this, function(){ return true })
function checkVisibility(item){
return item.question.indexOf(currentFilter)!==-1||item.answer.indexOf(currentFilter)!==-1
}
function handleFilterChange(e){
var needle=(e.currentTarget.value||'').trim();
if(needle.length < 3){
$filterForm.addClass('kscf-faq-filter--empty')
currentFilter='';
resetFilter();
$filter.focus()
return
}
$filterForm.removeClass('kscf-faq-filter--empty')
currentFilter=needle.toLowerCase();
updateFilter()
}
function handleFilterClear(e){
e.preventDefault()
$filter.val('').trigger('input')
}
if($filterForm.length){
$container.on('input', '.fn-kscf-faq-filter-input', handleFilterChange);
$container.on('click', '.fn-kscf-faq-filter-clear', handleFilterClear);
}
var OPEN_SPEED=$container.data('anim')==='slow' ? 400:100;
function getMaxHeight(el){
return Array.prototype.reduce.call(el.childNodes, function(store, current){
return store + (current.offsetHeight||0);
}, 0)
}
function openAnswer($item, noTracking, noToggle){
if($item.hasClass(QUESTION_OPEN_CLASS)){
return;
}
var $answer=$item.find('.fn-kscf-faq-answer');
var answerEl=$answer.get(0);
var maxHeight=getMaxHeight(answerEl);
var id=$item.data('id');
var title=$item.data('title');
if(isToggle&&!noToggle){
sections.forEach(function(section){
section.items.forEach(function(item){
closeAnswer(item.$el)
});
});
if(settings['faq_scroll_to_item']){
setTimeout(function(){
$('html, body').animate({
scrollTop: $item.offset().top + parseInt(settings['faq_scroll_offset'])
}, 300);
}, OPEN_SPEED + 150)
}}
$answer.animate({maxHeight: maxHeight}, OPEN_SPEED, 'swing', function(){
$answer.css('max-height', 'none');
$item.addClass(QUESTION_OPEN_CLASS)
});
!noTracking&&trackArticleView(id, title);
}
function closeAnswer($item){
if(!$item.hasClass(QUESTION_OPEN_CLASS)){
return;
}
var $answer=$item.find('.fn-kscf-faq-answer');
var answerEl=$answer.get(0);
var maxHeight=getMaxHeight(answerEl);
$answer.css('max-height', maxHeight);
$answer.animate({maxHeight: 0}, OPEN_SPEED, 'swing', function(){
$item.removeClass(QUESTION_OPEN_CLASS)
})
}
function handleQuestionClick (e){
e.preventDefault();
var $link=$(e.currentTarget);
var $item=$link.parent();
if($item.hasClass(QUESTION_OPEN_CLASS)){
closeAnswer($item);
}else{
openAnswer($item);
}}
function handleToggleAllClick (e){
e.preventDefault();
var $link=$(e.currentTarget);
var isOpen=$link.hasClass('kscf-faq-toggle-all__link--open')
sections.forEach(function(section){
section.items.forEach(function(item){
isOpen ? closeAnswer(item.$el):openAnswer(item.$el, true, true)
});
});
$link.toggleClass('kscf-faq-toggle-all__link--open')
}
$container.on('click', '.fn-kscf-faq-item-link', handleQuestionClick)
$container.on('click', '.fn-kscf-faq-toggle-all', handleToggleAllClick)
});
}
function init(){
var $body=$('body');
$adminBar=$('#wpadminbar');
adminOffset=$adminBar.length ? $adminBar.height():0;
$body.on('click', '.fn-kscf-like', getRatingHandler({
mode: 'like',
action: ajaxPrefix + '_article_like',
trackRating: settings['track_article_likes'],
trackPrefix: 'ga_like_',
showMessage: settings['show_like_message'],
messageText: i18n['like_message_text']
}));
$body.on('click', '.fn-kscf-dislike', getRatingHandler({
mode: 'dislike',
action: ajaxPrefix + '_article_dislike',
trackRating: settings['track_article_dislikes'],
trackPrefix: 'ga_dislike_',
showMessage: settings['show_dislike_message'],
messageText: i18n['dislike_message_text']
}));
setupFeedbackForms();
setupFaq();
}
$(document).ready(init);
})(jQuery);