script.js (253 lines of code) (raw):
/*
* Copyright (C) 2017-present, Facebook, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
function fbmcc_setupCustomerChat() {
const FACEBOOK_URL = "https://www.facebook.com";
var baseURL = "https://www.facebook.com/customer_chat/dialog/?domain=";
var urlParam = encodeURI(
window.location.protocol
+ '//'
+ window.location.hostname
+ (window.location.port ? ':' + window.location.port : '')
);
var customerWindow = window.open(
baseURL + urlParam,
"_blank",
"width=1200,height=800"
);
jQuery(window).on("message", function(e) {
if (e.originalEvent.origin === FACEBOOK_URL) {
$data_json = JSON.parse(e.originalEvent.data);
var data = {
'action' : 'fbmcc_update_options',
'pageID' : fbmcc_sanitizeNumbersOnly($data_json["pageID"]),
'locale' : fbmcc_sanitizeLocale($data_json["locale"]),
'_wpnonce' : ajax_object.nonce,
};
jQuery.ajax({
type: 'POST',
url: ajax_object.ajaxurl,
data: data,
success: function(results) {
jQuery('#fbmcc-page-params').css('display', 'inline-block');
}
});
}
});
}
function fbmcc_sanitizeNumbersOnly( number ) {
if( /^\d+$/.test(number) ) {
return number;
} else {
return '';
}
}
function fbmcc_sanitizeLocale( locale ) {
if( /^[A-Za-z_]{4,5}$/.test(locale) ) {
return locale;
} else {
return '';
}
}
(function($)
{
var ChatPlugin =
{
init: function()
{
this.advancedConfigDeploymentSelectorHandler();
this.advancedConfigMenuHandler();
this.advancedConfigWriteHandler();
this.deactivationFormSubmit();
this.deactivationModalOpenHandler();
this.deactivationModalCloseHandler();
this.deactivationModalFreetextOptionOpenHandler();
},
advancedConfigDeploymentSelectorHandler: function() {
$('#fbmcc-deploymentSelector').change( function () {
if ($(this).val() == 1) {
$('div.fbmcc-deploymentMenu').addClass("hidden");
} else {
$('div.fbmcc-deploymentMenu').removeClass("hidden");
}
})
},
advancedConfigMenuHandler: function() {
$('li .fbmcc-menuParentLink').click(
function () {
if ($(this).parent().find('ul.fbmcc-submenu').css("display") === "none") {
$(this).parent().find('img.fbmcc-chevron').attr("src", $(this).parent().find('img.fbmcc-chevron').attr("src").replace("chevron-right", "chevron-down"));
$(this).parent().find('ul.fbmcc-submenu').slideDown('slow', 'swing');
} else {
$(this).parent().find('img.fbmcc-chevron').attr("src", $(this).parent().find('img.fbmcc-chevron').attr("src").replace("chevron-down", "chevron-right"));
$(this).parent().find('ul.fbmcc-submenu').slideUp('slow', 'swing');
}
}
)
},
advancedConfigWriteHandler: function() {
$('div#fbmcc-page-params ul li .fbmcc-displaySetting').on('change',
function () {
var pages = [];
if ($(this).hasClass("fbmcc-menuParentItem")) {
that = $(this);
$(this).parent().find('ul.fbmcc-submenu').find('input:checkbox').each(function() {
if (that.is(":checked")) {
$(this).prop("checked", true);
} else {
$(this).prop("checked", false);
}
});
} else if ($(this).hasClass("fbmcc-submenuOption")) {
var has_selected_item = false;
var has_unselected_item = false;
$(this).parent().parent().find('input:checkbox.fbmcc-submenuOption').each(function() {
if ($(this).is(":checked")) {
has_selected_item = true;
if ($(this).hasClass("fbmcc-activePageOption")) {
pages.push($(this).attr('id').replace('pageid_', ''));
}
} else {
has_unselected_item = true;
}
});
if (has_selected_item && has_unselected_item) {
$(this).parent().parent().parent().find('input:checkbox.fbmcc-menuParentItem').prop({
checked: false,
indeterminate: true
});
}
}
var data = {
'action' : 'fbmcc_update_options',
'pageTypes' : {
all: $('#fbmcc-deploymentSelector').val() == 1 ? 1 : 0,
category_index : $("#cbShowCategoryIndex").is(":checked") ? 1 : 0,
front_page : $("#cbShowFrontPage").is(":checked") ? 1 : 0,
pages : $("#cbShowPages").is(":checked") ? [] : pages,
pages_all : $("#cbShowPages").is(":checked") ? 1 : 0,
posts : $("#cbShowSinglePostView").is(":checked") ? 1 : 0,
product_pages : $("#cbShowProductPages").is(":checked") ? 1 : 0,
tag_index : $("#cbShowTagsIndex").is(":checked") ? 1 : 0,
},
'_wpnonce' : ajax_object.nonce,
};
if (!$('div.fbmcc-deploymentMenu').hasClass("hidden")) {
$('#fbmcc-saveStatus-error').addClass('hidden');
$('#fbmcc-saveStatus-saved').addClass('hidden');
$('#fbmcc-saveStatus-saving').removeClass('hidden');
$('#fbmcc-saveStatus-saving').delay(2000).fadeOut();
}
jQuery.ajax({
type: 'POST',
url: ajax_object.ajaxurl,
data: data,
error: function(results) {
if (!$('div.fbmcc-deploymentMenu').hasClass("hidden")) {
$('#fbmcc-saveStatus-error').removeClass('hidden');
$('#fbmcc-saveStatus-saved').addClass('hidden');
$('#fbmcc-saveStatus-saving').addClass('hidden');
$('#fbmcc-saveStatus-error').delay(2000).fadeOut();
}
},
success: function(results) {
if (!$('div.fbmcc-deploymentMenu').hasClass("hidden")) {
$('#fbmcc-saveStatus-error').addClass('hidden');
$('#fbmcc-saveStatus-saved').removeClass('hidden');
$('#fbmcc-saveStatus-saving').addClass('hidden');
$('#fbmcc-saveStatus-saved').delay(2000).fadeOut();
}
}
});
}
)
},
deactivationFormSubmit: function() {
$( '#fbmcc-deactivationFormSubmit' ).click(
function () {
$('#fbmcc-deactivationFormSubmit').attr('disabled','disabled');
var reason = "";
if ($('input[name=fbmcc-deactivationReason]:checked', '#fbmcc-deactivationForm').val() == 3) {
reason = $('#fbmcc-deactivationReason-preferredPluginName').val();
} else if ($('input[name=fbmcc-deactivationReason]:checked', '#fbmcc-deactivationForm').val() == 5) {
reason = $('#fbmcc-deactivationReason-other').val();
}
$.ajax(
{
method: 'POST',
url: 'https://www.facebook.com/plugins/chat/wordpress_deactivation/',
data: $.param(
{
page_id: $('#fbmcc-deactivationForm-pageId').val(),
reason: reason,
selected_option: $('input[name=fbmcc-deactivationReason]:checked', '#fbmcc-deactivationForm').val()
}
),
complete: function () {
$('#fbmcc-deactivationFormContainer').addClass('hidden');
$('#fbmcc-deactivationModal-thankYou').removeClass('hidden');
},
error: function () {
$('#fbmcc-deactivationFormContainer').addClass('hidden');
$('#fbmcc-deactivationModal-thankYou').removeClass('hidden');
}
}
);
}
)
},
deactivationModalOpenHandler: function() {
$('table.plugins tr[data-slug=facebook-messenger-customer-chat] span.deactivate a').click(
function (e) {
e.preventDefault();
$( '#fbmcc-deactivationModalOverlay' ).toggleClass( 'fbmcc-deactivationModalOverlay-display' );
}
)
},
deactivationModalCloseHandler: function() {
$('#fbmcc-deactivationModalOverlay').click(
function (e) {
if (
$('#fbmcc-deactivationModalOverlay').hasClass( 'fbmcc-deactivationModalOverlay-display' ) &&
(
! $( e.target ).closest( '#fbmcc-deactivationModalContainer' ).length ||
$( e.target ).closest( '.fbmcc-deactivationModal-closeButton' ).length
)
) {
$( '#fbmcc-deactivationModalOverlay' ).toggleClass( 'fbmcc-deactivationModalOverlay-display' );
return window.location.replace(
$( 'table.plugins tr[data-slug=facebook-messenger-customer-chat] span.deactivate a' ).attr( 'href' )
);
}
}
);
},
deactivationModalFreetextOptionOpenHandler: function() {
$("#fbmcc-deactivationModal ul li input[name='fbmcc-deactivationReason']").click(
function () {
$('div.fbmcc-deactivationReason-commentContainer').removeClass( 'fbmcc-display' );
$( '#fbmcc-deactivationReason-commentContainer'
+ $('input[name=fbmcc-deactivationReason]:checked', '#fbmcc-deactivationForm').val() ).toggleClass( 'fbmcc-display' );
}
)
},
};
$( document ).ready(
function() {
ChatPlugin.init();
$('ul.fbmcc-submenu').each(function() {
var has_selected_item = false;
var has_unselected_item = false;
$(this).find('input:checkbox').each(function() {
if ($(this).is(":checked")) {
has_selected_item = true;
} else {
has_unselected_item = true;
}
});
if (has_selected_item && has_unselected_item) {
$(this).parent().find('input:checkbox.fbmcc-menuParentItem').prop({
checked: false,
indeterminate: true
});
}
})
});
})( jQuery );