Your IP : 216.73.216.224


Current Path : /var/www/html/administrator/components/com_jchat/js/
Upload File :
Current File : /var/www/html/administrator/components/com_jchat/js/bootstrap-interface.js

// Bootstrap interface utility
jQuery(function($) {
	/**
	 * Turn radios into btn-group
	 */
	var container = document.querySelectorAll('.btn-group');
	for (var i = 0; i < container.length; i++) {
		var labels = container[i].querySelectorAll('label');
		for (var j = 0; j < labels.length; j++) {
			labels[j].classList.add('btn');
			var inputValue = $('input[type=radio]', labels[j]).val(); 
			if ((j % 2) == 1 && inputValue !== '') {
				labels[j].classList.add('btn-outline-danger');
			} if ((j % 2) == 1 && inputValue === '') {
				labels[j].classList.add('btn-outline-primary');
			} else {
				labels[j].classList.add('btn-outline-success');
			}
		}
	}

	var btsGrouped = document.querySelectorAll('.btn-group input[checked=checked]');
	for (var i = 0, l = btsGrouped.length; l>i; i++) {
		var self   = btsGrouped[i],
		    attrId = self.id,
		    label = document.querySelector('label[for=' + attrId + ']');
		if (self.parentNode.parentNode.classList.contains('btn-group-reversed')) {
			if (self.value === 0) {
				label.classList.add('active');
				label.classList.add('btn');
				label.classList.add('btn-outline-success');
			} else {
				label.classList.add('active');
				label.classList.add('btn');
				label.classList.add('btn-outline-danger');
			}
		} else {
			if (self.value === 0) {
				label.classList.add('active');
				label.classList.add('btn');
				label.classList.add('btn-outline-danger');
			} else {
				if (self.value === '') {
					label.classList.add('active');
					label.classList.add('btn');
					label.classList.add('btn-outline-primary');
				} else {
					label.classList.add('active');
					label.classList.add('btn');
					label.classList.add('btn-outline-success');
				}
			}
		}
	}
	
	// Perform columns ordering
	$('a[data-ordering-form]').on('click', function(jqEvent){
		let orderingOrder = $(jqEvent.target).attr('data-ordering-order');
		let orderingDirection = $(jqEvent.target).attr('data-ordering-direction');
		let orderingTask = $(jqEvent.target).attr('data-ordering-task');
		Joomla.tableOrdering(orderingOrder, orderingDirection, orderingTask);
		return false;
	});
	
	// Always ensure to reset the other switcher button
	$(document).on('click', "fieldset[data-bs-toggle=buttons] label.btn", function(jqEvent) {
		if(jqEvent.target.nodeName.toUpperCase() == 'INPUT' || $(jqEvent.target).attr('disabled')) {
			return true;
		}
		
		var label = $(jqEvent.target).addClass('active');
		var input = $('input[type=radio]', label);

		var otherLabel = label.parents('fieldset').find("label").not(label);
		if (otherLabel.hasClass('active')) {
			otherLabel.removeClass('active btn-success btn-danger btn-primary');
		}
	});

	// Override the default switcher button colors/class for multiple selection switcher buttons
	var multipleSwitchers = $("div.controls > fieldset > label:nth-child(3)");
	multipleSwitchers.each(function(index, elem){
		var parentContainer = $(elem).parent();
		$('label', parentContainer).removeClass('btn-outline-success btn-outline-danger')
		// We are not in the configuration view
		if($('label:first-child > input', parentContainer).val() == 0) {
			$('label', parentContainer).addClass('btn-outline-success');
			$('label:first-child', parentContainer).addClass('btn-outline-danger').removeClass('btn-outline-success');
		} else {
			$('label', parentContainer).addClass('btn-outline-success');
		}
	});
	
	// Ensure that only input labels with 'No' value will be dangered 
	var doubledSwitchers = $("div.controls > fieldset > label:nth-child(2)");
	doubledSwitchers.each(function(index, elem){
		var inputValue = $('input', elem).val();
		if(inputValue != 0 && inputValue != '' && inputValue != '') {
			$(elem).removeClass('btn-outline-danger').addClass('btn-outline-success');
		}
	});
	
	/**
	 * Enables bootstrap popover
	 */
	[].slice.call(document.querySelectorAll('#updatestatus label.hasPopover, #cpanel span.leftlabel')).map(function (popoverEl) {
		let popoverInstance = new bootstrap.Popover(popoverEl,{
			template : '<div class="popover"><div class="popover-arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>',
			trigger : 'hover',
			placement : 'right',
			html : true
		});
		return popoverInstance;
	});
	
	[].slice.call(document.querySelectorAll('label.hasPopover, button.hasPopover, div.hasPopover, span.hasPopover, img.hasPopover')).map(function (popoverEl) {
		let popoverInstance = new bootstrap.Popover(popoverEl,{
			template : '<div class="popover"><div class="popover-arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>',
			trigger : 'hover',
			placement : 'top',
			html : true
		});
		return popoverInstance;
	});
	
	[].slice.call(document.querySelectorAll('thead a.hasPopover')).map(function (popoverEl) {
		return new bootstrap.Popover(popoverEl,{
			template : '<div class="popover"><div class="popover-arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>',
			trigger : 'hover',
			placement : 'top',
			html : true
		});
	});

	/**
	 * Enables bootstrap tooltip
	 */
	[].slice.call(document.querySelectorAll('label.hasTooltip, img.hasTooltip, a.hasTooltip, *[rel=tooltip], a.page-link')).map(function (tooltipEl) {
		let tooltipInstance = new bootstrap.Tooltip(tooltipEl,{
			trigger : 'hover',
			placement : 'top',
			html : true
		});
		return tooltipInstance;
	});
	[].slice.call(document.querySelectorAll('a.google_translate')).map(function (tooltipEl) {
		let tooltipInstance = new bootstrap.Tooltip(tooltipEl,{
			trigger : 'hover',
			placement : 'top',
			html : true
		});
		return tooltipInstance;
	});
	
	/**
	 * Remove custom select
	 */
	$('table.headerlist select').removeClass('custom-select form-select');

	/**
	 * Remove empty ordering spans
	 */
	$('.order > span').filter(function() {
		var hasChild = !$('a', this).length;
		return hasChild;
	}).remove();
	// Recover the legacy save order button in async way on the next cycle
	setTimeout(function() {
		$('a.saveorder').removeAttr('onclick').removeAttr('style');
	}, 1);

	/**
	 * Remove custom select
	 */ 
	$('table.headerlist select').removeClass('form-select form-control');
	
	/**
	 * Calendars
	 */
	if ($.datepicker) {
		$('input[data-role=calendar]').datepicker({
			dateFormat : 'yy-mm-dd',
			firstDay : 1
		}).prev('span').on('click', function() {
			$(this).datepicker('show');
		});
	}

	/**
	 * Turn requuired class into data-required
	 */
	$('input.required').attr('data-validation', 'required').attr('aria-required', 'true');
	
	// Remove configuration spacer empty div
	$('span.spacer').parent('div.control-label').next('div.controls').remove();
	
	/**
	 * Accordion panels local storage memoize and set open
	 */
	var defaultAccordionObject = {
		'jchat_accordion_cpanel' : 'jchat_stats',
		'jchat_accordion_help' : 'jchat_functionalities_frontend'
	};

	// To store the last clicked dropdown-toggle button
	let lastClickedDropdown = null;

	// Listen for Bootstrap's dropdown events and exclude Joomla dropdown-toggle
	document.querySelectorAll('button.dropdown-toggle').forEach(function (element) {
	    element.addEventListener('show.bs.dropdown', function (targetElement) {
	    	// Set the clicked dropdown button before it triggers collapse
	    	lastClickedDropdown = this;
	    });
	    element.addEventListener('hide.bs.dropdown', function (targetElement) {
	    	// Set the clicked dropdown button before it triggers collapse
	        lastClickedDropdown = this;
	    });
	});
	
	[].slice.call(document.querySelectorAll('div.accordion')).map(function (accordionEl) {
		accordionEl.addEventListener('shown.bs.collapse', function(event) {
			if (!$(event.target).hasClass('card-block')) {
				return;
			}
	
			// Trigger window resize to repaint the chart
			if ($(event.target).hasClass('accordion-chart')) {
				$(window).trigger('resize');
			}
	
			event.stopPropagation();
	
			var localStorageAccordion = $.jStorage.get('jchatAccordionOpened', defaultAccordionObject);
			localStorageAccordion[this.id] = event.target.id;
			$.jStorage.set('jchatAccordionOpened', localStorageAccordion);
	
			// Scroll to accordion header if needed
			if (document.body.scrollHeight > window.innerHeight) {
				$('html, body').animate({
					scrollTop : parseInt($("#" + event.target.id).prev().offset().top) - 185
				}, 500);
			}
			// Add open state
			$(event.target).prev().addClass('opened');
		});
			
		accordionEl.addEventListener('hide.bs.collapse', function(event) {
			// Check if the Joomla dropdown-toggle has been clicked and prevent collapsing 
			if(lastClickedDropdown) {
				lastClickedDropdown = null;
				event.stopPropagation();
				event.preventDefault();
				return false;
			}
			
			if (!$(event.target).hasClass('card-block')) {
				return;
			}
			event.stopPropagation();
			
			// Remove open state
			$(event.target).prev().removeClass('opened');
		});
	});	
		

	$.each($.jStorage.get('jchatAccordionOpened', defaultAccordionObject), function(namespace, element) {
		if ($('#' + element, '#' + namespace).length) {
			$('#' + element, '#' + namespace).addClass('show').prev().addClass('opened');
		}
	});

	/**
	 * Tab panels local storage memoize and set open
	 */
	var defaultTabObject = {
		'tab_configuration' : 'general'
	};
	
	[].slice.call(document.querySelectorAll('#adminForm .nav.nav-tabs')).map(function (tabEl) {
		tabEl.addEventListener('shown.bs.tab', function(event) {
			var localStorageTab = $.jStorage.get('jchatTabOpened', defaultTabObject);
			localStorageTab[this.id] = $(event.target).data('element');
			$.jStorage.set('jchatTabOpened', localStorageTab);
			
			// Add accessibility ARIA
			$('li.nav-item', this).removeAttr('aria-selected').attr('aria-selected', 'false');
			$('li.nav-item', this).removeAttr('tabindex').attr('tabindex', -1);
			$(event.target).parent('li').attr({'aria-selected':'true', 'tabindex':0});
			
			// Ensure that the label input checked will be active
			$("fieldset[data-bs-toggle=buttons] > label.btn > input:checked").each(function(i, element) {
				var parentLabel = $(element).parent('label.btn');
				if (!parentLabel.hasClass('active')) {
					parentLabel.addClass('active');
				}
			});
		});
	});
	
	// Check for a specific tab trigger using url hash
	var hashQueryString = window.location.hash.substr(2);
	if (hashQueryString) {
		var nodeElement = document.querySelector('ul.nav.nav-tabs li a[data-element=' + hashQueryString + ']');
		if(nodeElement) {
			var tabInstance = new bootstrap.Tab(nodeElement);
			tabInstance.show();
		}
	}
	
	if (hashQueryString == 'licensepreferences') {
		var nodeElement = document.querySelector('a[data-element=general]');
		if(nodeElement) {
			var tabInstance = new bootstrap.Tab(nodeElement);
			tabInstance.show();
		}
		$('#params_registration_email-lbl').css('color', 'red');
		$('#params_registration_email').css('border', '2px solid red');
		$('html, body').animate({
            scrollTop: $('#params_registration_email').offset().top - 120
        }, 800);
	}

	$.each($.jStorage.get('jchatTabOpened', defaultTabObject), function(namespace, element) {
		var nodeElement = $('a[data-element=' + element + ']', '#' + namespace).get(0);
		if(nodeElement) {
			var tabInstance = new bootstrap.Tab(nodeElement);
			tabInstance.show();
		}
	});

	// Manage the hide/show of subcontrols for chat rendering mode based on selected modality
	var chatRenderingMode = $('input[name=params\\[rendering_mode\\]]:checked').prop('value');
	if (chatRenderingMode != 'module') {
		$('*.module_rendering_ctrl').parents('div.control-group').hide();
	}
	$('input[name=params\\[rendering_mode\\]]').on('change', function() {
		$('*.module_rendering_ctrl').parents('div.control-group').toggle();
	});
	
	// Manage the hide/show of subcontrols for 3PD integration
	var integrationChosen = $('#params_3pdintegration').val();
	if(integrationChosen != 'easysocial') {
		$('*.easysocial_params').parents('.control-group').hide();
	}
	$('#params_3pdintegration').on('change', function(){
		if($(this).val() == 'easysocial') {
			$('*.easysocial_params').parents('.control-group').slideDown();
		} else {
			$('*.easysocial_params').parents('.control-group').slideUp();
		}
	});
	
	// Manage the hide/show of subcontrols for 3PD integration
	var guestModeChosen = $('#params_guestenabled').val();
	if(guestModeChosen != 2) {
		$('*.meetings_params').parents('.control-group').hide();
	}
	$('#params_guestenabled').on('change', function(){
		if($(this).val() == 2) {
			$('*.meetings_params').parents('.control-group').slideDown();
		} else {
			$('*.meetings_params').parents('.control-group').slideUp();
		}
	});
	
	// Manage the hide/show of subcontrols for enable gelocation
	var geolocationEnabled = $('input[name=params\\[geolocation_enabled\\]]:checked').prop('value');
	if (geolocationEnabled != 1) {
		$('*.geolocation-flags-enabled').parents('div.control-group').hide();
	}
	$('input[name=params\\[geolocation_enabled\\]]').on('change', function() {
		$('*.geolocation-flags-enabled').parents('div.control-group').toggle();
	});
	
	// Initialize Select2 and add optional copier buttons
	if(typeof($.fn.select2) !== 'undefined') {
		var addSelect2Copier = function() {
			$('span.select2-selection__choice__copy').remove();
			var select2Deleter = $('span.select2-selection__choice__remove');
			if(select2Deleter.length) {
				select2Deleter.after('<span class="select2-selection__choice__copy icon-copy" data-role="copyclipboard"></span>');
			}
		}
		
		$('#params_predefined_answers, #participants').select2({
			tags : true,
			placeholder : COM_JCHAT_SELECT2_PLACEHOLDER
		}).on('select2:open',function(e){
			$('span.select2-dropdown').hide();
		}).on('select2:close',function(e){
			if(navigator.clipboard) {
				addSelect2Copier();
			}
		});
		
		setTimeout(function(){
			// Support for copy Clipoard buttons, new API and legacy API
			if(navigator.clipboard) {
				addSelect2Copier();
				$(document).on('click', 'span[data-role=copyclipboard]', function(jqEvent){
					navigator.clipboard.writeText($(this).parent('li.select2-selection__choice').text().substring(1))
					.then(function() {
						let tooltipEl = jqEvent.target;
						let tooltipInstance = new bootstrap.Tooltip(tooltipEl, {
							trigger: 'click',
							placement: 'top',
							title: COM_JCHAT_SELECT2_COPIED
						});
						tooltipInstance.show();
						$(jqEvent.target).css({'color':'#00b300', 'font-weight':'bold'});
						setTimeout(function(){
							$(jqEvent.target).css({'color':'#a8a8a8', 'font-weight':'normal'});
							tooltipInstance.dispose();
							$('#params_predefined_answers').select2('close');
						}, 600);
					})
					.catch(function(err) {
					});
					return false;
				});
			}
		}, 0);
	}
	
	// Support for copy Clipoard buttons, new API and legacy API
	if(navigator.clipboard) {
		$('button[data-role=copyclipboard]').on('click', function(jqEvent){
			navigator.clipboard.writeText($(this).prev('input[data-role=copyclipboard]').val())
			.then(function() {
				var currentText = $(jqEvent.target).text();
				var copiedText = $(jqEvent.target).data('success');
				$(jqEvent.target).text(copiedText).removeClass('btn-success').addClass('btn-warning');
				setTimeout(function(){
					$(jqEvent.target).text(currentText).removeClass('btn-warning').addClass('btn-success');
				}, 2000);
			})
			.catch(function(err) {
			});
			return false;
		});
	} else {
		$('button[data-role=copyclipboard]').on('click', function(jqEvent){
			try {  
				var placeholderInput = $(this).prev('input[data-role=copyclipboard]').get(0).select();  
				// Now that we've selected the text, execute the copy command  
				var successful = document.execCommand('copy');  
				if(successful) {
					var currentText = $(this).text();
					var copiedText = $(this).data('success');
					$(this).text(copiedText).removeClass('btn-success').addClass('btn-warning');
					setTimeout(function(){
						$(jqEvent.target).text(currentText).removeClass('btn-warning').addClass('btn-success');
					}, 2000);
				}
				// Remove the selections - NOTE: Should use
				// removeRange(range) when it is supported  
				window.getSelection().removeAllRanges();  
			} catch(err) {  
			}
			return false;
		});
	}
	
	// Create color picker controls
	$("input.config-colorpicker").after('<div class="colorpicker_preview"><div></div></div>')
	var loadColor = function(elem, colorHex) {
		// Set input HEX color value
		$(elem).val(colorHex);
		$(elem).ColorPickerSetColor(colorHex);

		// Set background color of preview box
		var nextElPreview = $(elem).next('div.colorpicker_preview');
		$('div', nextElPreview).css('background-color', colorHex);
	}

	// Check if ColorPicker plugin is loaded
	if ($.fn.ColorPicker) {
		$("input.config-colorpicker").ColorPicker({
			onSubmit : function(hsb, hex, rgb, el) {
				loadColor(el, '#' + hex);
			}
		});
		$("input.config-colorpicker").each(function(k, elem) {
			var colorValue = $(elem).val();
			loadColor(elem, colorValue);
		});
	}

	$('input.field-media-input').each(function(index, elem){
	    $(elem).css('visibility','hidden');
	});
	// Observe media field image selection change
	$('div.field-media-preview').each(function(index, elem){
		// Create an observer instance for each element to observe
		var observer = new MutationObserver(function(mutations) {
			var image = $('img', elem);
			if(image.length) {
				let relatedInputField = $(elem).next('div').find('input.field-media-input');
				relatedInputField.val(relatedInputField.val().split('#')[0]);
			}
		});
		observer.observe(elem, { childList: true });
	});
	setTimeout(function(){
	    $('input.field-media-input').each(function(index, elem){
    		elem.value = elem.value.split('#')[0];
    		$(elem).css('visibility','visible');
	    }); 
	}, 300);
});

/**
 * Compatibility functions for classical save ordering
 */
JChatSaveOrder = function ( n, task ) {
	JChatCheckAllCheckbox( n, task );
};

JChatCheckAllCheckbox = function ( n, task ) {
	task = task ? task : 'saveorder';

	var j, box;

	for ( j = 0; j <= n; j++ ) {
		box = document.adminForm[ 'cb' + j ];

		if ( box ) {
			box.checked = true;
		} else {
			alert( "You cannot change the order of items, as an item in the list is `Checked Out`" );
			return;
		}
	}

	Joomla.submitform( task );
};