241 lines
7.4 KiB
JavaScript
241 lines
7.4 KiB
JavaScript
/**
|
|
* True when other tabs are being automatically clicked
|
|
*
|
|
* @type {boolean}
|
|
*
|
|
*/
|
|
var clickLanguageTabActive = false;
|
|
|
|
/**
|
|
* True after document.ready language tab events have been added
|
|
*
|
|
* @type {boolean}
|
|
*
|
|
*/
|
|
var languageTabsReady = false;
|
|
|
|
/**
|
|
* Queue of selectors for language tabs to click on document ready
|
|
*
|
|
* @type {*[]}
|
|
*
|
|
*/
|
|
var languageTabsClickOnReady = [];
|
|
|
|
/**
|
|
* Event called when language tab is double-clicked
|
|
*
|
|
* @param e
|
|
*
|
|
*/
|
|
function dblclickLanguageTab(e) {
|
|
if(!languageTabsReady) return;
|
|
if(clickLanguageTabActive) return;
|
|
clickLanguageTabActive = true;
|
|
var $tab = $(this);
|
|
var langID = $tab.attr('data-lang');
|
|
var $tabs = $tab.closest('form').find('a.langTab' + langID).not($tab);
|
|
$tab.trigger('click');
|
|
$tabs.trigger('click');
|
|
$tabs.effect('highlight', 250);
|
|
setTimeout(function() {
|
|
clickLanguageTabActive = false;
|
|
}, 250);
|
|
var cfg = ProcessWire.config.LanguageTabs;
|
|
jQuery.cookie('langTabsDC', langID + '-' + cfg.requestId);
|
|
}
|
|
|
|
/**
|
|
* Establish tabs for all ".langTabs" elements in the given element
|
|
*
|
|
* @param $form
|
|
*
|
|
*/
|
|
function setupLanguageTabs($form) {
|
|
var $langTabs;
|
|
var cfg = ProcessWire.config.LanguageTabs;
|
|
if($form.hasClass('langTabs')) $langTabs = $form;
|
|
else $langTabs = $form.find('.langTabs');
|
|
$langTabs.each(function() {
|
|
var $this = $(this);
|
|
if($this.hasClass('langTabsInit') || $this.hasClass('ui-tabs')) return;
|
|
var $inputfield = $this.closest('.Inputfield');
|
|
var $content = $inputfield.children('.InputfieldContent');
|
|
if(!$content.hasClass('langTabsContainer')) {
|
|
if($inputfield.find('.langTabsContainer').length == 0) $content.addClass('langTabsContainer');
|
|
}
|
|
if(cfg.jQueryUI) $this.tabs({active: cfg.activeTab});
|
|
$this.addClass('langTabsInit');
|
|
if($inputfield.length) $inputfield.addClass('hasLangTabs');
|
|
var $parent = $this.parent('.InputfieldContent');
|
|
if($parent.length) {
|
|
var $header = $parent.prev('.InputfieldHeader');
|
|
if($header.length && !$header.children('.langTabsToggle').length) {
|
|
var $span = $("<span></span>")
|
|
.attr('title', cfg.labelOpen)
|
|
.attr('class', 'langTabsToggle')
|
|
.append("<i class='fa fa-folder-o'></i>");
|
|
$header.append($span);
|
|
}
|
|
}
|
|
|
|
var $links = $this.find('a.langTabLink');
|
|
var timeout = null;
|
|
var $note = $parent.find('.langTabsNote');
|
|
|
|
if(!$links.length) {
|
|
$links = $this.find('a[data-lang]'); // fallback if missing langTabLink class
|
|
if(!$links.length) $links = $this.find('a');
|
|
$links.addClass('langTabLink');
|
|
}
|
|
|
|
$links.on('mouseover', function() {
|
|
if(timeout) clearTimeout(timeout);
|
|
if($parent.width() < 500) return;
|
|
timeout = setTimeout(function() { $note.fadeIn('fast'); }, 250);
|
|
}).on('mouseout', function() {
|
|
if(timeout) clearTimeout(timeout);
|
|
if($parent.width() < 500) return;
|
|
timeout = setTimeout(function() { $note.fadeOut('fast'); }, 250);
|
|
}).on('click', function() {
|
|
var $a = $(this);
|
|
var $items = $a.closest('ul').siblings('.LanguageSupport');
|
|
var $closeItem = $items.filter('.LanguageSupportCurrent');
|
|
var $openItem = $items.filter($a.attr('href'));
|
|
if(languageTabsReady && $closeItem.attr('id') == $openItem.attr('id')) {
|
|
$a.trigger('dblclicklangtab');
|
|
} else {
|
|
$closeItem.removeClass('LanguageSupportCurrent');
|
|
$openItem.addClass('LanguageSupportCurrent');
|
|
$a.trigger('clicklangtab', [ $openItem, $closeItem ]);
|
|
}
|
|
// uikit tab also requires the following
|
|
var $ukTab = $a.closest('ul.uk-tab');
|
|
if($ukTab.length) {
|
|
$ukTab.find('.uk-active').removeClass('uk-active');
|
|
$a.closest('li').addClass('uk-active');
|
|
}
|
|
});
|
|
|
|
if(!cfg.jQueryUI) {
|
|
$links.eq(cfg.activeTab).trigger('click');
|
|
}
|
|
});
|
|
|
|
var value = jQuery.cookie('langTabsDC'); // DC=DoubleClick
|
|
if(value && value.indexOf('-' + cfg.requestId) > 0) {
|
|
value = value.split('-'); // i.e. 123-ProcessPageEdit456
|
|
var languageId = value[0];
|
|
$('a.langTab' + languageId, $form).trigger('click');
|
|
if(!languageTabsReady) {
|
|
languageTabsClickOnReady.push('a.langTab' + languageId);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Click event that toggles language tabs on/off
|
|
*
|
|
* @returns {boolean}
|
|
*
|
|
*/
|
|
function toggleLanguageTabs() {
|
|
var $this = $(this);
|
|
var $header = $this.closest('.InputfieldHeader');
|
|
var $content = $header.next('.InputfieldContent');
|
|
var $inputfield = $header.parent('.Inputfield');
|
|
var $langTabs = $content.children('.langTabs');
|
|
var $ul = $langTabs.children('ul');
|
|
var cfg = ProcessWire.config.LanguageTabs;
|
|
|
|
clickLanguageTabActive = true;
|
|
|
|
if($content.hasClass('langTabsContainer')) {
|
|
$ul.find('.langTabLastActive').removeClass('langTabLastActive');
|
|
if(cfg.liActiveClass) $ul.find('.' + cfg.liActiveClass).addClass('langTabLastActive');
|
|
$ul.find('a').trigger('click'); // activate all (i.e. for CKEditor)
|
|
$content.removeClass('langTabsContainer');
|
|
$inputfield.removeClass('hasLangTabs').addClass('langTabsOff');
|
|
$this.addClass('langTabsOff');
|
|
if(cfg.jQueryUI) $langTabs.tabs('destroy');
|
|
$ul.hide();
|
|
$this.attr("title", ProcessWire.config.LanguageTabs.labelClose)
|
|
.find('i').removeClass("fa-folder-o").addClass("fa-folder-open-o");
|
|
} else {
|
|
$content.addClass('langTabsContainer');
|
|
$inputfield.addClass('hasLangTabs').removeClass('langTabsOff');
|
|
$this.removeClass('langTabsOff');
|
|
if(cfg.jQueryUI) $langTabs.tabs();
|
|
$ul.show();
|
|
$(this).attr("title", cfg.labelOpen).find('i').addClass("fa-folder-o").removeClass("fa-folder-open-o");
|
|
$ul.find('.langTabLastActive').removeClass('langTabLastActive').children('a').trigger('click');
|
|
}
|
|
|
|
clickLanguageTabActive = false;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Hide all language tab inputs except for default
|
|
*
|
|
* For cases where all inputs are shown rather than tabs (like page name).
|
|
*
|
|
*/
|
|
function hideLanguageTabs() {
|
|
|
|
$(".InputfieldContent").each(function() {
|
|
var n = 0;
|
|
$(this).children('.LanguageSupport').each(function() {
|
|
if(++n == 1) {
|
|
$(this).closest('.Inputfield').addClass('hadLanguageSupport');
|
|
return;
|
|
}
|
|
$(this).addClass('langTabsHidden');
|
|
});
|
|
});
|
|
|
|
// make sure first tab is clicked
|
|
var $tab = $(".langTabs").find('li').eq(0);
|
|
var cfg = ProcessWire.config.LanguageTabs;
|
|
if(cfg.liActiveClass && !$tab.hasClass(cfg.liActiveClass)) $tab.find('a').trigger('click');
|
|
|
|
// hide the tab toggler
|
|
$(".langTabsToggle, .LanguageSupportLabel:visible, .langTabs > ul").addClass('langTabsHidden');
|
|
$(".hasLangTabs").removeClass("hasLangTabs").addClass("hadLangTabs");
|
|
}
|
|
|
|
/**
|
|
* The opposite of the hideLanguageTabs() function
|
|
*
|
|
*/
|
|
function unhideLanguageTabs() {
|
|
// un-hide the previously hidden language tabs
|
|
$('.langTabsHidden').removeClass('langTabsHidden');
|
|
$('.hadLangTabs').removeClass('hadLangTabs').addClass('hasLangTabs');
|
|
$('.hadLanguageSupport').removeClass('hadLanguageSupport'); // just .Inputfield with open inputs
|
|
}
|
|
|
|
/**
|
|
* document.ready
|
|
*
|
|
*/
|
|
jQuery(document).ready(function($) {
|
|
$(document).on('click', '.langTabsToggle', toggleLanguageTabs);
|
|
$(document).on('dblclicklangtab', 'a.langTabLink', dblclickLanguageTab);
|
|
$(document).on('reloaded', '.Inputfield', function() {
|
|
var $inputfield = $(this);
|
|
setTimeout(function() {
|
|
setupLanguageTabs($inputfield);
|
|
}, 100);
|
|
});
|
|
$(document).on('AjaxUploadDone', '.InputfieldHasFileList .InputfieldFileList', function() {
|
|
setupLanguageTabs($(this));
|
|
});
|
|
for(var n = 0; n < languageTabsClickOnReady.length; n++) {
|
|
var selector = languageTabsClickOnReady[n];
|
|
$(selector).trigger('click');
|
|
}
|
|
languageTabsClickOnReady = [];
|
|
languageTabsReady = true;
|
|
});
|