// Based on blog post: https://www.sitepoint.com/how-to-build-your-own-ai-assistant-using-api-ai/ // Source code: https://github.com/sitepoint-editors/Api-AI-Personal-Assistant-Demo/blob/master/index.html. // Demo: https://devdiner.com/demos/barry/ // When ready :) function detectmob() { if( navigator.userAgent.match(/Android/i) || navigator.userAgent.match(/webOS/i) || navigator.userAgent.match(/iPhone/i) || navigator.userAgent.match(/iPad/i) || navigator.userAgent.match(/iPod/i) || navigator.userAgent.match(/BlackBerry/i) || navigator.userAgent.match(/Windows Phone/i) ){ return true; } else { return false; } } jQuery(document).ready(function() { /* * When the user enters text in the text input text field and then the presses Enter key */ jQuery("input.allioc-text").keypress(function(event) { if (event.which == 13) { event.preventDefault(); jQuery(".allioc-conversation-area .allioc-conversation-request").removeClass("allioc-is-active"); var text = jQuery(this).val(); var date = new Date(); var containerId = jQuery(this).closest(".allioc-container").attr('id'); var parts = containerId.split("-"); var sequence = parts[2]; var innerHTML = "
" + escapeTextInput(text) + "
"; if (allioc_script_vars.show_time) { innerHTML += "
" + date.toLocaleTimeString() + "
"; } innerHTML += "
"; if (allioc_script_vars.show_loading) { innerHTML += "
"; } jQuery("#allioc-container-" + sequence + " .allioc-conversation-area").append(innerHTML); jQuery("#allioc-container-" + sequence + " input.allioc-text").val(""); jQuery("#allioc-container-" + sequence + " .allioc-conversation-area") .scrollTop(jQuery("#allioc-container-" + sequence + " .allioc-conversation-area") .prop("scrollHeight")); textQuery(text, sequence); } }); jQuery("#allioc-input-area .allioc-send-button").off('click').on('click', function(e) { if (jQuery("input.allioc-text").val() != '') { jQuery(".allioc-conversation-area .allioc-conversation-request").removeClass("allioc-is-active"); var text = jQuery("input.allioc-text").val(); var date = new Date(); var containerId = jQuery("input.allioc-text").closest(".allioc-container").attr('id'); var parts = containerId.split("-"); var sequence = parts[2]; var innerHTML = "
" + escapeTextInput(text) + "
"; if (allioc_script_vars.show_time) { innerHTML += "
" + date.toLocaleTimeString() + "
"; } innerHTML += "
"; if (allioc_script_vars.show_loading) { innerHTML += "
"; } jQuery("#allioc-container-" + sequence + " .allioc-conversation-area").append(innerHTML); jQuery("#allioc-container-" + sequence + " input.allioc-text").val(""); jQuery("#allioc-container-" + sequence + " .allioc-conversation-area") .scrollTop(jQuery("#allioc-container-" + sequence + " .allioc-conversation-area") .prop("scrollHeight")); textQuery(text, sequence); } }); /* Overlay slide toggle */ jQuery(".allioc-content-overlay .allioc-content-overlay-header").click(function(event){ if (!jQuery(".allioc-content-logo").hasClass("opend")) { // toggle open var container = jQuery(this).siblings(".allioc-content-overlay-container").find(".allioc-container"); // if welcome intent enabled and no conversation exists yet if (jQuery(container).find(".allioc-conversation-bubble-container").length == 0) { var containerId = jQuery(container).attr('id'); var parts = containerId.split("-"); var sequence = parts[2]; welcomeIntent(sequence); } jQuery('.allioc-content-logo').addClass('opend'); jQuery(this).parent().removeClass("allioc-toggle-closed"); jQuery(this).parent().addClass("allioc-toggle-open"); jQuery(this).siblings(".allioc-content-overlay-container").slideToggle("slow", function() {}); } else { // toggle close jQuery('.allioc-content-logo').removeClass('opend'); jQuery(this).parent().removeClass("allioc-toggle-open"); jQuery(this).parent().addClass("allioc-toggle-closed"); jQuery(this).siblings(".allioc-content-overlay-container").slideToggle("slow", function() {}); } }); jQuery('.allioc-content-logo').off('click').on('click', function(e) { jQuery(".allioc-content-overlay .allioc-content-overlay-header").trigger('click'); // jQuery(this).toggleClass('opend'); }); /* * Welcome */ if (allioc_script_vars.enable_welcome_event) { // show welcome intent on first chatbot only if ( jQuery(".allioc-container").length > 0 ) { var self = jQuery(".allioc-content-overlay .allioc-content-overlay-header"); var container = jQuery(self).siblings(".allioc-content-overlay-container").find(".allioc-container"); // if welcome intent enabled and no conversation exists yet if (jQuery(container).find(".allioc-conversation-bubble-container").length == 0) { var containerId = jQuery(container).attr('id'); var parts = containerId.split("-"); var sequence = parts[2]; welcomeIntent(sequence); } jQuery('.allioc-content-logo').addClass('opend'); jQuery(self).parent().removeClass("allioc-toggle-closed"); jQuery(self).parent().addClass("allioc-toggle-open"); } } if (detectmob()) { var h = jQuery(window).height() - jQuery('.allioc-content-overlay-header').outerHeight(); h = h - jQuery('#allioc-input-area').outerHeight(); jQuery('.allioc-content-overlay-container .allioc-conversation-area').css('height', h); } }); /** * Displays welcome intent for a specific chatbot identified by sequence * * @params sequence */ function welcomeIntent(sequence) { var innerHTML = ""; if (allioc_script_vars.show_loading) { innerHTML = "
"; } jQuery("#allioc-container-" + sequence + " .allioc-conversation-area").append(innerHTML); jQuery.ajax({ type : "POST", url : allioc_script_vars.base_url, dataType : "json", data : { security: allioc_script_vars.security, action: "query_text", event :"WELCOME", lang : allioc_script_vars.language, session : allioc_script_vars.session_id, }, success : function(response) { setTimeout(function(){ if (allioc_script_vars.show_loading) { jQuery("#allioc-container-" + sequence + " .allioc-loading").empty(); } prepareResponse(response,sequence); }, allioc_script_vars.response_delay); }, error : function(response) { if (allioc_script_vars.show_loading) { jQuery("#allioc-container-" + sequence + " .allioc-loading").empty(); } textResponse(allioc_script_vars.messages.internal_error, sequence); jQuery("#allioc-container-" + sequence + " .allioc-conversation-area") .scrollTop(jQuery("#allioc-container-" + sequence + " .allioc-conversation-area") .prop("scrollHeight")); } }); } /** * Send Dialogflow query * * @param text * @param sequence * @returns */ function textQuery(text, sequence) { jQuery.ajax({ type : "POST", url : allioc_script_vars.base_url, dataType : "json", data: { security: allioc_script_vars.security, action: "query_text", message: text, lang : allioc_script_vars.language, session: allioc_script_vars.session_id }, success : function(response) { setTimeout(function(){ if (allioc_script_vars.show_loading) { jQuery("#allioc-container-" + sequence + " .allioc-loading").empty(); } prepareResponse(response,sequence); }, allioc_script_vars.response_delay); }, error : function(response) { if (allioc_script_vars.show_loading) { jQuery("#allioc-container-" + sequence + " .allioc-loading").empty(); } textResponse(allioc_script_vars.messages.internal_error, sequence); jQuery("#allioc-container-" + sequence + " .allioc-conversation-area") .scrollTop(jQuery(".allioc-container-" + sequence + " .allioc-conversation-area") .prop("scrollHeight")); } }); } /** * Handle Dialogflow response * * @param response * @param response */ function prepareResponse(response, sequence) { //if (response.status.code == "200" ) { jQuery(window).trigger("allioc_response_success", response); jQuery("#allioc-container-" + sequence + " .allioc-conversation-area .allioc-conversation-response").removeClass("allioc-is-active"); var messages = response.fulfillmentMessages; var numMessages = messages.length; var index = 0; for (index; index 0) { jQuery.each(text.text, function(index, item) { var innerHTML = "
" + item + "
"; if (allioc_script_vars.show_time) { innerHTML += "
" + date.toLocaleTimeString() + "
"; } innerHTML += "
"; jQuery("#allioc-container-" + sequence + " .allioc-conversation-area").append(innerHTML); jQuery("#allioc-container-" + sequence + " .allioc-conversation-area").scrollTop(100000); }); } else { text = allioc_script_vars.messages.internal_error; var innerHTML = "
" + text + "
"; if (allioc_script_vars.show_time) { innerHTML += "
" + date.toLocaleTimeString() + "
"; } innerHTML += "
"; jQuery("#allioc-container-" + sequence + " .allioc-conversation-area").append(innerHTML); jQuery("#allioc-container-" + sequence + " .allioc-conversation-area").scrollTop(100000); } } /** * Displays a image response * * @param imageUrl * @param sequence * @returns */ function imageResponse(imageUrl, sequence) { if (imageUrl === "") { textResponse(allioc_script_vars.messages.internal_error, sequence) } else { // FIXME wait for image to load by creating HTML first var date = new Date(); var innerHTML = "
"; if (allioc_script_vars.show_time) { innerHTML += "
" + date.toLocaleTimeString() + "
"; } innerHTML += "
"; jQuery("#allioc-container-" + sequence + " .allioc-conversation-area").append(innerHTML); } } /** * Card response * * @param title * @param subtitle * @param buttons * @param text * @param postback * @param sequence */ function cardResponse(title, subtitle, buttons, text, postback, sequence) { var html = "
" + title + "
"; html += "
" + subtitle + "
"; // TODO } /** * Quick replies response * * @param title * @param replies * @param sequence */ function quickRepliesResponse(title, replies, sequence) { var html = "
" + title + "
"; var index = 0; for (index; index"; } var date = new Date(); var innerHTML = "
" + html + "
"; if (allioc_script_vars.show_time) { innerHTML += "
" + date.toLocaleTimeString() + "
"; } innerHTML += "
"; jQuery("#allioc-container-" + sequence + " .allioc-conversation-area").append(innerHTML); jQuery("#allioc-container-" + sequence + " .allioc-conversation-area .allioc-is-active .allioc-quick-reply").click(function(event) { event.preventDefault(); jQuery("#allioc-container-" + sequence + " .allioc-conversation-area .allioc-conversation-request").removeClass("allioc-is-active"); var text = jQuery(this).val() var date = new Date(); var innerHTML = "
" + escapeTextInput(text) + "
"; if (allioc_script_vars.show_time) { innerHTML += "
" + date.toLocaleTimeString() + "
"; } if (allioc_script_vars.show_loading) { innerHTML += "
"; } innerHTML += "
"; jQuery("#allioc-container-" + sequence + " .allioc-conversation-area").append(innerHTML); textQuery(text, sequence); }); } /** * Custom payload * * @param payload */ function customPayload(payload, sequence) { } var entityMap = { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''', '/': '/', '`': '`', '=': '=' }; /** * Escapes HTML in text input */ function escapeTextInput(text) { return String(text).replace(/[&<>"'`=\/]/g, function (s) { return entityMap[s]; }); }