(function ($) { 'use strict'; $.extend(true, $.trumbowyg, { langs: { // jshint camelcase:false en: { giphy: 'Insert GIF', }, fr: { giphy: 'Insérer un GIF', }, // jshint camelcase:true } }); var giphyLogo = ''; var CANCEL_EVENT = 'tbwcancel'; // Throttle helper function trumbowygThrottle(callback, delay) { var last; var timer; return function () { var context = this; var now = +new Date(); var args = arguments; if (last && now < last + delay) { clearTimeout(timer); timer = setTimeout(function () { last = now; callback.apply(context, args); }, delay); } else { last = now; callback.apply(context, args); } }; } // Fills modal with response gifs function renderGifs(response, $giphyModal, trumbowyg, mustEmpty) { var width = ($giphyModal.width() - 20) / 3; var html = response.data .filter(function (gifData) { return gifData.images.downsized.url !== ''; }) .map(function (gifData) { var image = gifData.images.downsized, imageRatio = image.height / image.width; return '
'; }) .join('') ; if (mustEmpty === true) { if (html.length === 0) { if ($('.' + trumbowyg.o.prefix + 'giphy-no-result', $giphyModal).length > 0) { return; } html = ''; } $giphyModal.empty(); } $giphyModal.append(html); $('img', $giphyModal).on('click', function () { trumbowyg.restoreRange(); trumbowyg.execCmd('insertImage', $(this).attr('src'), false, true); $('img', $giphyModal).off(); trumbowyg.closeModal(); }); } var defaultOptions = { rating: 'g', apiKey: null, throttleDelay: 300, noResultGifUrl: 'https://media.giphy.com/media/2Faz9FbRzmwxY0pZS/giphy.gif' }; // Add dropdown with font sizes $.extend(true, $.trumbowyg, { plugins: { giphy: { init: function (trumbowyg) { trumbowyg.o.plugins.giphy = $.extend({}, defaultOptions, trumbowyg.o.plugins.giphy || {} ); trumbowyg.addBtnDef('giphy', { fn: function() { if (trumbowyg.o.plugins.giphy.apiKey === null) { throw new Error('You must set a Giphy API Key'); } var BASE_URL = 'https://api.giphy.com/v1/gifs/search?api_key=' + trumbowyg.o.plugins.giphy.apiKey + '&rating=' + trumbowyg.o.plugins.giphy.rating, DEFAULT_URL = BASE_URL.replace('/search', '/trending'); var previousAjaxCall = {abort: function () {}}; var prefix = trumbowyg.o.prefix; // Create and open the modal var searchInput = '', closeButton = '', poweredByGiphy = '
Powered by' + giphyLogo + '
', giphyModalHtml = searchInput + closeButton + poweredByGiphy + '
'; trumbowyg .openModal(null, giphyModalHtml, false) .one(CANCEL_EVENT, function () { try { previousAjaxCall.abort(); } catch (e) {} trumbowyg.closeModal(); }); var $giphyInput = $('.' + prefix + 'giphy-search'), $giphyClose = $('.' + prefix + 'giphy-close'), $giphyModal = $('.' + prefix + 'giphy-modal'); var ajaxError = function () { if (!navigator.onLine && !$('.' + prefix + 'giphy-offline', $giphyModal).length) { $giphyModal.empty(); $giphyModal.append('

You are offline

'); } }; // Load trending gifs as default $.ajax({ url: DEFAULT_URL, dataType: 'json', success: function(response) { renderGifs(response, $giphyModal, trumbowyg, true); }, error: ajaxError }); var searchGifsOnInput = function () { var query = $giphyInput.val(); if (query.length === 0) { return; } try { previousAjaxCall.abort(); } catch (e) {} previousAjaxCall = $.ajax({ url: BASE_URL + '&q=' + encodeURIComponent(query), dataType: 'json', success: function(response) { renderGifs(response, $giphyModal, trumbowyg, true); }, error: ajaxError }); }; var throttledInputRequest = trumbowygThrottle(searchGifsOnInput, trumbowyg.o.plugins.giphy.throttleDelay); $giphyInput.on('input', throttledInputRequest); $giphyInput.focus(); $giphyClose.one('click', function() { $giphyModal.trigger(CANCEL_EVENT); }); }, }); } } } }); })(jQuery);