Greasy Fork is available in English.

RBR CZ Improvements

Shows all car classes on Records pages. Sorts track and car names on Replay list page. Provides additional info in browser's title bar

// ==UserScript==
// @match http://rbr.onlineracing.cz/*
// @match https://rbr.onlineracing.cz/*

// @name RBR CZ Improvements
// @namespace rbr_cz_improvements
// @description Shows all car classes on Records pages. Sorts track and car names on Replay list page. Provides additional info in browser's title bar
// @version 4
// ==/UserScript==

( function() {
    const url_search_params = new URLSearchParams( window.location.search )

    const classIds = [
        { id: 1, name: "WRC" },
        { id: 3, name: "N4" },
        { id: 13, name: "S2000" },
        { id: 2, name: "S1600" },
        { id: 4, name: "A8" },
        { id: 5, name: "A7" },
        { id: 6, name: "A6" },
        { id: 7, name: "A5" },
        { id: 8, name: "N3" },
        { id: 11, name: "H" },

        { id: 101, name: "RC1" },
        { id: 102, name: "RC2" },
        { id: 103, name: "RGT" },
        { id: 104, name: "RC3" },
        { id: 105, name: "RC4" },
        { id: 106, name: "RC5" },
        { id: 107, name: "H/B" },
        { id: 108, name: "H/A" },
        { id: 109, name: "H/4" },
        { id: 110, name: "H/2" },
        { id: 111, name: "WRC (NGP)" },
    ]

    function getElementByXpath( path ) {
        return document.evaluate( path, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null ).singleNodeValue
    }

    function setTitle( title ) {
        return () => { document.title = `${title} - Richard Burns Rally CZECH` }
    }

    function extractRecordPageHeader() {
        return () => {
            const header = getElementByXpath( '/html/body/table/tbody/tr/td/table[3]/tbody/tr[1]/td[2]/center/span' ).textContent.split( ' - ' )

            const car_class_select = document.getElementById( 'classid' )
            const car_class = car_class_select.options[car_class_select.selectedIndex].text

            if ( header.length > 1 ) {
                return setTitle( `${header[0]} - ${header[1]} - ${car_class}` )
            } else {
                const country_select = document.getElementById( 'state' )
                const country = country_select.options[country_select.selectedIndex].text
                if ( country.startsWith( '-' ) ) {
                    return setTitle( `${header[0]} - ${car_class}` )
                } else {
                    return setTitle( `${header[0]} - ${country} - ${car_class}` )
                }
            }


        }
    }

    function setRecordClasses() {
        const select_class_id = document.getElementById( 'classid' );
        const query_classid = url_search_params.get( 'classid' )
        while ( select_class_id.children[0] ) {
            select_class_id.children[0].remove();
        }

        classIds.forEach( ( classId, index ) => {
            const option = document.createElement( 'option' );
            option.text = classId.name;
            option.value = classId.id;

            select_class_id.append( option )

            if ( query_classid == classId.id ) {
                select_class_id.options.selectedIndex = index;
            }
        } )
    }

    const act = url_search_params.get( 'act' )

    const actHandlers = {
        'cuplst': setTitle( 'Cup list' ),

        'mybooks': setTitle( 'Bookmarks' ),
        'myreqlist': setTitle( 'Requests' ),
        'qsearch': setTitle( 'Search' ),
        'rbrmods': setTitle( 'Mod list' ),
        'rbrtracks': setTitle( 'Track list' ),
        'repl_search': [ setTitle( 'Replay list' ), () => {
            [ 'track_id', 'car_id' ].forEach( id => {
                const select = document.getElementById( id );

                const sorted =
                    Array.prototype.slice.call( select.children )
                    .sort( ( a, b ) => a.textContent > b.textContent ? 1 : -1 )

                while ( select.children[0] ) {
                    select.children[0].remove();
                }

                sorted.forEach( element => {
                    select.append( element )
                } )

                select.options.selectedIndex = 0;
            } )
        } ],
        'replaysend': setTitle( 'Send replay' ),
        'stagerec': [ setRecordClasses, extractRecordPageHeader ],
        'teamlist': setTitle( 'Team list' ),
        'tour_res_feed': () => {
            const tournament_name = getElementByXpath( '/html/body/table/tbody/tr/td/table[3]/tbody/tr[1]/td[2]/center/span[1]/a' ).textContent.trim()

            return setTitle( `${tournament_name} - Live results` )
        },
        'tour_startlist': () => {
            const tournament_name = getElementByXpath( '/html/body/table/tbody/tr/td/table[3]/tbody/tr[1]/td[2]/center/span' ).textContent
            .replace( ' - Start list', '' )
            .replace( ' - Startovní listina', '' )
            .trim()

            return setTitle( `${tournament_name} - Start list` )
        },
        'tourmntres2': () => {
            const tournament_name = getElementByXpath( '/html/body/table/tbody/tr/td/table[3]/tbody/tr[1]/td[2]/table/tbody/tr[1]/td/table/tbody/tr[1]/td/span[1]/b/a' ).textContent.trim()

            const stage_name = getElementByXpath( '/html/body/table/tbody/tr/td/table[3]/tbody/tr[1]/td[2]/table/tbody/tr[1]/td/table/tbody/tr[3]/td[1]/b[1]' ).textContent
            .replace( 'RZ/', '' ).trim()

            return setTitle( `${tournament_name} - ${stage_name}` )
        },
        'tourmntscre4A': setTitle( 'Create tournament' ),
        'tourmntsend': setTitle( 'Send results' ),
        'tourmntslst': () => {
            const page = url_search_params.get( 'page' )
            return setTitle( page ? `Past tournaments list - Page ${page}` : `Tournaments list` )
        },
        'tourmntsview': () => {
            const tournament_name = getElementByXpath( '/html/body/table/tbody/tr/td/table[3]/tbody/tr[1]/td[2]/table[1]/tbody/tr[1]/td/span' ).textContent.trim()

            return setTitle( tournament_name )
        },


        'tstats': [ setRecordClasses, extractRecordPageHeader ],
        'urank': [ setRecordClasses, extractRecordPageHeader ],
        'urec': [ setRecordClasses, extractRecordPageHeader ],
        'ustats': () => {
            const driver_name = getElementByXpath( '/html/body/table/tbody/tr/td/table[3]/tbody/tr[1]/td[2]/center[1]' ).textContent
            .replace( 'Statistics of user', '' )
            .replace( 'Statistiky uživatele', '' )
            .trim()

            return setTitle( driver_name )
        }
    }

    if ( !actHandlers[act] ) {
        return
    }

    const handlers = Array.isArray( actHandlers[act] ) ? actHandlers[act] : [ actHandlers[act] ]
    handlers.forEach( handler => {
        while ( typeof handler === 'function' ) {
            handler = handler()
        }
    } )
} )()