(function() { 'use strict'; var weechat = angular.module('weechat'); weechat.directive('plugin', ['$rootScope', 'settings', function($rootScope, settings) { /* * Plugin directive * Shows additional plugin content */ return { templateUrl: 'directives/plugin.html', scope: { plugin: '=data' }, controller: ['$scope', function($scope) { $scope.displayedContent = ""; // Auto-display embedded content only if it isn't NSFW $scope.plugin.visible = !settings.noembed && !$scope.plugin.nsfw; // user-accessible hash key that is a valid CSS class name $scope.plugin.className = "embed_" + $scope.plugin.$$hashKey.replace(':','_'); $scope.plugin.getElement = function() { return document.querySelector("." + $scope.plugin.className); }; $scope.hideContent = function() { $scope.plugin.visible = false; }; $scope.showContent = function(automated) { /* * Shows the plugin content. * displayedContent is bound to the DOM. * Actual plugin content is only fetched when * content is shown. */ var embed = $scope.plugin.getElement(); // If the plugin is asynchronous / lazy, execute it now and let it insert itself // TODO store the result between channel switches if ($scope.plugin.content instanceof Function){ // Don't rerun if the result is already there if (!embed || embed.innerHTML === "") { // if we're autoshowing, the element doesn't exist yet, and we need // to do this async (wrapped in a setTimeout) setTimeout(function() { $scope.plugin.content(); }); } } else { $scope.displayedContent = $scope.plugin.content; } $scope.plugin.visible = true; // Scroll embed content into view var scroll; if (automated) { var wasBottom = $rootScope.bufferBottom; scroll = function() { $rootScope.updateBufferBottom(wasBottom); }; } else { scroll = function() { if (embed && embed.scrollIntoViewIfNeeded !== undefined) { embed.scrollIntoViewIfNeeded(); $rootScope.updateBufferBottom(); } }; } setTimeout(scroll, 500); }; if ($scope.plugin.visible) { $scope.showContent(true); } }] }; }]); })();