( function () { 'use strict'; var resultGroups; $( function () { resultGroups = $( '.facet.groups' ).data( 'facets' ); $( '.tux-searchpage .button' ).click( function () { var query = $( '.tux-searchpage .searchinputbox' ).val(), result = lexOperators( query ), $form = $( '.tux-searchpage form[name=searchform]' ); $.each( result, function ( index, value ) { var $input = $( '' ).prop( 'type', 'hidden' ), $elem = $form.find( 'input[name=' + index + ']' ); if ( $elem.length ) { $elem.val( value ); } else { $form.append( $input .prop( { value: value, name: index } ) ); } } ); } ); buildSelectedBox(); showLanguages(); showMessageGroups(); // Make the whole rows clickable $( '.tux-searchpage .row .facet-item' ).click( function ( event ) { window.location = $( this ).find( 'a' ).attr( 'href' ); event.stopPropagation(); } ); } ); // ES5-compatible Chrome, IE 9+, FF 4+, or Safari 5+ has Object.keys. // Make other old browsers happy if ( !Object.keys ) { Object.keys = function ( obj ) { var keys = [], k; for ( k in obj ) { if ( Object.prototype.hasOwnProperty.call( obj, k ) ) { keys.push( k ); } } return keys; }; } function showLanguages() { var $languages, languages, ulslanguages = [], currentLanguage, resultCount, $count, result, i, selectedClasss = '', languageCode, quickLanguageList = [], unique = [], $ulsTrigger, uri; $languages = $( '.facet.languages' ); languages = $languages.data( 'facets' ); currentLanguage = $languages.data( 'language' ); if ( !languages ) { return; } if ( currentLanguage !== '' ) { uri = new mw.Uri( location.href ); uri.extend( { language: '', filter: '' } ); addToSelectedBox( getLanguageLabel( currentLanguage ), uri.toString() ); } resultCount = Object.keys( languages ).length; quickLanguageList = quickLanguageList.concat( mw.uls.getFrequentLanguageList() ) .concat( Object.keys( languages ) ); // Remove duplicates from the language list quickLanguageList.forEach( function ( lang ) { result = languages[ lang ]; if ( result && unique.indexOf( lang ) === -1 ) { unique.push( lang ); } } ); if ( currentLanguage && quickLanguageList.indexOf( currentLanguage ) >= 0 ) { quickLanguageList = unique.splice( 0, 5 ); if ( quickLanguageList.indexOf( currentLanguage ) === -1 ) { quickLanguageList = quickLanguageList.concat( currentLanguage ); } } else { quickLanguageList = unique.splice( 0, 6 ); } quickLanguageList.sort( sortLanguages ); for ( i = 0; i <= quickLanguageList.length; i++ ) { languageCode = quickLanguageList[ i ]; result = languages[ languageCode ]; if ( !result ) { continue; } if ( currentLanguage === languageCode ) { selectedClasss = 'selected'; } else { selectedClasss = ''; } $languages.append( $( '
' ) .addClass( 'row facet-item' ) .append( $( '' ) .addClass( 'facet-name ' + selectedClasss ) .append( $( '' ) .attr( 'href', result.url ) .text( getLanguageLabel( languageCode ) ) ), $( '' ) .addClass( 'facet-count' ) .text( result.count ) ) ); } $.each( Object.keys( languages ), function ( index, languageCode ) { ulslanguages[ languageCode ] = mw.config.get( 'wgTranslateLanguages' )[ languageCode ]; } ); mw.translate.addExtraLanguagesToLanguageData( ulslanguages, [ 'SP' ] ); if ( resultCount > 6 ) { $ulsTrigger = $( '' ) .text( '...' ) .addClass( 'translate-search-more-languages' ); $count = $( '' ) .addClass( 'translate-search-more-languages-info' ) .text( mw.msg( 'translate-search-more-languages-info', resultCount - quickLanguageList.length ) ); $languages.append( $ulsTrigger, $count ); $ulsTrigger.uls( { onSelect: function ( language ) { window.location = languages[ language ].url; }, compact: true, languages: ulslanguages, ulsPurpose: 'translate-special-searchtranslations', top: $languages.offset().top, showRegions: [ 'SP' ].concat( $.fn.lcd.defaults.showRegions ) } ); } } function showMessageGroups() { var currentGroup, groupList, $groups; $groups = $( '.facet.groups' ); if ( !resultGroups ) { // No search results return; } groupList = Object.keys( resultGroups ); listGroups( groupList, currentGroup, $groups ); } function listGroups( groupList, parentGrouppath, $parent, level ) { var i, $grouSelectorTrigger, selectedClass = '', group, groupId, $groupRow, uri, maxListSize = 10, currentGroup = $( '.facet.groups' ).data( 'group' ), resultCount = groupList.length, position, groups, options, grouppath; level = level || 0; groupList.sort( sortGroups ); if ( level === 0 ) { groupList = groupList.splice( 0, maxListSize ); } grouppath = getParameterByName( 'grouppath' ).split( '|' )[ 0 ]; if ( currentGroup && resultGroups[ grouppath ] && groupList.indexOf( grouppath ) < 0 && level === 0 ) { // Make sure current selected group is displayed always. groupList = groupList.concat( grouppath ); } groupList.sort( sortGroups ); for ( i = 0; i < groupList.length; i++ ) { groupId = groupList[ i ]; group = mw.translate.findGroup( groupId, resultGroups ); if ( !group ) { continue; } uri = new mw.Uri( location.href ); if ( parentGrouppath !== undefined ) { grouppath = parentGrouppath + '|' + groupId; } else { grouppath = groupId; } uri.extend( { group: groupId, grouppath: grouppath } ); if ( currentGroup === groupId ) { selectedClass = 'selected'; uri.extend( { group: '', grouppath: '' } ); addToSelectedBox( group.label, uri.toString() ); } else { selectedClass = ''; uri.extend( { group: groupId, grouppath: grouppath } ); } $groupRow = $( '
' ) .addClass( 'row facet-item facet-level-' + level ) .append( $( '' ) .addClass( 'facet-name ' + selectedClass ) .append( $( '' ) .attr( 'href', uri.toString() ) .text( group.label ) ), $( '' ) .addClass( 'facet-count' ) .text( mw.language.convertNumber( group.count ) ) ); $parent.append( $groupRow ); if ( group.groups && level < 2 ) { listGroups( Object.keys( group.groups ), grouppath, $groupRow, level + 1 ); } } if ( resultCount > maxListSize && resultCount - groupList.length > 0 && level === 0 ) { $grouSelectorTrigger = $( '
' ) .addClass( 'rowfacet-item ' ) .append( $( '' ) .text( '...' ) .addClass( 'translate-search-more-groups' ), $( '' ) .addClass( 'translate-search-more-groups-info' ) .text( mw.msg( 'translate-search-more-groups-info', resultCount - groupList.length ) ) ); $parent.append( $grouSelectorTrigger ); if ( $( 'body' ).hasClass( 'rtl' ) ) { position = { my: 'right top', at: 'right+90 top+40', collision: 'none' }; } else { position = { my: 'left top', at: 'left-90 top+40', collision: 'none' }; } options = { language: mw.config.get( 'wgUserLanguage' ), position: position, onSelect: function ( group ) { var uri = new mw.Uri( location.href ); uri.extend( { group: group.id, grouppath: group.id } ); location.href = uri.toString(); }, preventSelector: true }; groups = $.map( resultGroups, function ( value, index ) { return index; } ); $grouSelectorTrigger.msggroupselector( options, groups ); } } function lexOperators( str ) { var string = str.split( ' ' ), result = {}, query = ''; $.each( string, function ( index, value ) { matchOperators( value, function ( obj ) { if ( obj === false ) { query = query + ' ' + value; } else { result[ obj.operator ] = obj.value; } } ); } ); result.query = query.trim(); return result; } function matchOperators( str, callback ) { var matches, counter = false, // Add operators for different filters operatorRegex = [ 'language', 'group', 'filter' ]; $.each( operatorRegex, function ( index, value ) { var regex = new RegExp( value + ':(\\S+)', 'i' ); if ( ( matches = regex.exec( str ) ) !== null ) { counter = true; callback( { operator: value, value: matches[ 1 ] } ); } } ); if ( !counter ) { callback( false ); } } function sortGroups( groupIdA, groupIdB ) { var groupAName = mw.translate.findGroup( groupIdA, resultGroups ).count, groupBName = mw.translate.findGroup( groupIdB, resultGroups ).count; if ( groupAName > groupBName ) { return -1; } else if ( groupAName < groupBName ) { return 1; } return 0; } function sortLanguages( languageA, languageB ) { var languageNameA = mw.config.get( 'wgULSLanguages' )[ languageA ] || languageA, languageNameB = mw.config.get( 'wgULSLanguages' )[ languageB ] || languageB; return languageNameA.localeCompare( languageNameB ); } function getParameterByName( name ) { var uri = new mw.Uri(); return uri.query[ name ] || ''; } function getLanguageLabel( languageCode ) { return mw.config.get( 'wgULSLanguages' )[ languageCode ] || languageCode; } // Build a selected box to show the selected items function buildSelectedBox() { $( '.tux-search-inputs' ) .removeClass( 'offset-by-three' ) .before( $( '
' ) .addClass( 'three columns tux-selectedbox' ) ); } function addToSelectedBox( label, url ) { $( '.tux-searchpage .tux-selectedbox' ).append( $( '