diff --git a/src/jquery.uls.languagefilter.js b/src/jquery.uls.languagefilter.js index 40b6a86..ad0f2ea 100644 --- a/src/jquery.uls.languagefilter.js +++ b/src/jquery.uls.languagefilter.js @@ -188,8 +188,9 @@ this.selectedLanguage = langCode; } - this.render( langCode ); - this.resultCount++; + if ( this.render( langCode ) ) { + this.resultCount++; + } } } } @@ -212,8 +213,9 @@ languageFilter.autofill( code, name ); } - languageFilter.render( code ); - languageFilter.resultCount++; + if ( languageFilter.render( code ) ) { + languageFilter.resultCount++; + } } ); languageFilter.resultHandler( query ); @@ -278,10 +280,10 @@ var $target = this.options.$target; if ( !$target ) { - return; + return false; } - $target.append( langCode, null ); + return $target.append( langCode ); }, escapeRegex: function( value ) { diff --git a/src/jquery.uls.lcd.js b/src/jquery.uls.lcd.js index 2ad9efb..3c9b176 100644 --- a/src/jquery.uls.lcd.js +++ b/src/jquery.uls.lcd.js @@ -26,12 +26,12 @@ /*jshint multistr:true */ noResultsTemplate = '\ -
\
You can search by language name, \
script name, ISO code of language or \
@@ -53,9 +53,13 @@
this.$element = $( element );
this.options = $.extend( {}, $.fn.lcd.defaults, options );
this.$element.addClass( 'lcd' );
- this.regionDivs = {};
+ this.regionLanguages = {};
+ this.renderTimeout = null;
+ this.cachedQuicklist = null;
+
this.$element.append( $( noResultsTemplate ) );
- this.$noResults = this.$element.find( 'div.uls-no-results-view' );
+ this.$noResults = this.$element.children( '.uls-no-results-view' );
+
this.render();
this.listen();
};
@@ -63,109 +67,50 @@
LanguageCategoryDisplay.prototype = {
constructor: LanguageCategoryDisplay,
+ /**
+ * Adds language to the language list.
+ * @param {string} langCode
+ * @param {string} [regionCode]
+ * @return {bool} Whether the language was added.
+ */
append: function ( langCode, regionCode ) {
+ var lcd = this, i, regions;
+
if ( !this.options.languages[langCode] ) {
// Language is unknown or not in the list of languages for this context.
- return;
+ return false;
}
- this.addToRegion( langCode, regionCode );
- this.$noResults.hide();
- },
- /**
- * Add the language to a region.
- * If the region parameter is given, add to that region alone
- * Otherwise to all regions that this language belongs.
- * @param langCode
- * @param region Optional region
- */
- addToRegion: function ( langCode, region ) {
- var i, regionCode, $li, $column, lastLanguage, lastScriptGroup, currentScriptGroup,
- language = this.options.languages[langCode],
- langName = $.uls.data.getAutonym( langCode ) || language || langCode,
- regions = [];
-
- if ( region ) {
- regions.push( region );
+ if ( regionCode ) {
+ regions = [regionCode];
} else {
regions = $.uls.data.getRegions( langCode );
}
- // World wide languages need not be repeated in all regions.
+ // Worldwides only displayed once
if ( $.inArray( 'WW', regions ) > -1 ) {
- regions = [ 'WW' ];
+ regions = ['WW'];
}
for ( i = 0; i < regions.length; i++ ) {
- regionCode = regions[i];
-
- $li = $( '' ).addClass( 'three columns end autonym' );
-
- if ( $rowDiv.length === 0 || $rowDiv.find( 'ul' ).length >= 4 ) {
- $rowDiv = $( '
' )
- .attr( 'data-i18n', 'uls-region-' + regionCode )
- .addClass( 'eleven columns uls-lcd-region-section uls-lcd-region-title' )
- .text( regions[regionCode] );
+ $section = $( '
' )
+ .attr( 'data-i18n', 'uls-region-' + regionCode )
+ .addClass( 'eleven columns uls-lcd-region-title' )
+ .text( regionNames[regionCode] )
+ );
- $section.append( $sectionTitle );
- lcd.$element.append( $section );
- $section.hide();
- lcd.regionDivs[regionCode] = $section;
+ regions.push( $section );
} );
- this.$noResults.hide();
+ lcd.$element.append( regions );
+
this.i18n();
},
+ /**
+ * Renders a region and displays it if it has content.
+ */
+ renderRegions: function () {
+ var lcd = this, languages,
+ items = lcd.options.itemsPerColumn,
+ columns = 4;
+
+ this.$noResults.addClass( 'hide' );
+ this.$element.find( '.uls-lcd-region-section' ).each( function () {
+ var $region = $( this ),
+ regionCode = $region.attr( 'id' );
+
+ if ( $region.is( '#uls-lcd-quicklist' ) ) {
+ return;
+ }
+
+ $region.children( '.uls-language-block' ).remove();
+
+ languages = lcd.regionLanguages[regionCode];
+ if ( !languages || languages.length === 0 ) {
+ $region.addClass( 'hide' );
+ return;
+ }
+
+ lcd.renderRegion( $region, languages, items, columns );
+ $region.removeClass( 'hide' );
+
+ lcd.regionLanguages[regionCode] = [];
+ } );
+
+ },
+
+ /**
+ * Adds given languages sorted into rows and columns into given element.
+ * @param {jQuery} $region Element to add language list.
+ * @param {array} languages List of language codes.
+ * @param {number} itemsPerColumn How many languages fit in a column.
+ * @param {number} columnsPerRow How many columns fit in a row.
+ */
+ renderRegion: function( $region, languages, itemsPerColumn, columnsPerRow ) {
+ var i, lastItem, currentScript, nextScript, force,
+ len = languages.length,
+ items = [],
+ columns = [],
+ rows = [];
+
+ for ( i = 0; i < len; i++ ) {
+ force = false;
+ nextScript = $.uls.data.getScriptGroupOfLanguage( languages[i+1] );
+
+ lastItem = len - i === 1;
+ // Force column break if script changes and column has more than one row already
+ if ( i === 0 ) {
+ currentScript = $.uls.data.getScriptGroupOfLanguage( languages[i] );
+ } else if ( currentScript !== nextScript && items.length > 1 ) {
+ force = true;
+ }
+ currentScript = nextScript;
+
+ items.push( this.renderItem( languages[i] ) );
+
+ if ( items.length >= itemsPerColumn || lastItem || force ) {
+ columns.push( $( '
' ).addClass( 'three columns' ).append( items ) );
+ items = [];
+ if ( columns.length >= columnsPerRow || lastItem ) {
+ rows.push( $( '
' )
.attr( 'data-i18n', 'uls-common-languages' )
- .addClass( 'eleven columns uls-lcd-region-section uls-lcd-region-title' )
+ .addClass( 'eleven columns uls-lcd-region-title' )
.text( 'Common languages' ); // This is placeholder text if jquery.i18n not present
$quickListSection.append( $quickListSectionTitle );
- this.$element.prepend( $quickListSection );
- this.regionDivs.quick = $quickListSection;
- for ( i = 0; i < quickList.length; i++) {
- $column = this.getColumn( 'quick', i % 4 === 0 );
- langCode = quickList[i];
- language = this.options.languages[langCode];
- langName = $.uls.data.getAutonym( langCode ) || language || langCode;
- $li = $( '