' ) );
// Possible messages:
// ext-uls-webfonts-select-for-ui-info
// ext-uls-webfonts-select-for-content-info
$fontLabel.append( $( '' )
.attr( 'data-i18n', 'ext-uls-webfonts-select-for-' + target + '-info' ) );
},
/**
* i18n this settings panel
*/
i18n: function () {
this.$template.i18n();
this.$template.find( '#ui-font-selector-label strong' )
.text( $.i18n( 'ext-uls-webfonts-select-for', $.uls.data.getAutonym( this.uiLanguage ) ) );
this.$template.find( '#content-font-selector-label strong' )
.text( $.i18n( 'ext-uls-webfonts-select-for', $.uls.data.getAutonym( this.contentLanguage ) ) );
},
/**
* Prepare the font selector for UI language.
*/
prepareUIFonts: function () {
if ( this.uiLanguage === this.contentLanguage ) {
this.$template.find( 'div.uls-ui-fonts' ).hide();
return;
}
this.prepareFontSelector( 'ui' );
},
/**
* Prepare the font selector for UI language.
*/
prepareContentFonts: function () {
this.prepareFontSelector( 'content' );
},
/**
* Enable the apply button.
* Useful in many places when something changes.
*/
enableApplyButton: function () {
this.$template.find( '#uls-displaysettings-apply' ).removeAttr( 'disabled' );
},
/**
* Register general event listeners
*/
listen: function () {
var displaySettings = this,
$contentFontSelector = this.$template.find( '#content-font-selector' ),
$uiFontSelector = this.$template.find( '#ui-font-selector' ),
oldFont = $uiFontSelector.find( 'option:selected' ).val(),
$tabButtons = displaySettings.$template.find( '.uls-display-settings-tab-switcher button' );
// TODO all these repeated selectors can be placed in object constructor.
displaySettings.$template.find( '#uls-displaysettings-apply' ).on( 'click', function () {
displaySettings.apply();
} );
displaySettings.$template.find( 'button.uls-display-settings-cancel' ).on( 'click', function () {
mw.webfonts.preferences.setFont( displaySettings.contentLanguage, oldFont );
if ( displaySettings.$webfonts ) {
displaySettings.$webfonts.refresh();
}
displaySettings.$template.find( 'div.uls-ui-languages button.button' ).each( function () {
var $button = $( this );
if ( $button.attr( 'lang' ) === displaySettings.contentLanguage ) {
$button.addClass( 'down' );
} else {
$button.removeClass( 'down' );
}
} );
displaySettings.close();
} );
displaySettings.$template.find( '#webfonts-enable-checkbox' ).on( 'click', function () {
var $fontSelectors = displaySettings.$template.find(
'#uls-display-settings-font-selectors'
);
displaySettings.enableApplyButton();
if ( this.checked ) {
$fontSelectors.removeClass( 'hide' );
mw.webfonts.preferences.enable();
mw.webfonts.setup();
displaySettings.$webfonts = $( 'body' ).data( 'webfonts' );
$contentFontSelector.removeAttr( 'disabled' );
$uiFontSelector.prop( 'disabled', false );
displaySettings.prepareContentFonts();
displaySettings.prepareUIFonts();
displaySettings.i18n();
displaySettings.$webfonts.apply( $uiFontSelector.find( 'option:selected' ) );
displaySettings.$webfonts.refresh();
} else {
$fontSelectors.addClass( 'hide' );
mw.webfonts.preferences.disable();
mw.webfonts.preferences.setFont( displaySettings.uiLanguage, 'system' );
displaySettings.$webfonts.refresh();
$contentFontSelector.prop( 'disabled', true );
$uiFontSelector.prop( 'disabled', true );
displaySettings.$webfonts.reset();
}
} );
$uiFontSelector.on( 'change', function () {
displaySettings.enableApplyButton();
mw.webfonts.preferences.setFont( displaySettings.uiLanguage,
$( this ).find( 'option:selected' ).val()
);
displaySettings.$webfonts.refresh();
} );
$contentFontSelector.on( 'change', function () {
displaySettings.enableApplyButton();
mw.webfonts.preferences.setFont( displaySettings.contentLanguage,
$( this ).find( 'option:selected' ).val()
);
displaySettings.$webfonts.refresh();
} );
$tabButtons.on( 'click', function () {
var scrollPosition,
panelHeight, panelTop, panelBottom,
padding,
$window,
windowHeight,
windowScrollTop,
windowBottom,
$button = $( this );
if ( $button.hasClass( 'down' ) ) {
return;
}
displaySettings.$template.find( '.ext-uls-sub-panel' ).each( function () {
var $subPanel = $( this );
if ( $subPanel.hasClass( $button.attr( 'id' ) ) ) {
$subPanel.removeClass( 'hide' );
} else {
$subPanel.addClass( 'hide' );
}
} );
$tabButtons.filter( '.down' ).removeClass( 'down');
$button.addClass( 'down' );
padding = 10;
$window = $( window );
windowHeight = $window.height();
windowScrollTop = $window.scrollTop();
windowBottom = windowScrollTop + windowHeight;
panelHeight = displaySettings.$parent.$window.height();
panelTop = displaySettings.$parent.$window.offset().top;
panelBottom = panelTop + panelHeight;
// If the ULS panel is out of the viewport,
// scroll the window to show it
if ( ( panelTop < windowScrollTop ) || ( panelBottom > windowBottom ) ) {
if ( panelHeight > windowHeight ) {
// Scroll to show as much of the upper
// part of ULS as possible
scrollPosition = panelTop - padding;
} else {
// Scroll just enough to show the ULS panel
scrollPosition = panelBottom - windowHeight + padding;
}
$( 'html, body' ).stop().animate( {
scrollTop: scrollPosition
}, 500 );
}
} );
},
/**
* Hide this window.
* Used while navigating to language selector and need coming back
*/
hide: function () {
this.$parent.hide();
},
/**
* Close the language settings window.
* Depending on the context, actions vary.
*/
close: function () {
var origUILanguage = this.getUILanguage();
if ( $.i18n().locale !== origUILanguage ) {
// restore UI localization for display settings panel
$.i18n().locale = origUILanguage;
this.i18n();
}
this.$parent.close();
},
/**
* Callback for save preferences
*/
onSave: function ( success ) {
if ( success ) {
if ( this.$webfonts !== undefined ) {
// Live font update
this.$webfonts.refresh();
}
this.$parent.hide();
// we delay change UI language to here, because it causes a page refresh
if ( this.uiLanguage !== this.getUILanguage() ) {
mw.uls.changeLanguage( this.uiLanguage );
}
} // @todo What to do in case of failure?
},
/**
* Handle the apply button press
*/
apply: function () {
var displaySettings = this;
// Save the preferences
mw.webfonts.preferences.save( function ( result ) {
// closure for not losing the scope
displaySettings.onSave( result );
} );
}
};
// Register this module to language settings modules
$.fn.languagesettings.modules = $.extend( $.fn.languagesettings.modules, {
display: DisplaySettings
} );
})( jQuery, mediaWiki );