khzimmer / MKBeautifier

// ==UserScript==
// @name         MKBeautifier
// @namespace    khzimmer
// @version      1.2.29
// @description  Make www.model-kartei.de more useful for me.
// @author       khzimmer@posteo.de
// @license      BSD-3-Clause; https://opensource.org/licenses/BSD-3-Clause
// @include      *model-kartei.de/*
// @updateURL https://openuserjs.org/meta/khzimmer/MKBeautifier.meta.js
// @grant        none
// ==/UserScript==
/*jshint multistr: true */

(
    function ()
    {

        var MKBeautifierVERSION =    '1.2.29';





        var ownLanguage = $('input#language').val ();
        function languageIsGerman ()
        {
            return (ownLanguage == '1');
        }
        function tr (txtGerman, txtEnglish)
        {
            // so far we support just German and English, more to follow later ...
            if (languageIsGerman ())
            {
                return txtGerman;
            }
            return txtEnglish;
        }
        function trFunc (txtGerman, txtEnglish)
        {
            // so far we support just German and English, more to follow later ...
            if (languageIsGerman ())
            {
                return txtGerman;
            }
            return txtEnglish;
        }
        function trWeekDay (date)
        {
            var d = date.getDay ();
            switch (d)
            {
                case 0: return trFunc ('Sonntag',   'Sunday'   );
                case 1: return trFunc ('Montag',    'Monday'   );
                case 2: return trFunc ('Dienstag',  'Tuesday'  );
                case 3: return trFunc ('Mittwoch',  'Wednesday');
                case 4: return trFunc ('Donnerstag','Thursday' );
                case 5: return trFunc ('Freitag',   'Friday'   );
                case 6: return trFunc ('Samstag',   'Saturday' );
                default: return '';
            }
        }






// Beginn Deiner Einstellungen, was das Skript tun soll und was nicht:



// **********  Ergänzen des Hauptmenus  *****************************************



        // Die Tabelle erzeugt praktische Einträge unter dem "Neue Fotos",
        // je nach dem Wert in der entsprechenden Zeile hier ganz rechts.
        //
        //   Trage "true"  ein zum einblenden des betreffenden Menu-Eintrag,
        //   oder  "false" zum verhindern:
        //
        var origSettingAddToMenu_NeueFotos =
        [
            [ '1', tr ('model','model'),                    tr ('Weibliche Models','Female Models'),       true
            ]
            ,
            ['99', tr ('malemodel','malemodel'),            tr ('Männliche Models','Male Models'),    true
            ]
            ,
            [ '2', tr ('fotograf','photographer'),          tr ('Fotografen','Photographers'),             true
            ]
            ,
            [ '3', tr ('visagist','makeupartist'),          tr ('Visas','Make-up Artists'),                true
            ]
            ,
            [ '7', tr ('bildbearbeiter','postproduction'),  tr ('Bildbearbeiter','Postproduction'),        true
            ]
            ,
            ['11', tr ('bodypainter','bodypainter'),        tr ('Bodypainter','Bodypainters'),             true
            ]
            ,
            [ '4', tr ('fotostudio','photostudio'),         tr ('Fotostudios','Photo Studios'),            false
            ]
            ,
            [ '5', tr ('werbeagentur','advertiser'),        tr ('Werbeagenturen','Advertising Agencies'),  false
            ]
            ,
            [ '6', tr ('produzent','producer'),             tr ('Produzenten','Producers'),                false
            ]
            ,
            [ '8', tr ('designer','designer'),              tr ('Designer','Designers'),                   false
            ]
            ,
            [ '9', tr ('stylist','stylist'),                tr ('Stylisten','Stylists'),                   false
            ]
            ,
            ['10', tr ('hairstylist','hairstylist'),        tr ('Hairstylisten','Hairstylists'),           false
            ]
            ,
            ['12', tr ('illustrator','illustrator'),        tr ('Illustratoren','Illustrators'),           false
            ]
            ,
            ['13', tr ('medienunternehmen','mediacompany'), tr ('Medienunternehmen','Media Companies'),    false
            ]
            ,
            ['14', tr ('modelagentur','modelagency'),       tr ('Modelagenturen','Model Agencies'),        false
            ]
            ,
            ['15', tr ('auftraggeber','client'),            tr ('Auftraggeber','Clients'),                 false
            ]
            // Note: Add new elements to the END here only,
            //       so settings values stored for the older format
            //       can still be read from local storage correctly!
        ];


        // Falls dies auf "true" steht, verlinken die o.a. Menueinträge
        // auf die spezielle Nach-Filterung der Listen nur
        // für Teilnehmer,
        // die "nicht ZU weit entfernt" sind:
        //
        var origSettingAddToMenu_NeueFotos_justNear       =  false
        ;


        // Falls dies auf "true" steht, verlinken die o.a. Menueinträge
        // auf die spezielle Nach-Filterung der Listen nur
        // für Teilnehmer,
        // die "nicht ZU weit entfernt" sind:
        //
        // (Dies wird ignoriert, falls origSettingAddToMenu_NeueFotos_justNear auf "true" steht)
        //
        var origSettingAddToMenu_NeueFotos_justNotTooFar  =  false
        ;




// **********  Deine Startseite  ************************************************



        // Blendet als oberstes Widget eine Liste der als nächste/letzte erreichten
        // "Tage-Zähler" ein, falls Du auf besuchten Sedcards solche aktiviert hast:
        //
        var origSettingShowListOfDaysAtTopOfStartpage      =  true
        ;

        // Blendet als unterstes Widget eine Liste der als nächste/letzte erreichten
        // "Tage-Zähler" ein, falls Du auf besuchten Sedcards solche aktiviert hast:
        //
        var origSettingShowListOfDaysAtBottomOfStartpage   =  false
        ;

        // Zeigt im "Tage-Zähler"-Startseite-Widget nur die ZUKUNFT an.
        //
        var origSettingJustTheFutureCountersOnStartpage    =  false
        ;

        // Zeigt Dir Deine MK Teilnehmer ID oben links auf der Startseite an:
        //
        var origSettingShowUserIDOnStartpage               =  true
        ;




// **********  die Sedcards  ****************************************************



        // Blendet den (Anfang Deiner) auf einer Sedcard eingetragenen "Notiz"
        // dort dauerhaft sichtbar unter dem Teilnehmer-Namen ein:
        //
        // (Egal ob ein oder ausgeschaltet, wird in jedem Fall die
        //  komplette Notiz als ToolTip auf dem Teilnehmernamen eingeblendet.)
        //
        var origSettingShowNoteOnSedcard          =  true
        ;


        // Verkürzt die ggfs. (s.o.) dauerhaft eingeblendete Notiz notfalls
        // auf eine maximale Länge von so vielen Zeichen:
        //
        // (Ist dieser Wert zu hoch, entsteht ein Zeilenumbruch und der Notiztext
        //  verdeckt ggfs. die Links "SEDCARD", "GALERIEN" und "NETZWERK".)
        //
        var origSettingMaxLengthForNoteOnSedcard  =  66
        ;


        // Blendet zusätzliche Marker ein, deren Status allerdings NUR LOKAL
        // im Speicher des von Dir verwendeten Browsers abgelegt wird.
        //
        //
        // BEACHTE die begrenzte(!) Nützlichkeit dieser Marker:
        //
        //      Falls Du von mehreren Geräten aus und/oder mit mehreren Browsern
        //      in die MK gehst, 'ahnt' der eine Browser jeweils NICHTS von den
        //      Flags, die Du unter Verwendung des anderen Browsers (bzw. während
        //      der Nutzung des anderen Geräts) ein- oder ausgeschaltet hast.
        //
        //
        // Drei Regeln, die Stärkste zuerst:
        //
        //   1. Teilnehmer, für die Du den "Silent Ignore"-Marker einschaltest,
        //      werden markiert bzw. ausgeblendet, wie unten, am Ende des Einstellungen-
        //      Abschnitts beschrieben, siehe: Sinn und Aktivierung des "Silent Ignore"
        //
        //      (Nachfolgendes gilt nur, falls NICHT das "Silent Ignore" aktiv ist,)
        //
        //   2. Teilnehmer für die Du den "Geringe Wichtigkeit"-Marker oder den
        //      "Warnung"-Marker einschaltest, werden
        //      in der Liste der neuen Bilder NICHT mit der Farbe für "nah"-Entfernung
        //      hervorgehoben, selbst wenn sie in der Nähe wohnen.
        //      Sie bekommen dort immer die Farbe der weit weg wohnenden Teilnehmer.
        //
        //      Der "Geringe Wichtigkeit"-Marker (bzw. "Warnung"-Marker) bedeuten
        //      aber NICHT ein Ignorieren des Teilnehmers,
        //      sondern verhindert nur die farbliche Entfernung-Hervorhebung.
        //
        //      Insbesondere werden die Fotos solcher Teilnehmer ggfs. _mit_ angezeigt,
        //      wenn nach "nah" oder "nicht ZU weit entfernt" gefiltert wird.)
        //
        //      (Nachfolgendes gilt nur, falls weder der "Geringe Wichtigkeit"-Marker
        //                               noch der "Warnung"-Marker aktiv sind.)
        //
        //   3. Teilnehmer, für die Du den "Hohe Wichtigkeit"-Marker einschaltest, werden
        //      in der Liste der neuen Bilder IMMER mit der Farbe für "nah"-Entfernung
        //      hervorgehoben, selbst wenn sie nicht in der Nähe wohnen.
        //
        //      Dies hat aber keine Auswirkung auf die Filterung: Falls sie nicht im "nah"-
        //      oder im "nicht ZU weit entfernt"-Bereich wohnen, werden sie ihre Bilder bei
        //      gesetztem Km-Filter ausgeblendet, obwohl das "Hohe Wichtigkeit" aktiv ist.
        //
        var origSettingUseAdditionalLocalUserFlags   =  true
        ;





// **********  die "Persönliche Nachrichten" (-Listen) -Seiten  *****************



        // Verschönern der Schrift von PN-Titeln und PN-Inhalt-Texten:
        //
        var origSettingBeautifyPNTexts                 =  true
        ;
        //
        // Falls obiger Schalter auf "true" steht,
        // (allerdings nur beim "Standard Theme",
        //  also nicht beim "Hellen Theme")
        // werden diese beiden Farben verwendet:
        //
        // ('#FFDCA7' (oben) ist Originalwert für  PN-Absender
        //  '#FFF0E1' (unten) ist Originalwert für PN-Titel und Inhalt)
        //
        //
        var origSettingDarkThemeColorForPNs_UserNames  =  '#FFDCA7'
        ;
        var origSettingDarkThemeColorForPNs_Content    =  '#FFF0E1'
        ;

        // Hervorheben der PN-Titel von Leuten, die ich mit "Hohe Wichtigkeit" markiert habe:
        //
        var origSettingHighlightPNTitleIfUserHasSmiley =  true
        ;

        // Ausblenden der PN-Titel von Leuten, die ich im "Silent Ignore" habe:
        //
        // (Das Konzept des "Silent Ignore" ist hier etwas weiter unten erklärt.)
        //
        //    Falls dies auf "false" steht, erkennst Du den Status dennoch
        //    am "Silent Ignore"-Marker und an der Graufärbung des Eintrags.
        //
        var origSettingHidePNTitleIfUserIgnored        =  true
        ;



// **********  die "Photostream"- "Best Of"- und "Neue Fotos"-Listen-Seiten  ****



        // Bis zu welcher Km-Entfernung zu Dir
        // gelten Teilnehmer noch als "nah":
        //
        var origSettingKmFilterNear       =   60
        ;


        // Bis zu welcher Km-Entfernung zu Dir
        // gelten Teilnehmer als "nicht ZU weit entfernt":
        //
        var origSettingKmFilterNotTooFar  =  130
        ;



        // Diese Farbe gilt für Teilnehmer in "nah"-Entfernung:
        //
        // (Originalwert ist '#FFDCA7', viel Spass beim experimentieren!)
        //
        var origSettingInfoColor_Near           =  '#FFDCA7'
        ;

        // Diese Farbe gilt für Teilnehmer in "nicht ZU weit weg"-Entfernung:
        //
        // (Originalwert ist '#BD9E7B', viel Spass beim experimentieren!)
        //
        var origSettingInfoColor_NotTooFarAway  =  '#BD9E7B'
        ;

        // Diese Farbe gilt für Teilnehmer in "weit entfernt"-Entfernung:
        //
        // (Originalwert ist '#7B6150', viel Spass beim experimentieren!)
        //
        var origSettingInfoColor_FarAway        =  '#7B6150'
        ;



        // Farbliche Hervorhebung der "nah" oder "nicht ZU weit entfernt"
        // wohnenden Teilnehmer:
        //
        // (Falls Du dies ausgeschaltet ist, verschwindet die Information dennoch
        //  nicht völlig, denn für alle "nah" oder "nicht ZU weit entfernt" wird immer
        //  anstelle von "km" das entsprechende Doppelpfeil-Symbol eingeblendet)
        //
        // (wirkt sich NICHT aus, wenn der Marker "Geringe Wichtigkeit" oder der
        //  "Warnung"-Marker aktiv sind)
        //
        // (Wenn Du die Liste nach "nah"-Entfernung filterst, wirkt sich der Schalter
        //  nur dann aus, wenn der nachfolgende Schalter ebenfalls aktiv ist.)
        //
        var origSettingHighlightNamesWhenNearOrNotTooFar  =  true
        ;
        //
        // Dies ist ein Ergänzungs-Schalter zu obiger Einstellung.
        //
        // (wirkt sich NUR dann aus, wenn obiger Schalter ebenfalls aktiv ist)
        //
        // Normalerweise werden Teilnehmer NICHT farblich als "nah" hervorgehoben,
        // wenn der Km-Filter auf "nah" steht, doch Du kannst die Hervorhebung
        // mit diesem Schalter erzwingen:
        //
        var origSettingHighlightNamesWhenKmNearFilterActive = true
        ;


        // Farbliche Hervorhebung Deiner Favoriten, so als seien sie alle in "nah"-
        // Entfernung:
        //
        // (wirkt sich NICHT aus, wenn der Marker "Geringe Wichtigkeit" oder der
        //  "Warnung"-Marker aktiv sind)
        //
        var origSettingHighlightFavoritesLikeNear  =  true
        ;


        // Farbliche Hervorhebung Deines Netzwerks, so als seien sie alle in "nah"-
        // Entfernung:
        //
        // (wirkt sich NICHT aus, wenn der Marker "Geringe Wichtigkeit" oder der
        //  "Warnung"-Marker aktiv sind)
        //
        var origSettingHighlightNetworkLikeNear     = true
        ;

        // Speziell für die Foto-Liste mit neuen Bildern ALLER Sedcard-Typen:
        //
        // Anzeige einer farbige Markierungslinie
        // links des Links zur Sedcard der/des Hochladenden:
        //
        // (Unabhängig von dieser Einstellung
        //  wird der Sedcard-Typ immer (auch)
        //  als ToolTip auf dem Link angezeigt.)
        //
        var origSettingAddColorBarAsSedcardTypeIndicator  =  true
        ;


        // Ausblenden der senffarbenen Umrandungen neuer Bilder:
        //
        var origSettingRemoveFramesFromNewFotos  =  true
        ;


        // Anzeigen eines dezenteren "ist online"-Lämpchens
        // links der Teilnehmer-Namen:
        //
        // (wird ignoriert, falls der nachfolgende Schalter aktiv ist)
        //
        var origSettingBeautifyUserStatusLightForPhotoLinks = true
        ;

        // Ausblenden des "ist online"-Lämpchens
        // links der Teilnehmer-Namen:
        //
        var origSettingRemoveUserStatusLightFromPhotoLinks = false
        ;


        // Ausblenden der Bilder von Leuten, die ich im "Silent Ignore" habe:
        //
        // (Das Konzept des "Silent Ignore" ist hier etwas weiter unten erklärt.)
        //
        //    Falls dies auf "false" steht, werden die Bilder solcher
        //    Leute nicht ausgeblendet, sondern nur der Teilnehmer-Name
        //    durch einen Frowney und Graufärbung markiert.
        //
        var origSettingRemoveFiguresIfUserIgnored  =  true
        ;


        // Ausblenden der Bilder aller MaleModels:
        //
        var origSettingRemoveFiguresOfMaleModels  =  false
        ;





// **********  die Sedcard-Suchergebnis-Listen  *********************************



        // Durchstreichen aller Teilnehmer-Namen, die ich im "Silent Ignore" habe.
        //
        var origSettingSedcardSearchResultPageStrikeOutIfSilentIgnored  =  false
        ;


        // Verstecken aller Teilnehmer, die ich im "Silent Ignore" habe.
        //
        var origSettingSedcardSearchResultPageHideIfSilentIgnored  =  true
        ;




// **********  die großen "Einzelnes Fotos"-Seiten  *****************************



        // Anzeige von Flagge, Ort und Entfernung erfolgt
        // zusätzlich auch oben direkt nebem dem Teilnehmer-Namen:
        //
        // (bewirkt KEINE Verschiebung des großen Bildes)
        //
        var origSettingSinglePhotoPageShowLocationAtTop  =  true
        ;


        // Anzeige meiner Notiz oben unter dem Teilnehmer-Namen:
        //
        // (bewirkt, dass das große Bild etwas weiter unten angezeigt wird)
        //
        var origSettingSinglePhotoPageShowNotesAtTop  =  true
        ;




// **********  im Forum die "Neue Beiträge"--Seiten  ****************************



        // Hinzufügen eines Buttons zu jedem Thread, der es erlaubt, diesen
        // an der untere Ende der Seite herab zu sortieren:
        //
        // (kostet ein wenig horizontalen Platz in der Thread-Liste und wird
        //  bei langen Forum-Namen etwas unschön aussehen, weil diese ein
        //  Stückchen weit in den Latest-Link-Button hinein geschrieben werden)
        //
        var origSettingAddVotingButtonsToThreadList  =  true
        ;




// **********  im Forum die Einzel-Thread-Anzeige-Seiten  ***********************



        // Reduzieren der Beiträge von Leuten,
        // die ich im "Silent Ignore" habe,
        // auf eine knappe Platzhalterzeile mit Verfassernamen,
        // damit ich noch sehe, DASS der/die Holde etwas schrieb,
        // aber mir den geschriebenen Text nicht anzutun brauche:
        //
        var origSettingMinimizePostingsIfUserIgnored  =  true
        ;




// **********  Sinn und Aktivierung des "Silent Ignore" *************************


        // Die Idee des "Silent Ignore": Ignorieren ohne zu ärgern!
        //
        // Verbergen von einigen der Inhalte eines Teilnehmers, OHNE ihn/sie
        // tatsächlich in die Ignore-Liste des MK-Systems einzutragen.
        //
        // Wer von Dir in "Silent Ignore" genommen wurde, sieht also weiterhin,
        // was DU veröffentlichst und kann (z.B. in Bildkommentaren oder im Forum)
        // sich beliebig zu Deinen Bildern oder Themen äußern,
        // aber DU selber siehst seine/ihre PN-Titel und/oder Forum-Texte
        // und/oder Bilder in der Vorschauliste der neuen Bilder ggfs. nicht mehr.
        //
        // Es ist also eine reine Darstellungs-Unterdrückung bzw. -Änderung für
        // Dich selber, doch der/die solcherart 'ignorierte' bemerkt es vermutlich
        // nicht ... bzw. vermutet es evtl. höchstens deswegen, weil Du im Forum
        // nicht auf Beiträge reagierst.


        // WICHTIG: Ob jemand im "Silent Ignore" ist, oder nicht, wird als lokale
        //          Information bei auf Deinem eigenen Rechner gespeichert.
        //          Das MK-System weiss davon nichts.


        // Um einen User ins "Silent Ignore" zu setzen, klicke auf der betreffenden
        // Sedcard neben dem "Neue Nachricht"-Icon das "i"-Icon (linke neben dem '!!'-Icon).





// ******************************************************************************
// ******************************************************************************

//      E N D E  Deiner Einstellungen, was das Skript tun soll und was nicht

// ******************************************************************************
// ******************************************************************************








        'use strict';

        var storage = null;
        setLocalStorage ();

        function setLocalStorage ()
        {
            storage = (localStorage ? localStorage : (window.content.localStorage ? window.content.localStorage : null));
            try
            {
                storage.setItem('test_key', 'test_value');
                //evaluate if posible saving in the current storage
            }
            catch (e)
            {
                if (e.name == "NS_ERROR_FILE_CORRUPTED")
                {
                    storage = sessionStorage ? sessionStorage : null;
                    //set the new storage if fails
                }
            }
        }

        var ownID = $('#ds9y').val ();
        if (ownID.length == 0)
        {
            return;
        }
        var preferenceStorageKeyBASE = 'v5mkb_';
        var itemFormatIDItemKey      = preferenceStorageKeyBASE+'itemFormat';
        var itemFormatIDItem         = storage.getItem (itemFormatIDItemKey);
        var hasPre13DataFormat       = ( itemFormatIDItem === null );


        function makeOwnKey (key)
        {
          return ownID+'.'+key;
        }

        function ownStorageSetItem (key, value)
        {
            storage.setItem (makeOwnKey (key), value);
        }

        function ownStorageGetItem (key)
        {
            var item = storage.getItem (makeOwnKey (key));
            if (item === null)
            {
                return storage.getItem (key);
            }
            return item;
        }

        function storageKeyFromLongKey (longKey)
        {
          var storageKey = longKey;
          if (storageKey.indexOf (ownID+'.') == 0)
          {
            storageKey = storageKey.substring (ownID.length+1);
          }
          return storageKey;
        }

        function storageOwnIDFromLongKey (longKey)
        {
          var storageKey = '';
          var pos = longKey.indexOf ('.');
          if (pos >= 0)
          {
            storageKey = longKey.substring (0, pos);
          }
          return storageKey;
        }

        function ownStorageKey (index)
        {
          return storageKeyFromLongKey (storage.key (index));
        }


        var startPageToken = 'model-kartei.de/startseite/';
        var isMyStartPage  = (location.href.indexOf(startPageToken) > location.href.length - startPageToken.length-1);

        if ( isMyStartPage && hasPre13DataFormat )
        {
          // found the old data format (vor 1.3 war MKBeautifier nicht mandantenfähig)
          /*
          // Convert it to the new format?
          var resultOfStorageUpdateDialog = window.confirm (trFunc ('Update des lokalen MKBeautifier-Datenfomats wäre sinnvoll.\n\nSind die gespeicherten MKBeautifier-Daten für DIESEN User?',
                                                                    'Update of locally stored MKBeautifier data recommended.\n\nDo the stored MKBeautifer data belong to THIS user?'));
          if ( resultOfStorageUpdateDialog )
          */
          var documentTitleOrig = document.title;
          document.title = trFunc ('Lokale MKBeautifier-Daten werden in neues Format konvertiert: 1 v. 2',
                                   'Converting locally stored MKBeautifier data to new format: 1 of 2');
          {
            var oldItems = [];

            var numItems = storage.length;

            // retrieve all of the old data
            for (var i=0; i<numItems-1; i++)
            {
              var key = storage.key (i);
              oldItems.push ( { oldKey:key, data:storage.getItem (key) } );
            }

            // empty the storage
            storage.clear ();

            document.title = trFunc ('Lokale MKBeautifier-Daten werden in neues Format konvertiert: 2 v. 2',
                                     'Converting locally stored MKBeautifier data to new format: 2 of 2');

            // store the data in new format
            storage.setItem (itemFormatIDItemKey, '3');
            for (var i=0; i<numItems-1; i++)
            {
              var newKey = oldItems[i].oldKey;
              if (newKey.indexOf (ownID+'.') != 0)
              {
                  newKey = makeOwnKey (newKey);
              }
              storage.setItem (newKey, oldItems[i].data);
            }
            hasPre13DataFormat = false;
          }
          document.title = documentTitleOrig;
        }


        var isDarkTheme = true;
        getCurrentTheme ();

        function getCurrentTheme ()
        {
            themeSwitcher = document.getElementsByClassName ('switchTheme tooltip');
            if (themeSwitcher.length > 0)
            {
                var href = themeSwitcher [0].getAttribute ('href');
                if (href != null)
                {
                    var posCode = href.indexOf ('c=');
                    if (posCode > -1 && posCode < href.length-2)
                    {
                        // we are in dark theme if the link does NOT point to theme '0'
                        isDarkTheme = (href.substring (posCode+2, posCode+3) != '0');
                    }
                }
            }
        }

        var kmFilterMAXVALUE = 100000;

        var baseTimeValue = 0;
        setBaseTimeValue ();

        function setBaseTimeValue ()
        {
            d = new Date ("2017-01-01");
            d.setHours        (1);
            d.setMinutes      (0);
            d.setSeconds      (0);
            d.setMilliseconds (0);
            baseTimeValue = d.getTime ();
        }

        function getDateFromTimeOffset (offset)
        {
            var value = baseTimeValue + offset * 24 * 60 * 60 * 1000;// + ((offset > 0) ? 100 : -1000);
            var d = new Date (value);
            return d;
        }

        function getBaseTimeOffset (dOrig)
        {
            var d = dOrig;
            d.setHours   (2);
            d.setMinutes (0);
            d.setSeconds (0);
            d.setMilliseconds (0);
            var mSecsValue = d.getTime () - baseTimeValue;
            var s = (mSecsValue / (24 * 60 * 60 * 1000)).toString ();
            var posDot = s.indexOf ('.');
            if (posDot > 0)
            {
                s = s.substring (0, posDot);
            }
            else
            if (posDot == 0)
            {
                s = '1';
            }

            return s;
        }

        function getBaseTimeOffsetInt (dOrig)
        {
            var offset = getBaseTimeOffset (dOrig)
            return parseInt (offset, 10);
        }

        function getCurrentBaseTimeOffset ()
        {
            var d = new Date ();
            return getBaseTimeOffset (d);
        }

        function getCurrentBaseTimeOffsetInt ()
        {
            var offset = getCurrentBaseTimeOffset ()
            return parseInt (offset, 10);
        }


        // left padding s with c to a total of n chars
        function lPad (sOrig, c, n)
        {
            var s = sOrig;
            if (! s || ! c || s.length >= n) {
                return s;
            }
            var max = (n - s.length)/c.length;
            for (var i = 0; i < max; i++) {
                s = c + s;
            }
            return s;
        }

        // right padding s with c to a total of n chars
        function rPad (sOrig, c, n)
        {
            var s = sOrig;
            if (! s || ! c || s.length >= n) {
                return s;
            }
            var max = (n - s.length)/c.length;
            for (var i = 0; i < max; i++) {
                s += c;
            }
            return s;
        }



        function insertAfter (newNode, referenceNode)
        {
            referenceNode.parentNode.insertBefore (newNode, referenceNode.nextSibling);
        }



        function getStorageIDFromKey (key)
        {
            var storageID = key;
            var uscore = storageID.indexOf ('_');
            if (uscore > -1)
            {
                storageID = storageID.substring (uscore+1);
                var uscore = storageID.indexOf ('_');
                if (uscore > -1)
                {
                    storageID = storageID.substring (0, uscore);
                }
            }
            var intValue = parseInt (storageID, 10);
            if (Number.isNaN (intValue))
            {
                return -1;
            }
            return intValue;
        }

        var hCheck = (ownStorageGetItem (preferenceStorageKeyBASE+'hCheck') != null);

        function keyOfStoredPreferences (storageID)
        {
            return preferenceStorageKeyBASE+storageID.toString ();
        }

        function keyOfStoredArrayPreferences (storageID, idx)
        {
            return preferenceStorageKeyBASE+storageID.toString () + '_' + idx.toString ();
        }

        function stringToBoolean (s)
        {
            var sUp = s.toUpperCase ();
            return ((sUp == '1') || (sUp == 'Y') || (sUp == 'YES') || (sUp == 'J') || (sUp == 'JA') || (sUp == 'ON') || (sUp == 'ACTIVE'));
        }

        function booleanToString (status)
        {
            return (status === true) ? '1' : '0';
        }

        function booleanToInt (status)
        {
            return (status === true) ? 1 : 0;
        }


        function findAndReplaceAll (string, target, replacement)
        {
          var i = 0, length = string.length;
          var s = string;
          for (i; i < length; i++)
          {
            s = s.replace (target, replacement);
          }
          return s;
        }


        function updateSinglePreferenceValue (storageID, newValue, rowInArray)
        {
            for (var key in settings)
            {
                // skip loop if the property is from prototype
                if (!settings.hasOwnProperty (key)) continue;

                var item = settings [key];
                if (item.storageID == storageID)
                {

                    if (item.valueType == 'arrArray')
                    {
                        var i = item.idxInArray;
                        item.value [rowInArray][i] = newValue;
                        ownStorageSetItem (keyOfStoredArrayPreferences (storageID, rowInArray), booleanToString (newValue));
                    }
                    else
                    {
                        switch (item.valueType)
                        {
                            case 'boolean':
                            {
                                item.value = newValue;
                                ownStorageSetItem (keyOfStoredPreferences (storageID), booleanToString (newValue));
                                break;
                            }
                            case 'integer':
                            {
                                item.value = newValue;
                                ownStorageSetItem (keyOfStoredPreferences (storageID), newValue.toString ());
                                break;
                            }
                            case 'color':
                            {
                                // we store all colors as '#nnnnnn' HEX values
                                if (newValue.length > 1 && newValue.substring (0,1) == '#')
                                {
                                    var s = newValue.substring (1);
                                    // remove leading '0'
                                    while (s.length > 0 && s.substring (0,1) == '0')
                                    {
                                        s = s.substring (1);
                                    }
                                    var intValue = parseInt (s, 16);
                                    if ( ! Number.isNaN (intValue))
                                    {
                                        item.value = newValue;
                                        ownStorageSetItem (keyOfStoredPreferences (storageID), newValue);
                                    }
                                }
                                break;
                            }
                        }
                    }
                }
            }
        }


        function readPreferences (storageID, valueType, defaultValue, idxInArray)
        {
            var resValue = defaultValue;
            if (valueType == 'arrArray')
            {
                for (var i = 0; i < resValue.length; i++)
                {
                    var storedValue = ownStorageGetItem (keyOfStoredArrayPreferences (storageID, i));
                    if ( ! (storedValue === null))
                    {
                        resValue [i][idxInArray] = stringToBoolean (storedValue);
                    }
                }
            }
            else
            {
                var storedValue = ownStorageGetItem (keyOfStoredPreferences (storageID));
                if ( ! (storedValue === null))
                {
                    switch (valueType)
                    {
                        case 'boolean':
                        {
                            resValue = stringToBoolean (storedValue);
                            break;
                        }
                        case 'color':
                        {
                            // we store all colors as '#nnnnnn' HEX values
                            if (storedValue.length > 1 && storedValue.substring (0,1) == '#')
                            {
                                var s = storedValue.substring (1);
                                var intValue = parseInt (s, 16);
                                if ( ! Number.isNaN (intValue))
                                {
                                    resValue = storedValue;
                                }
                            }
                            break;
                        }
                        case 'integer':
                        {
                            var intValue = parseInt (storedValue, 10);
                            if ( ! Number.isNaN (intValue))
                            {
                                resValue = intValue;
                            }
                            break;
                        }
                    }
                }
            }
            return resValue;
        }


        function readAllPreferences (obj)
        {
            for (var key in obj)
            {
                // skip loop if the property is from prototype
                if (!obj.hasOwnProperty (key)) continue;

                var item = obj [key];
                item.value = readPreferences (item.storageID, item.valueType, item.origValue, item.idxInArray);
            }
        }


        // Note: We use this explicit valueType as type information to have more control
        //       than we would have by using typeof ()
        var settings = new Object ();
        settings.AddToMenu_NeueFotos                  = {value: null, storageID: 1, valueType: 'arrArray',
                                                        origValue: origSettingAddToMenu_NeueFotos,                  idxInArray: 3};
        settings.AddToMenu_NeueFotos_justNear         = {value: null, storageID: 2, valueType: 'boolean',
                                                        origValue: origSettingAddToMenu_NeueFotos_justNear,         idxInArray: 0};
        settings.AddToMenu_NeueFotos_justNotTooFar    = {value: null, storageID: 3, valueType: 'boolean',
                                                         origValue: origSettingAddToMenu_NeueFotos_justNotTooFar,   idxInArray: 0};
        settings.ShowNoteOnSedcard                    = {value: null, storageID: 4, valueType: 'boolean',
                                                        origValue: origSettingShowNoteOnSedcard,                    idxInArray: 0};
        settings.MaxLengthForNoteOnSedcard            = {value: null, storageID: 5, valueType: 'integer',
                                                        origValue: origSettingMaxLengthForNoteOnSedcard,            idxInArray: 0};
        settings.UseAdditionalLocalUserFlags          = {value: null, storageID: 6, valueType: 'boolean',
                                                        origValue: origSettingUseAdditionalLocalUserFlags,          idxInArray: 0};
        settings.BeautifyPNTexts                      = {value: null, storageID: 7, valueType: 'boolean',
                                                        origValue: origSettingBeautifyPNTexts,                      idxInArray: 0};
        settings.DarkThemeColorForPNs_UserNames       = {value: null, storageID: 8, valueType: 'color',
                                                        origValue: origSettingDarkThemeColorForPNs_UserNames,       idxInArray: 0};
        settings.DarkThemeColorForPNs_Content         = {value: null, storageID: 9, valueType: 'color',
                                                        origValue: origSettingDarkThemeColorForPNs_Content,         idxInArray: 0};
        settings.KmFilterNear                         = {value: null, storageID:10, valueType: 'integer',
                                                        origValue: origSettingKmFilterNear,                         idxInArray: 0};
        settings.KmFilterNotTooFar                    = {value: null, storageID:11, valueType: 'integer',
                                                        origValue: origSettingKmFilterNotTooFar,                    idxInArray: 0};
        settings.InfoColor_Near                       = {value: null, storageID:12, valueType: 'color',
                                                        origValue: origSettingInfoColor_Near,                       idxInArray: 0};
        settings.InfoColor_NotTooFarAway              = {value: null, storageID:13, valueType: 'color',
                                                        origValue: origSettingInfoColor_NotTooFarAway,              idxInArray: 0};
        settings.InfoColor_FarAway                    = {value: null, storageID:14, valueType: 'color',
                                                        origValue: origSettingInfoColor_FarAway,                    idxInArray: 0};
        settings.HighlightNamesWhenNearOrNotTooFar    = {value: null, storageID:15, valueType: 'boolean',
                                                        origValue: origSettingHighlightNamesWhenNearOrNotTooFar,    idxInArray: 0};
        settings.HighlightNamesWhenKmNearFilterActive = {value: null, storageID:16, valueType: 'boolean',
                                                        origValue: origSettingHighlightNamesWhenKmNearFilterActive, idxInArray: 0};
        settings.HighlightFavoritesLikeNear           = {value: null, storageID:17, valueType: 'boolean',
                                                        origValue: origSettingHighlightFavoritesLikeNear,           idxInArray: 0};
        settings.AddColorBarAsSedcardTypeIndicator    = {value: null, storageID:18, valueType: 'boolean',
                                                        origValue: origSettingAddColorBarAsSedcardTypeIndicator,    idxInArray: 0};
        settings.RemoveFramesFromNewFotos             = {value: null, storageID:19, valueType: 'boolean',
                                                        origValue: origSettingRemoveFramesFromNewFotos,             idxInArray: 0};
        settings.BeautifyUserStatusLightForPhotoLinks = {value: null, storageID:20, valueType: 'boolean',
                                                        origValue: origSettingBeautifyUserStatusLightForPhotoLinks, idxInArray: 0};
        settings.RemoveUserStatusLightFromPhotoLinks  = {value: null, storageID:21, valueType: 'boolean',
                                                        origValue: origSettingRemoveUserStatusLightFromPhotoLinks,  idxInArray: 0};
        settings.RemoveFiguresIfUserIgnored           = {value: null, storageID:22, valueType: 'boolean',
                                                        origValue: origSettingRemoveFiguresIfUserIgnored,           idxInArray: 0};
        settings.SinglePhotoPageShowLocationAtTop     = {value: null, storageID:23, valueType: 'boolean',
                                                        origValue: origSettingSinglePhotoPageShowLocationAtTop,     idxInArray: 0};
        settings.SinglePhotoPageShowNotesAtTop        = {value: null, storageID:24, valueType: 'boolean',
                                                        origValue: origSettingSinglePhotoPageShowNotesAtTop,        idxInArray: 0};
        settings.AddVotingButtonsToThreadList         = {value: null, storageID:25, valueType: 'boolean',
                                                        origValue: origSettingAddVotingButtonsToThreadList,         idxInArray: 0};
        settings.MinimizePostingsIfUserIgnored        = {value: null, storageID:26, valueType: 'boolean',
                                                        origValue: origSettingMinimizePostingsIfUserIgnored,        idxInArray: 0};
        settings.HidePNTitleIfUserIgnored             = {value: null, storageID:27, valueType: 'boolean',
                                                        origValue: origSettingHidePNTitleIfUserIgnored,             idxInArray: 0};
        settings.HighlightNetworkLikeNear             = {value: null, storageID:29, valueType: 'boolean',
                                                        origValue: origSettingHighlightNetworkLikeNear,             idxInArray: 0};
        settings.ShowListOfDaysAtTopOfStartpage       = {value: null, storageID:30, valueType: 'boolean',
                                                        origValue: origSettingShowListOfDaysAtTopOfStartpage,       idxInArray: 0};
        settings.ShowListOfDaysAtBottomOfStartpage    = {value: null, storageID:31, valueType: 'boolean',
                                                        origValue: origSettingShowListOfDaysAtBottomOfStartpage,    idxInArray: 0};

        settings.SearchResultPageStrikeOutIfSilentIgnored = {value: null, storageID:32, valueType: 'boolean',
                                                            origValue: origSettingSedcardSearchResultPageStrikeOutIfSilentIgnored, idxInArray: 0};
        settings.SearchResultPageHideIfSilentIgnored      = {value: null, storageID:33, valueType: 'boolean',
                                                            origValue: origSettingSedcardSearchResultPageHideIfSilentIgnored,      idxInArray: 0};
        settings.ShowShowUserIDOnStartpage                = {value: null, storageID:34, valueType: 'boolean',
                                                            origValue: origSettingShowUserIDOnStartpage,            idxInArray: 0};
        settings.JustTheFutureCountersOnStartpage         = {value: null, storageID:35, valueType: 'boolean',
                                                            origValue: origSettingJustTheFutureCountersOnStartpage, idxInArray: 0};
        settings.HighlightPNTitleIfUserHasSmiley          = {value: null, storageID:36, valueType: 'boolean',
                                                            origValue: origSettingHighlightPNTitleIfUserHasSmiley,  idxInArray: 0};

        settings.RemoveFiguresOfMaleModels                = {value: null, storageID:42, valueType: 'boolean',
                                                             origValue: origSettingRemoveFiguresOfMaleModels,       idxInArray: 0};

        readAllPreferences (settings);




        function shadowCodeForOutline (linkColor)
        {
            return 'text-shadow: '           +
                '-1px -1px 0 '+linkColor+',' +
                ' 1px -1px 0 '+linkColor+',' +
                '-1px  1px 0 '+linkColor+',' +
                ' 1px  1px 0 '+linkColor+';';
        }


        // values of the 16 bits in the user storage "FLAGS" field
        var userFlag =
        {
            SMILEY:           0x0001,
            SAD:              0x0002,
            WARNING:          0x0004,
            IGNORED:          0x0008,
            IS_IGNORING_ME:   0x000C,  // 0x0004 + 0x0008
            EXCLAMATIONS:     0x0010,
            EXCLAMATION:      0x0020,
            QUESTION:         0x0040,
            QUESTIONS:        0x0080,
            FLOWER:           0x0100,
            SUN:              0x0200,
            MUSIC:            0x0400,
            CHECK:            0x0800,
            DIAMOND:          0x1000,

            LITTLE_SMILE:     0x2000,
            CHECK_OK:         0x4000,
            STOPWATCH:        0x8000
        };

        var silentIgnoreSymbol = '<span style="font-size:70%">&#x2590;i&#x258C;</span>';
        var exclamationsSymbol = '<span style="font-size:110%">!!</span>&nbsp;';

        //   value                          nameOfElement        title                                        on-symbol                off-symbol                 gap
        var niceUserFlags =
        [
            [userFlag.SMILEY,               'smileyFlag',        tr ('Hohe Wichtigkeit',
                                                                     'Importance HIGH'),                      '<big>&#9787;</big>',    '<big>&#9787;</big>',      0
            ],
            [userFlag.LITTLE_SMILE,         'noSmileNotSadFlag', tr ('Mittlere Wichtigkeit',
                                                                     'Importance Medium'),                    '<big>&#9786;</big>',    '<big>&#9786;</big>',      0
            ],
            [userFlag.SAD,                  'sadFlag',           tr ('Geringe Wichtigkeit',
                                                                     'Importance Low'),                       '&#9785;',               '&#9785;',                 0
            ],
            [userFlag.WARNING,              'warningFlag',       tr ('Warnung',
                                                                     'Warning'),                              '&#9888;',               '&#9888;',                 0
            ],
            [userFlag.IGNORED,              'silentIgnore',      tr ('Silent Ignore',
                                                                     'Silent Ignore'),                        silentIgnoreSymbol,      silentIgnoreSymbol,        5
            ],

            [userFlag.EXCLAMATIONS,         'exclamationsFlag',  tr ('Wahrscheinlichkeit: Ganz sicher!!',
                                                                     'Probability: Surely!!'),                exclamationsSymbol,      exclamationsSymbol,        0
            ],
            [userFlag.EXCLAMATION,          'exclamationFlag',   tr ('Wahrscheinlichkeit: Vermutlich',
                                                                     'Probability: Likely'),                  '!&nbsp;',               '!&nbsp;',                 0
            ],
            [userFlag.QUESTION,             'questionFlag',      tr ('Wahrscheinlichkeit: Vielleicht?',
                                                                     'Probability: Perhaps?'),                '?',                     '?',                       0
            ],
            [userFlag.QUESTIONS,            'questionsFlag',     tr ('Wahrscheinlichkeit: Unwahrscheinlich?',
                                                                     'Probability: Unlikely?'),               '??',                    '??',                      4
            ],

            [userFlag.FLOWER,               'flowerFlag',        tr ('Aspekt: Blume','Aspect: Flower'),       '<big>&#10048;</big>',   '<big>&#10048;</big>',     0
            ],
            [userFlag.SUN,                  'sunFlag',           tr ('Aspekt: Sonne','Aspect: Sun'),          '<font style="font-size: 150%"><span style=" border-radius: 25px; background-color:#753f75">&#9788;</span></font>',    '<big>&#9788;</big>',      0
            ],
            [userFlag.MUSIC,                'workingFlag',       tr ('Aspekt: Musik','Aspect: Music'),        '<big>&#9835;</big>',     '<big>&#9835;</big>',     0
            ],
            [userFlag.CHECK,                'checkFlag',         tr ('Aspekt: Kreuzchen','Aspect: Cross'),    '<big>&#10007;</big>',   '<big>&#10007;</big>',     0
            ],
            [userFlag.CHECK_OK,             'checkOkFlag',       tr ('Aspekt: Häkchen','Aspect: Check'),      '&#x2713;',              '&#x2713;',                0
            ],
            [userFlag.DIAMOND,              'diamondFlag',       tr ('Aspekt: Diamant','Aspect: Diamond'),    '&#10070;',              '&#10070;',                4
            ],
            [userFlag.STOPWATCH,            'stopwatchButton',   tr ('Tagezähler','days counter'),            '<big>&#x231A;</big>',   '<big>&#x231A;</big>',     0
            ]
        ];



        var noteUnknownText = tr( '(evtl. Notiz vorhanden, bitte einmal die Sedcard anklicken)',
                                  '(there might be a Note, please goto the sedcard of this user to update your MKBeautifier data)');
        var noteUnknownInfoline = tr( '(Teilnehmer-Infos noch nicht im Cache. Wenn gewünscht, bitte hier klicken, um die Sedcard aufzurufen.)',
                                      '(No user information cached yet. If desired just click here to go to the user\'s portfolio.)');

        var colorForSadFlag = '#f60'; // (isDarkTheme ? '#f60' : '#004');

        function makeTooltipForDelta (delta, realOffset)
        {
            var theDate = getDateFromTimeOffset (realOffset);
            var dateStr = theDate.getDate     ().toString ()
                        + '.'
                        +(theDate.getMonth    ()+1).toString ()
                        + '.'
                        + theDate.getFullYear ().toString ();
            if (delta > 1)
            {
                return ' ( '+trFunc ('Vor ','')+delta.toString ()+trFunc (' Tagen war der ',' days ago we had ')+dateStr+' ) ';
            }
            if (delta > 0)
            {
                return ' ( '+trFunc ('Gestern war der ','Yesterday we had ')+dateStr+'. ) ';
            }
            if (delta < -2)
            {
                return trFunc (' Nur noch ','Just ')+ (-delta).toString ()+trFunc (' Tage bis zum ',' more days to ')+dateStr+' ';
            }
            if (delta < -1)
            {
                return trFunc (' Übermorgen ist es der ','Just two more days to ')+dateStr+' ';
            }
            if (delta < 0)
            {
                return trFunc (' Morgen ist der ','Tomorrow we will have ')+dateStr+' ';
            }
            return trFunc (' Heute ist der ','Today we have ')+dateStr+' ';
        }

        var backgroundToday = '#8fd';
        var foregroundToday = '#008';

        function makeTokenForDays (isOn, ignored_param_makeImg, veryCompactDays, delta, realOffset, leadingGap, fullDesign)
        {
            var makeImg = false;

            var dayToken = '';
            var dayToken = '';
            var tooltip  = isOn ? makeTooltipForDelta (delta, realOffset) : '';
            if (isOn)
            {
                var spanBase   = '<small title="' +tooltip+ '" style="white-space: nowrap; '+
                                 (fullDesign ? 'background-color:'+(delta ? '#000':backgroundToday)+'; ':'')+
                                 'color:';

                var spanMid    = '" class="spanOfDaysNumber">'+ (veryCompactDays ? '&nbsp;' : '&nbsp;&nbsp;') + (fullDesign ? '<b>':'');

                var redSpanA   = spanBase + '#fa0' + spanMid;
                var greenSpanA = spanBase + (fullDesign ? '#0f0' : '#008600') + spanMid;
                var whiteSpanA = spanBase + foregroundToday + spanMid;
                var spanZ   = (fullDesign ? '</b>':'') + (veryCompactDays ? '&nbsp;' : '&nbsp;&nbsp;') + '</small>';

                //alert (delta);

                var isMinus = (delta < 0);
                var dayString   = isMinus ? (-delta).toString () : delta.toString ();
                var deltaString = isMinus ? ('<b>'+dayString+'</b>') : dayString;
                if (dayString.length == 1)
                {
                    deltaString = '&nbsp;'+deltaString+'&nbsp;';
                }

                /*
                if (delta < -731)
                {
                    dayToken = makeImg ? 'minus_x_'+trFunc ('DE','EN') : (greenSpanA + trFunc ('>2&nbsp;J','>2&nbsp;y') + spanZ);
                }
                else
                */
                if (delta < 0)
                {
                    dayToken = makeImg ? 'minus_'+ -delta.toString ()  : (greenSpanA + deltaString + spanZ);
                }
                /*
                else if (delta > 731)
                {
                    dayToken = makeImg ? 'plus_x_'+trFunc ('DE','EN')  : (redSpanA + trFunc ('>2&nbsp;J','>2&nbsp;y') + spanZ);
                }
                */
                else if (delta > 0)
                {
                    dayToken = makeImg ? 'plus_'+delta.toString ()     : (redSpanA + deltaString + spanZ);
                }
                else
                {
                    dayToken = makeImg ? 'day_0'                       : (whiteSpanA + '&nbsp;0&nbsp;' + spanZ);
                }
            }
            else
            {
                dayToken = makeImg ? 'day_off' : '';
            }
            return dayToken;
        }

        function getUserFlagsObject (user, userIsFavorite, userInNetwork, size, color, veryCompact, ret_object,
                                     createFlagsLineAsTDs, showDaysAsImg, veryCompactDays, daysCounterFirst, theStyle,
                                     userStorageObjectOrig)
        {
            var userStorageObject = (userStorageObjectOrig == null) ? getUserStorageObject (user) : userStorageObjectOrig;

            var spanBackground = '';
            if (! isDarkTheme)
            {
                spanBackground = '; background-color:#111';
            }
            var spanBase = '<span class="spanBaseInUserFlagsObject" style="text-align: center; font-size:'+size+'px; font-weight:normal; color:';
            var defaultSpanA   = spanBase + color + spanBackground  +  '">';
            var diamondSpanA   = spanBase + '#acf; background-color:#004">';
            var sadSpanA       = spanBase + colorForSadFlag+'">';
            var warningSpanA   = spanBase + '#600; background-color:#fd8">';
            var ignoredSpanA   = spanBase + '#600; background-color:#000">';
            var ignoresMeSpanA = spanBase + (veryCompact ? '#b00' : '#900')+'; white-space: nowrap; background-color:'+(veryCompact ? '#000' : '#3c3c3c')+'">';

            var darkSpanA   = spanBase + '#000' + spanBackground  +  '">';
            var tdGap = '<td style="background-color:#1C1C1C">&nbsp;</td>';

            var spanZ = '</span>';
            var text = '';

            ret_object.found          = false;
            ret_object.hasStopwatch   = false;
            ret_object.stopwatchDelta = 0;
            ret_object.hasFlagHappy   = false;
            ret_object.hasFlagSad     = false;
            ret_object.hasFlagWarning = false;
            ret_object.hasFlagIgnore  = false;
            ret_object.isIgnoringMe   = false;
            ret_object.isFavorite = userIsFavorite;
            ret_object.inNetwork  = userInNetwork;

            ret_object.ValueSmiley       = 0;
            ret_object.ValueLittleSmile  = 0;
            ret_object.ValueSad          = 0;
            ret_object.ValueWarning      = 0;
            ret_object.ValueIgnore       = 0;
            ret_object.ValueExclamations = 0;
            ret_object.ValueExclamation  = 0;
            ret_object.ValueQuestion     = 0;
            ret_object.ValueQuestions    = 0;
            ret_object.ValueFlower       = 0;
            ret_object.ValueSun          = 0;
            ret_object.ValueMusic        = 0;
            ret_object.ValueCheck        = 0;
            ret_object.ValueCheckOK      = 0;
            ret_object.ValueDiamond      = 0;
            ret_object.ValueStopwatch    = 0;

            ret_object.importance     = 6;
            ret_object.probability    = 6;
            ret_object.aspectValue    = 0;

            if (user== ownID)
            {
                ret_object.text = '';
                return;
            }

            var tdOpen          = createFlagsLineAsTDs ? '<td '+theStyle+'>' : '';
            var tdOpenFavorites = createFlagsLineAsTDs ? '<td width="40px" align="center" valign="center" '+theStyle+'>' : '';
            var tdClose         = createFlagsLineAsTDs ? '</td>' : '';


            var orderedFlags = new Array ();
            if (daysCounterFirst)
            {
                niceUserFlags.forEach (function (niceFlag, index, array)
                {
                    var userFlagID = niceFlag [0];
                    if (userFlagID == userFlag.STOPWATCH)
                    {
                        orderedFlags.push (niceFlag);
                    }
                });
            }
            niceUserFlags.forEach (function (niceFlag, index, array)
            {
                var userFlagID = niceFlag [0];
                if (! daysCounterFirst || userFlagID != userFlag.STOPWATCH)
                {
                    orderedFlags.push (niceFlag);
                }
            });


            orderedFlags.forEach (function (niceFlag, index, array)
            {
                var newOpen = '';

                var userFlagID = niceFlag [0];

                var flagFound = userHasFlag (user, userFlagID, userStorageObject);
                var addToken  = flagFound || createFlagsLineAsTDs;

                    text = text + tdOpen;

                    var token = (createFlagsLineAsTDs || veryCompact) ? niceFlag [3].trim () : niceFlag [3];

                    if (flagFound)
                    {
                        ret_object.found = true;
                    }
                    if (flagFound && text.length > 0 && ! veryCompact && ! createFlagsLineAsTDs)
                    {
                        text = text+' ';
                    }


                    if (flagFound)
                    {
                        switch (userFlagID)
                        {
                            case userFlag.SMILEY:
                                ret_object.importance      = 10;
                                ret_object.ValueSmiley     =  1;
                                break;
                            case userFlag.LITTLE_SMILE:
                                ret_object.importance       = 8;
                                ret_object.ValueLittleSmile = 1;
                                break;
                            case userFlag.SAD:
                                ret_object.importance       = 4;
                                ret_object.ValueSad         = 1;
                                break;
                            case userFlag.WARNING:
                                ret_object.importance       = 2;
                                ret_object.ValueWarning     = 1;
                                break;
                            case userFlag.IGNORED:
                                ret_object.importance       = 0;
                                ret_object.ValueIgnore      = 1;
                                break;

                            case userFlag.EXCLAMATIONS:
                                ret_object.probability       = 10;
                                ret_object.ValueExclamations =  1;
                                break;
                            case userFlag.EXCLAMATION:
                                ret_object.probability       =  8;
                                ret_object.ValueExclamation  =  1;
                                break;
                            case userFlag.QUESTION:
                                ret_object.probability       =  4;
                                ret_object.ValueQuestion     =  1;
                                break;
                            case userFlag.QUESTIONS:
                                ret_object.probability       =  2;
                                ret_object.ValueQuestions    =  1;
                                break;

                            case userFlag.FLOWER:
                                ret_object.aspectValue += 10000;
                                ret_object.ValueFlower  = 1;
                                break;
                            case userFlag.SUN:
                                ret_object.aspectValue += 1000;
                                ret_object.ValueSun     = 1;
                                break;
                            case userFlag.MUSIC:
                                ret_object.aspectValue += 100;
                                ret_object.ValueMusic   = 1;
                                break;
                            case userFlag.CHECK:
                                ret_object.aspectValue += 10;
                                ret_object.ValueCheck   = 1;
                                break;
                            case userFlag.CHECK_OK:
                                ret_object.aspectValue += 5;
                                ret_object.ValueCheckOK = 1;
                                break;
                            case userFlag.DIAMOND:
                                ret_object.aspectValue += 1;
                                ret_object.ValueDiamond = 1;
                                break;
                            case userFlag.STOPWATCH:
                                ret_object.ValueStopwatch = 1;
                                var storedDelta = getUserStorageValue (user, userStorageToken.TS_STOPWATCH, userStorageObject);

                                ret_object.stopwatchStoredDelta = storedDelta;
                                ret_object.stopwatchDelta       = getCurrentBaseTimeOffsetInt () - storedDelta;
                                break;
                        }
                    }

                    if (addToken)
                    {
                        switch (userFlagID)
                        {
                            case userFlag.DIAMOND:
                                text = text + (veryCompact ? '' : '&nbsp;') + (flagFound?diamondSpanA:darkSpanA) + token + spanZ + (veryCompact ? '' : '&nbsp;');
                                break;
                            case userFlag.WARNING:
                                ret_object.hasFlagWarning = flagFound;
                                text = text + (flagFound?warningSpanA:darkSpanA) + token + spanZ;
                                break;
                            case userFlag.IGNORED:
                                ret_object.hasFlagIgnore = flagFound;
                                text = text + (flagFound?ignoredSpanA:darkSpanA) + token + spanZ;
                                break;
                            case userFlag.SMILEY:
                                ret_object.hasFlagHappy = flagFound;
                                text = text + (flagFound?defaultSpanA:darkSpanA) + token + spanZ;
                                break;
                            case userFlag.SAD:
                                ret_object.hasFlagSad = flagFound;
                                text = text + (flagFound?sadSpanA:darkSpanA) + token + spanZ;
                                break;
                            case userFlag.STOPWATCH:
                                ret_object.hasStopwatch =  flagFound
                                                        && (ret_object.stopwatchDelta != undefinedStopwatchValue);

                                text = text + (flagFound?defaultSpanA:darkSpanA) +
                                        makeTokenForDays (flagFound, showDaysAsImg, veryCompactDays,
                                                          ret_object.stopwatchDelta, ret_object.stopwatchStoredDelta,
                                                          createFlagsLineAsTDs || ! daysCounterFirst, ! daysCounterFirst) + spanZ;
                                break;
                            default:
                                text = text + (flagFound?defaultSpanA:darkSpanA) + token + spanZ;
                        }
                    }

                    text = text + tdClose;

                    if (createFlagsLineAsTDs)
                    {
                        switch (userFlagID)
                        {
                            case userFlag.SMILEY:
                                text = tdGap + text;
                                break;
                            case userFlag.IGNORED:
                            case userFlag.QUESTIONS:
                            case userFlag.DIAMOND:
                            case userFlag.STOPWATCH:
                                text = text + tdGap;
                        }
                    }
            });

            ret_object.isIgnoringMe = ret_object.hasFlagWarning && ret_object.hasFlagIgnore;

            if (ret_object.isIgnoringMe)
            {
                // user is ignoring me, so we show one single indicator instead of the row of flags
                var gap  = veryCompact ? '' : '&nbsp;';
                var hint = veryCompact
                    ? trFunc ('ign.m.','ign.m.')
                    : trFunc ('ignoriert mich','is ignoring me');
                text = tdOpen + ignoresMeSpanA + '<small>&nbsp;'+hint+gap+'</small>' + spanZ + tdClose;
            }

            var favoriteMarker = '';
            if (userIsFavorite || userInNetwork)
            {
                var toolTip = '';
                ret_object.found = true;

                var heartSizeValue = size * ((userInNetwork && userIsFavorite) ? 1.0 : (userInNetwork ? 5/7 : 6/5));
                var heartSize = heartSizeValue.toString ();
                var posDot    = heartSize.indexOf ('.');
                if (posDot > -1)
                {
                    heartSize = heartSize.substring (0, posDot);
                }
                var symbol = '';
                if (userIsFavorite)
                {
                    if (userInNetwork)
                    {
                        symbol  = '&#128147;'; // Heart pulse
                        toolTip = trFunc ('*** in Deinen Favoriten und im Netzwerk ***','*** in your Favorites and also in your Network ***');
                    }
                    else
                    {
                        symbol  = '&hearts;';
                        toolTip = trFunc ('*** in Deinen Favoriten ***','*** in your Favorites ***');
                    }
                }
                else
                {
                    symbol  = '&#128154;'; // Green heart
                    toolTip = trFunc ('*** in Deinem Netzwerk ***','*** in your Network ***');
                }
                favoriteMarker = '<span title="'+toolTip+'" style="font-size:'+heartSize+'px; font-weight:normal; color:#f10">'+symbol+'</span>'
            }
            if (createFlagsLineAsTDs || favoriteMarker.length > 0)
            {
                text = text + tdOpenFavorites + (createFlagsLineAsTDs ? '' : (veryCompact ? '&nbsp;' : ' &nbsp; ')) + favoriteMarker + tdClose;
                if (createFlagsLineAsTDs)
                {
                    text = text + tdGap;
                }
            }

            ret_object.text = text;
        }



        // Names of the tokens in a local user storage item entry:
        //
        // (all timestamps are stored as ['-'] + [intValue] + ':'
        //  intValue is a 1-based DAY offset of 1.1.2017
        //  (so a value of 1 means 1.1.2017, zero means undefined, hours are ignored)
        //  if a timestamp it only one ':' char its value is undefined)

        var userStorageToken =
        {
            TS_UPDATE:    0,  // timestamp of the last time when the entry was updated
                              // (needed to detect "deletable old entries" when localStorage is nearly full)

            FAVORITE:     1,  // user is in my favorites
            NETWORK:      2,  // user is in my network
            KM:           3,

            TS_STOPWATCH: 4,  // timestamp of the stopwatch start day (if activated on the user's sedcard)

            FLAGS:        5,  // see the "userFlag" definitions above
            NOTE:         6
        };


        // Structure of user storage item entry:
        //
        //
        // content         length  trailing   meaning
        //                        (optional?)
        //
        //
        // TS-update       ?       ':'        timestamp: last update of ths entry
        //
        // System Flags    1                  flag bits in 1 HEX digit:(bit 1 is unused, a small reserve for future changes)
        // (favorite and/or                                             bit 2:'1' if user is in my favorites
        //  network                                                     bit 3:'1' if user is in my network
        //                                                             (bit 4 is unused, a small reserve for future changes)
        //
        // Km              >=1    (':')       distance from my position, or '-1' if unknown
        //                                    (as of the last time when I visited the sedcard)
        //
        //
        // *** optional tokens ***
        //
        // (the string may end before/after each of the following tokens)
        //
        //
        // TS-stopwatch    ?      (':')       timestamp: start of the stopwatch (if it was activated)
        //
        // FLAGS           4                  flag bits in 4 HEX digits: '0000'..'FFFF'
        //                                    (see the "userFlag" array defined above)
        //                                    (if the string ends before, FLAGS is assumed '0000')
        //
        // len of Note     ?      (':')       the length of the Note I have stored at this user's sedcard
        //                                    (if the string ends before, len of Note is assumed Zero)
        //
        // Note            ?                  the Note (if any)
        //
        //
        //
        // rules:
        //
        //    1. Tokens must be found in the order shown above.
        //    2. The string may end before/after each of the tokens in the optional part,
        //       but until it ends the order needs to be observed:
        //       It is NOT allowed to leave out a token if the following token is stored.
        //    3. Any token stored in the string MUST be valid!
        //       Invalid data found for any token invalidates the complete entry.
        //    4. Trailing ':' may be omitted if no further data in the string!
        //       (of course that means the trailing ':' may NOT be omitted after "TS-updated")


        var undefinedStopwatchValue = 1000000;

        // If 2nd parameter is false, this will automatically set the "update" counter
        // so afterwards the value of object.tsUpdate
        // will be different than before.
        function createUserStorageItemFromObject (object, updateTsUpdate)
        {
            if (updateTsUpdate)
            {
                object.tsUpdate = getCurrentBaseTimeOffset ();
            }

            var sysValue = 0;
            /* reserve for later use:
            if (object. ... == '1')
            {
                sysValue =                     1;
            }
            */
            if (object.favorite == '1')
            {
                sysValue = sysValue +          2;
            }
            if (object.network == '1')
            {
                sysValue = sysValue +          4;
            }
            /* reserve for later use:
            if (object. ... == '1')
            {
                sysValue = sysValue +          8;
            }
            */
            sysFlags = sysValue.toString (16).toUpperCase();

            var s = object.tsUpdate.toString () + ':'
                + sysFlags
                + object.km;

            var lenOfNote = object.note.length;

            if (object.tsStopwatch == undefinedStopwatchValue && object.flags == '0000' && lenOfNote == 0)
            {
                return s;
            }

            s = s + ':'; // trailing colon for km

            if (object.tsStopwatch != undefinedStopwatchValue)
            {
                s = s + object.tsStopwatch.toString ();
            }

            if (object.flags == '0000' && lenOfNote == 0)
            {
                return s;
            }

            s = s + ':'; // trailing colon for Stopwatch

            s = s + object.flags;

            if (lenOfNote == 0)
            {
                return s;
            }

            s = s + lenOfNote.toString (10) + ':' + object.note;

            return s;
        }


        // this initializes tsUpdate to Zero
        // (but not to current day offset)
        function createNewUserStorageObject ()
        {
            var object = new Object ();

            object.tsUpdate     =  0;
            object.favorite     = '0';
            object.network      = '0';
            object.km           = '-1';
            object.tsStopwatch  =  undefinedStopwatchValue;
            object.flags        = '0000';
            object.note         = '';

            return object;
        }


        function objectHasSettingsOfMine (object)
        {
            if (object === null)
            {
                return false;
            }
            return object.favorite    == '1'
                || object.network     == '1'
                || object.tsStopwatch != undefinedStopwatchValue
                || object.flags       != '0000'
                || object.note        != '';
        }

        function objectHasStopwatchSet (object)
        {
            if (object === null)
            {
                return false;
            }
            return userHasFlag (0, userFlag.STOPWATCH, object) && object.tsStopwatch != undefinedStopwatchValue;
        }


        function objectHasStopwatchOrMKFlagsOrMKBeautifierFlagsOrNote (object)
        {
            if (object === null)
            {
                return false;
            }
            if (hCheck && ((object.flags == '4000') || (object.flags == '0802') || (object.flags == '4802')))
            {
                object.flags = '0000';
            }
            return object.favorite    == '1'
                || object.network     == '1'
                || objectHasStopwatchSet (object)
                || object.flags       != '0000'
                || object.note.length  > 0;
        }


        function objectHasNoteOrStopwatchOrMKBeautifierFlagsSet (object)
        {
            if (object === null)
            {
                return false;
            }
            return objectHasStopwatchSet (object)
                || object.flags       != '0000'
                || object.note.length  > 0;
        }


        function cutOutNextColonDelimitedToken (sOrig, token, takeAllIfNoColonFound)
        {
            var s       = sOrig;
            var pos     = s.indexOf (':');
            token.value = '';

            if (pos < 0)
            {
                if (takeAllIfNoColonFound)
                {
                    token.value = s;
                    s      = '';
                }
            }
            else
            {
                if (pos > 0)
                {
                    token.value = s.substring (0, pos);
                }
                if (pos+1 < s.length)
                {
                    s = s.substring (pos+1);
                }
                else
                {
                    s = '';
                }
            }
            return s;
        }


        // this does NOT modify tsUpdate
        // so we may call it in cleanLocalStorage ()
        function getUserStorageObjectFromString (sOrig)
        {
            if (sOrig == null)
            {
                return null;
            }

            var object = createNewUserStorageObject ();

            var s = sOrig;

            var token = new Object ();

            s = cutOutNextColonDelimitedToken (s, token, false);
            if (token.value.length < 1)
            {
                return null;  // tsUpdate MUST contain a valid intValue
            }
            {
                var intValue = parseInt (token.value, 10);
                if (Number.isNaN (intValue))
                {
                    return null;  // invalid data
                }
                object.tsUpdate = intValue;
            }

            if (s.length < 2)
            {
                return null;
            }


            var sysFlags = s.substring (0,1);
            s            = s.substring (  1);
            var sysValue = parseInt ('0x'+sysFlags, 16);
            if (Number.isNaN (sysValue))
            {
                return null;
            }
            object.favorite = ((sysValue & 2) == 2) ? '1' : '0';
            object.network  = ((sysValue & 4) == 4) ? '1' : '0';


            s = cutOutNextColonDelimitedToken (s, token, true);  // trailing ':' might be missing
            if (token.value.length < 1)
            {
                return null;  // km must be stored
            }
            object.km = token.value.trim ();


            // *** optional tokens ***
            //
            // (the string may end before/after each of the following tokens)

            if (s.length == 0)
            {
                return object;
            }

            s = cutOutNextColonDelimitedToken (s, token, true);  // trailing ':' might be missing
            if (token.value.length > 0)
            {
                var intValue = parseInt (token.value, 10);
                if (Number.isNaN (intValue))
                {
                    return null;  // invalid data
                }
                object.tsStopwatch = intValue;
            }

            if (s.length == 0)
            {
                return object;
            }

            if (s.length < 4)
            {
                return null; // IF there is any more data it must be at least the 4 chars of FLAGS
            }

            object.flags = s.substring (0,4);
            s            = s.substring (  4);

            if (s.length == 0)
            {
                return object;
            }

            s = cutOutNextColonDelimitedToken (s, token, true);  // trailing ':' might be missing
            if (token.value.length > 0)
            {
                var intValue = parseInt (token.value);
                if (Number.isNaN (intValue))
                {
                    return null; // invalid data
                }
                var lenOfNote = intValue;

                if (lenOfNote > 0)
                {
                    if (lenOfNote > s.length)
                    {
                        object.note = s;  // strange feelings: not all of the note had been stored as planned?
                    }
                    else
                    {
                        object.note = s.substring (0, lenOfNote);
                    }
                    object.note = object.note.replace ('"', '&quot;');
                }
            }

            return object;
        }


        function makeUserStorageItemKey (userID)
        {
            var intValue = Number(userID);
            if (! Number.isNaN (intValue))
            {
                return 'u'+intValue.toString (16).toUpperCase();
            }
            return 'u'+userID;
        }


        // This will automatically set the "update" counter
        // so afterwards the value of object.tsUpdate
        // will be different than before.
        function getUserStorageObject (userID)
        {
            var newKey = makeUserStorageItemKey (userID);
            var storageItem = ownStorageGetItem (newKey);
            if (storageItem === null)
            {
                // try the old obsolete format:
                var oldKey  = 'uMK'+userID;
                storageItem = ownStorageGetItem (oldKey);
                if (storageItem != null)
                {
                    storage.removeItem (oldKey);
                    ownStorageSetItem (   newKey, storageItem);
                    console.log ('old key converted: '+oldKey+'  ->  '+newKey);
                }
            }
            var object = getUserStorageObjectFromString (storageItem);
            if (object != null)
            {
                // now save the object right again, to get tsUpdate updated:
                var newItem = createUserStorageItemFromObject (object, true);
                ownStorageSetItem (makeUserStorageItemKey (userID), newItem);
            }
            return object;
        }


        function setUserStorageValue (userID, tokenID, valueOrig)
        {
            var value = valueOrig;

            var object = getUserStorageObject (userID);
            if (object == null)
            {
                object = createNewUserStorageObject ();
            }

            switch (tokenID)
            {
                case userStorageToken.TS_UPDATE:
                    object.tsUpdate = valueOrig;
                    break;
                case userStorageToken.FAVORITE:
                    object.favorite = value;
                    break;
                case userStorageToken.NETWORK:
                    object.network = value;
                    break;
                case userStorageToken.KM:
                    object.km = value;
                    break;
                case userStorageToken.TS_STOPWATCH:
                    object.tsStopwatch = valueOrig;
                    break;
                case userStorageToken.FLAGS:
                    object.flags = value;
                    break;
                case userStorageToken.NOTE:
                    object.note = value;
                    break;
                default:
                    // ... what ever will be, will be ...
            }

            var newItem = createUserStorageItemFromObject (object, true);
            ownStorageSetItem (makeUserStorageItemKey (userID), newItem);
        }


        function userHasStorageData (userID)
        {
            var object = getUserStorageObject (userID);
            if (object == null)
            {
                return false;
            }
            return true;
        }


        function getUserStorageValue (userID, tokenID, userStorageObject)
        {
            var object = (userStorageObject == null) ? getUserStorageObject (userID) : userStorageObject;
            if (object == null)
            {
                //alert ('not found or invalid');
                object = createNewUserStorageObject ();
            }

            var value = '';
            switch (tokenID)
            {
                case userStorageToken.TS_UPDATE:
                    return object.tsUpdate;

                case userStorageToken.KM:
                    value = object.km;
                    break;
                case userStorageToken.FAVORITE:
                    value = object.favorite;
                    break;
                case userStorageToken.NETWORK:
                    value = object.network;
                    break;

                case userStorageToken.TS_STOPWATCH:
                    return object.tsStopwatch;

                case userStorageToken.FLAGS:
                    value = object.flags;
                    break;
                case userStorageToken.NOTE:
                    value = object.note;
                    break;
                default:
                    // ... what ever will be, will be ...
            }
            return value.trim ();
        }


        function getUserStorageFlagsAsInt (userID, userStorageObject)
        {
            var sValue   = getUserStorageValue (userID, userStorageToken.FLAGS, userStorageObject);
            var intValue = parseInt ('0x'+sValue, 16);
            return intValue;
        }


        function setUserStorageFlagsAsHex (userID, intValue)
        {
            var sHex = lPad (intValue.toString (16).toUpperCase(), '0', 4);
            setUserStorageValue (userID, userStorageToken.FLAGS, sHex);
        }


        function setUserFlag (userID, flag)
        {
            var newValue = flag;
            var oldValue = getUserStorageFlagsAsInt (userID, null);
            if (! Number.isNaN(oldValue))
            {
                newValue = oldValue | newValue;
            }
            setUserStorageFlagsAsHex (userID, newValue);
        }


        function clearUserFlag (userID, flag)
        {
            var newValue = 0;
            var oldValue = getUserStorageFlagsAsInt (userID, null);
            if (! Number.isNaN(oldValue))
            {
                newValue = oldValue ^ flag;
            }
            setUserStorageFlagsAsHex (userID, newValue);
        }


        function clearUserFlags (userID)
        {
            setUserStorageValue (userID, userStorageToken.FLAGS, '0000');
        }


        function isUserFlagInFlags (flag, intValueFlags)
        {
            if (! Number.isNaN(intValueFlags))
            {
                return ((intValueFlags & flag) == flag);
            }
            return false;
        }


        function userHasFlag (userID, flag, userStorageObject)
        {
            var intValue = getUserStorageFlagsAsInt (userID, userStorageObject);
            return isUserFlagInFlags (flag, intValue);
        }




        function userTypeFromNameInURL (userTypeName)
        {
            var typeName = userTypeName.toLowerCase ();
            for (var i = 0; i < settings.AddToMenu_NeueFotos.value.length; i++)
            {
                if (typeName == settings.AddToMenu_NeueFotos.value [i][1].toLowerCase ())
                {
                    return settings.AddToMenu_NeueFotos.value [i][0];
                }
            }
            if (typeName.length > 2)
            {
                var tail = typeName.substring (typeName.length-2);
                if (tail == 'in')
                {
                    typeName = typeName.substring (0, typeName.length-2);
                    for (var i = 0; i < settings.AddToMenu_NeueFotos.value.length; i++)
                    {
                        if (typeName == settings.AddToMenu_NeueFotos.value [i][1].toLowerCase ())
                        {
                            return settings.AddToMenu_NeueFotos.value [i][0];
                        }
                    }
                }
            }
            return '';
        }


        function userTypeToNameForURL (userType)
        {
            for (var i = 0; i < settings.AddToMenu_NeueFotos.value.length; i++)
            {
                if (userType == settings.AddToMenu_NeueFotos.value [i][0])
                {
                    return settings.AddToMenu_NeueFotos.value [i][1];
                }
            }
            return '';
        }


        function colorForUserType (userType)
        {
            switch (userType)
            {
                case  '1': return '#7E5060';
                case  '2': return '#5D7A61';
                case '99': return '#464D62';
                case  '3': return '#746181';
                case  '4': return '#9B7E4B';
                case  '5': return '#3F5250';
                case  '6': return '#5F5749';
                case  '7': return '#454258';
                case  '8': return '#354450';
                case  '9': return '#624538';
                case '10': return '#704944';
                case '11': return '#486E66';
                case '12': return '#3A4734';
                case '13': return '#31464C';
                case '14': return '#473A34';
                case '15': return '#472F30';
            }
            return '#fff'; // to see we have missing implementation
        }


        var toggleStateChecked   = '1';
        var toggleStateUnchecked = '0';

        function makeToggleAnchorID (elementNameBase)
        {
            return 'toggle'+elementNameBase+'Anchor';
        }

        function clickIfStateIsChecked (theDocument, elementNameBase)
        {
            var anchorID     = makeToggleAnchorID (elementNameBase);
            var toggleAnchor = theDocument.getElementById (anchorID);
            if (toggleAnchor.getAttribute ('state') === toggleStateChecked)
            {
                $('#'+anchorID).click ();
            }
        }


        function createUserFlagAnchorElement (theDocument, container, user, buttonFontSize,
                                              userFlagID,
                                              currentUserFlagsInt,
                                              elementNameBase, flagBtnTipBase, flagSymbolOn, flagSymbolOff,
                                              functionON, functionOFF
                                             )
        {
            var flagWasActive = isUserFlagInFlags (userFlagID, currentUserFlagsInt);

            var flagBtnStyleBase = 'font-size:'+buttonFontSize+'; color:';
            var flagBtnStyleOn   = '';
            var flagBtnStyleOff  = flagBtnStyleBase + (isDarkTheme ? '#666' : '#a8a8a8');

            switch (userFlagID)
            {
                case userFlag.SMILEY:
                    flagBtnStyleOn = flagBtnStyleBase + (isDarkTheme ? '#fb5' : '#004');
                    break;
                case userFlag.SAD:
                    flagBtnStyleOn = flagBtnStyleBase + colorForSadFlag;
                    break;
                case userFlag.WARNING:
                case userFlag.IGNORED:
                    flagBtnStyleOn = flagBtnStyleBase + (isDarkTheme ? '#f00' : '#800');
                    break;
                case userFlag.DIAMOND:
                    flagBtnStyleOn = flagBtnStyleBase + '#acf; background-color:#003';
                    break;
                default:
                    flagBtnStyleOn = flagBtnStyleBase + (isDarkTheme ? '#Fb5' : '#004');
            }

            var tipHint = '';

            switch (userFlagID)
            {
                case userFlag.SMILEY:
                    tipHint = '\n\n'+
                        tr ('Ist der Marker "Hohe Wichtigkeit" aktiviert,\nso wird der Teilnehmer in der Neue Bilder-Liste\nimmer genau so farblich hervorgehoben wie\ndie Teilnehmer in "nah"-Entfernung.\n\nDie Wirkung ist rein optisch: Der Marker hat\nalso KEINEN Einfluss auf den Km-Filter.',
                            'The "New Photos" pages will highlight all users of "High Importance" in the same way as users that are in "Near" distance.\n\nThis is just an optical feature, it does not change the way how pictures are hidden due to distance-filtering.');
                    break;
                case userFlag.SAD:
                    tipHint = '\n\n'+
                        tr ('Ist der Marker "Geringe Wichtigkeit" aktiviert,\nso wird der Teilnehmer in der Neue Bilder-Liste\nNIEMALS farblich hervorgehoben, egal ob\ner oder sie in "nah"-Entfernung ist.\n\nDie Wirkung ist rein optisch: Der Marker hat\nalso KEINEN Einfluss auf den Km-Filter.',
                            'The "New Photos" pages will highlight all users of "Medium Importance" in the same way as users that are "Not too far away".\n\nThis is just an optical feature, it does not change the way how pictures are hidden due to distance-filtering.');
                    break;
                case userFlag.WARNING:
                    tipHint = '\n\n'+
                        tr ('Ist der Marker "Warnung" aktiviert,\nso wird der Teilnehmer in der Neue Bilder-Liste\nNIEMALS farblich hervorgehoben, egal ob\ner oder sie in "nah"-Entfernung ist.\n\nDie Wirkung ist rein optisch: Der Marker hat\nalso KEINEN Einfluss auf den Km-Filter.',
                            'The "New Photos" pages will NEVER highlight users with "Warning" flag, no matter if they are in "Near" distance.\n\nThis is just an optical feature, it does not change the way how pictures are hidden due to distance-filtering.');
                    break;
                case userFlag.IGNORED:
                    tipHint = '\n\n'+
                        tr ('     "Silent Ignore" ermöglicht unauffälliges Ignorieren,\n      OHNE jemanden in die MK-Ignoreliste einzutragen.\n\nDetails:\nAktivieren des Markers blendet alle Bilder des Teilnehmers\nin einigen der Bilder-Listen aus (Menu: Fotos / Neue Fotos,\nFotos / Photostream, Fotos / Best Of, Fotos / Schlagworte)\nund minimert alle Beiträge des Teilnehmers im Forum,\naber es blendet keine kompletten Forum-Threads aus.\n\nbegrenzte Wirkung:\nDer Teilnehmer erhält keine Beschränkung eigener Kommentier-\nMöglichkeiten bei Dir und kann Dir auch neue PNs senden.\n"Silent Ignore" ist also kein \'Schutz\' sondern dient dazu, Dir in\neinigen Bilder-Listen und im Forum Inhalte zu verbergen.',
                            '     "Silent Ignore" flags help you to ignore a user silently,\n      WITHOUT adding him/her to your MK Ignore List.\n\nThis means: If this flag is active the photos of that user will be hidden on most of the photo preview pages, also his/her posts will be minimized in the Forum threads.\n\nHowever "Silent Ignore" does not \'protect\' you: The user can still send private messages to you or write comments under your pictures.\nSilent Ignore just helps you a bit: Some of the content that is published by that user will be hidden for you.');
                    break;
                case userFlag.STOPWATCH:
                    tipHint = '\n\n'+
                        tr ('Ist der Marker "Tage-Zähler" aktiviert,\nso kannst Du ein Datum eingeben:\n\nIn der Neue Bilder-Liste und in der PN-Liste\nwird Dir dann immer schön angezeigt,\nwie viele Tage es noch bis zu dem Datum sind,\nbzw. wie viele Tage seitdem vergingen.',
                            'If the "Days Counter" flag is active you can specify    \na calendar date for this user.\nOn the New Photos page and also in your\nlists of personal news you will then be shown\nthe number of days since that date,\nor the number of days to wait for the date, resp.');
                    break;
            }

            var tipHintZusatz = '\n\n'+
                tr ('Beachte:\n      Marker-Status wird NUR lokal gespeichert,\n      nämlich nur im Speichers des Browsers,\n      den Du jetzt gerade nutzt.\n\n      Dein Risiko, aktivierte Marker zu verlieren\n      kannst Du durch Daten-Sicherung verringern.\n      Siehe die Seite MKBeautifier-Einstellungen.'
                    ,
                    'Remember:\n      Flag state is store JUST LOCALLY\n      in the local storage of the browsers\n      that you are using right now.\n\n      To reduce risk of data loss you might want to\n      consider creating data BACKUPs.\n      See the MKBeautifier Settings page for details.');

            var flagBtnTipOn     = tr ('Marker ausschalten:', 'Disable flag:' )+' "'+flagBtnTipBase+'"'+tipHint+tipHintZusatz;
            var flagBtnTipOff    = tr ('Marker einschalten:', 'Activate flag:')+' "'+flagBtnTipBase+'"'+tipHint+tipHintZusatz;

            var toggleAnchorElement = theDocument.createElement("a");

            var toggleAnchorElementID = makeToggleAnchorID (elementNameBase);

            toggleAnchorElement.setAttribute ('id', toggleAnchorElementID);

            var toggleSpan = theDocument.createElement("span");

            var toggleSpanElementID = 'toggle'+elementNameBase+'Span';
            toggleSpan.setAttribute ('id', toggleSpanElementID);

            var innerSpacer = '<span style="font-size:12px;">&nbsp;</span>';
            var flagBtnToolTip = '';
            if (flagWasActive)
            {
                toggleAnchorElement.setAttribute ('state', toggleStateChecked);
                toggleSpan.setAttribute ('style', flagBtnStyleOn);
                toggleSpan.innerHTML = innerSpacer+ flagSymbolOn +innerSpacer;
                flagBtnToolTip = flagBtnTipOn;
            }
            else
            {
                toggleAnchorElement.setAttribute ('state', toggleStateUnchecked);
                toggleSpan.setAttribute ('style', flagBtnStyleOff);
                toggleSpan.innerHTML = innerSpacer+ flagSymbolOff +innerSpacer;
                flagBtnToolTip = flagBtnTipOff;
            }

            flagBtnToolTip = flagBtnToolTip;

            var additionalFlagsToggleAnchorClassName = 'additionalFlagsToggleAnchor';

            toggleAnchorElement.setAttribute ('title', flagBtnToolTip);
            toggleAnchorElement.setAttribute ('href',  '#');
            toggleAnchorElement.setAttribute ('class', additionalFlagsToggleAnchorClassName);

            toggleAnchorElement.appendChild (toggleSpan);


            container.appendChild (toggleAnchorElement);


            if (flagWasActive)
            {
                functionON (true);
            }
            else
            {
                functionOFF (true);
            }


            $('#'+toggleAnchorElementID).click (function()
            {
                var toggleBtn    = theDocument.getElementById (toggleSpanElementID);
                var toggleAnchor = theDocument.getElementById (toggleAnchorElementID);

                var currentState = toggleAnchor.getAttribute ('state');
                if (currentState == toggleStateChecked)
                {
                    clearUserFlag (user, userFlagID);

                    toggleAnchor.setAttribute ('state',   toggleStateUnchecked);
                    toggleBtn.setAttribute    ('style',   flagBtnStyleOff);
                    toggleBtn.innerHTML                 = innerSpacer+ flagSymbolOff +innerSpacer;
                    toggleAnchor.setAttribute ('title',   flagBtnTipOff);
                    functionOFF (false);
                }
                else
                {
                    setUserFlag (user, userFlagID);

                    toggleAnchor.setAttribute ('state',   toggleStateChecked);
                    toggleBtn.setAttribute    ('style',   flagBtnStyleOn);
                    toggleBtn.innerHTML                 = innerSpacer+ flagSymbolOn +innerSpacer;
                    toggleAnchor.setAttribute ('title',   flagBtnTipOn);
                    functionON (false);

                    // process our radio-button-like switching:
                    switch (toggleAnchorElementID)
                    {
                        // first group
                        case makeToggleAnchorID ('smileyFlag'):
                            clickIfStateIsChecked (theDocument, 'noSmileNotSadFlag');
                            clickIfStateIsChecked (theDocument, 'sadFlag');
                            clickIfStateIsChecked (theDocument, 'warningFlag');
                            clickIfStateIsChecked (theDocument, 'silentIgnore');
                            break;
                        case makeToggleAnchorID ('noSmileNotSadFlag'):
                            clickIfStateIsChecked (theDocument, 'smileyFlag');
                            clickIfStateIsChecked (theDocument, 'sadFlag');
                            clickIfStateIsChecked (theDocument, 'warningFlag');
                            clickIfStateIsChecked (theDocument, 'silentIgnore');
                            break;
                        case makeToggleAnchorID ('sadFlag'):
                            clickIfStateIsChecked (theDocument, 'smileyFlag');
                            clickIfStateIsChecked (theDocument, 'noSmileNotSadFlag');
                            clickIfStateIsChecked (theDocument, 'warningFlag');
                            clickIfStateIsChecked (theDocument, 'silentIgnore');
                            break;
                        case makeToggleAnchorID ('warningFlag'):
                            clickIfStateIsChecked (theDocument, 'smileyFlag');
                            clickIfStateIsChecked (theDocument, 'noSmileNotSadFlag');
                            clickIfStateIsChecked (theDocument, 'sadFlag');
                            clickIfStateIsChecked (theDocument, 'silentIgnore');
                            break;
                        case makeToggleAnchorID ('silentIgnore'):
                            clickIfStateIsChecked (theDocument, 'smileyFlag');
                            clickIfStateIsChecked (theDocument, 'noSmileNotSadFlag');
                            clickIfStateIsChecked (theDocument, 'warningFlag');
                            clickIfStateIsChecked (theDocument, 'sadFlag');
                            break;
                        // second group
                        case makeToggleAnchorID ('exclamationsFlag'):
                            clickIfStateIsChecked (theDocument, 'exclamationFlag');
                            clickIfStateIsChecked (theDocument, 'questionFlag');
                            clickIfStateIsChecked (theDocument, 'questionsFlag');
                            break;
                        case makeToggleAnchorID ('exclamationFlag'):
                            clickIfStateIsChecked (theDocument, 'exclamationsFlag');
                            clickIfStateIsChecked (theDocument, 'questionFlag');
                            clickIfStateIsChecked (theDocument, 'questionsFlag');
                            break;
                        case makeToggleAnchorID ('questionFlag'):
                            clickIfStateIsChecked (theDocument, 'exclamationsFlag');
                            clickIfStateIsChecked (theDocument, 'exclamationFlag');
                            clickIfStateIsChecked (theDocument, 'questionsFlag');
                            break;
                        case makeToggleAnchorID ('questionsFlag'):
                            clickIfStateIsChecked (theDocument, 'exclamationsFlag');
                            clickIfStateIsChecked (theDocument, 'exclamationFlag');
                            clickIfStateIsChecked (theDocument, 'questionFlag');
                            break;
                        default:
                            // niente da fare
                    }
                }

                return false;
            });

            $('#'+toggleAnchorElementID).hover(
                function()
                {
                    var thisAnchor = theDocument.getElementById (toggleAnchorElementID);
                    thisAnchor.parentNode.style.backgroundColor = (isDarkTheme ? '#401808' : '#a06000');
                },
                function()
                {
                    var thisAnchor = theDocument.getElementById (toggleAnchorElementID);
                    thisAnchor.parentNode.style.backgroundColor = '';
                }
            );



            return toggleAnchorElement;
        }



        var smallEllipsisSpan = '<span><small> (</small></span>&#8230;<span><small>)</small></span>';
        var isMacOS = (navigator.platform.toUpperCase().indexOf('MAC') >= 0);


        function makeToolTipHintYouMayEditKm (userName, userID)
        {
            if (ownID == userID)
            {
                return '';
            }
            var tipDE =
                    ' Beachte:\n\n'+
                    ' Die km-Entfernung ist (derzeit noch) unbekannt,   \n'+
                    ' bitte klicke (falls noch nicht versucht) einmal   \n'+
                    ' die entsprechende Sedcard an, damit MKBeautifier   \n'+
                    ' sich die dort angezeigte km-Entfernung merken kann.   \n\n'+
                    ' Ist auf der Sedcard keine km-Entfernung angezeigt,   \n'+
                    ' so kannst Du ersatzweise eine NOTIZ auf der'+
                    (     (userName.length > 0)
                        ? (' Sedcard von  \n >>'+userName+'<<')
                        : (' Sedcard des  \n Teilnehmers bzw. der Teilnehmerin') )+' eintragen,  \n'+
                    ' die als ERSTEN Text die vermutete Entfernung enthält.   \n\n'+
                    ' Deine Angabe wird dann hier berücksichtigt.   \n\n'+
                    ' Schreibe z.B. dies an den Anfang der Notiz:   \n\n'+
                    ' 123 km\n ';
            var tipEN =
                    ' Please note:\n\n'+
                    ' Distance is unknown (as of yet),    \n'+
                    ' so please goto to the user sedcard   \n'+
                    ' to enable MKBeautifier to see the   \n'+
                    ' km distance and store it.   \n\n'+
                    ' If no distance is shown on the sedcard   \n'+
                    ' you may add a NOTE on the sedcard of'+
                    (     (userName.length > 0)
                        ? ('\n >>'+userName+'<< ')
                        : (' this user') )+'.  \n'+
                    ' This Note should mention your   \n'+
                    ' assumed km distance information   \n'+
                    ' as its very-first text.   \n\n'+
                    ' Your Note could start like that:   \n\n'+
                    ' 123 km\n ';
            return trFunc (tipDE, tipEN);
        }


        function makeSpanWithBigI (userID)
        {
            if (ownID == userID)
            {
                return '';
            }
            return '<span style="color:#fff"><big>&#8505;</big></span>';
        }



        function findNextSiblingByStartOfClassName (node, startOfClassName)
        {
            var theSibling = node.nextElementSibling;
            while (theSibling != null)
            {
                var classname = theSibling.className;
                //alert (classname);
                if (classname.length > 0 && classname.indexOf (startOfClassName) == 0)
                {
                    return theSibling;
                }
                theSibling = theSibling.nextSibling;
                //alert (sibling);
            }

            return theSibling;
        }


        function getNotesElement (theDocument, ret_notesElementObject)
        {
            var notesElements = theDocument.getElementsByClassName ('tooltip note active userNotiz');

            ret_notesElementObject.active = (notesElements.length > 0);

            if (! ret_notesElementObject.active)
            {
                notesElements = theDocument.getElementsByClassName ('tooltip note userNotiz');
            }

            if (notesElements.length > 0)
            {
                ret_notesElementObject.element = notesElements [0];
            }
            else
            {
                ret_notesElementObject.element = null;
            }
        }


        function retrieveAndStoreNoteData (theDocument, waitingDocument, callbackFunction, isDialogMode, user, notesElement, hasActiveNote, justReadFromStorage)
        {
            var engravedNoteDivID = 'engravedNoteDivID';

            if (notesElement != null)
            {
//alert('retrieving note: '+notesElement.outerHTML);

                var oldNote = getUserStorageValue (user, userStorageToken.NOTE, null);
                var oldNoteSimplified = oldNote.replace ('\\n','n').replace ('\n','n');
                var contentFull = '';

                if (justReadFromStorage)
                {
                    contentFull = oldNote;
                }
                else
                {
                  if (hasActiveNote)
                  {
                    contentFull = notesElement.getAttribute ('title').trim ();
//alert('My note: '+contentFull);
                    if (contentFull == tr ('Notizen', 'Notes'))
                    {
                        contentFull   = '';
                    }
                  }
                }
/*
console.log('just read: ', justReadFromStorage);
console.log('old note:  '+oldNote);
console.log('new note:  '+contentFull);
*/
                var newNoteSimplified = contentFull.replace ('\\n','n').replace ('\n','n');
//alert('xx'+oldNoteSimplified+'yy\n'+'xx'+newNoteSimplified+'yy');
                if (oldNoteSimplified != newNoteSimplified)
                {
                    setUserStorageValue (user, userStorageToken.NOTE, contentFull);
                }

                if  (hasActiveNote)
                {
                    // if the user did not have a KM setting
                    // we might have stored the info with the Notiz:
                    var storedKm = getUserStorageValue (user, userStorageToken.KM, null);
                    if (storedKm == '' || storedKm == '-1')
                    {
                        var noteUpper = contentFull.toUpperCase ();
                        var kmPos = noteUpper.indexOf ('KM');
                        if (kmPos > 0 && kmPos < 7)
                        {
                            var kmInNote = noteUpper.substring (0, kmPos).replace ('.', '').trim ();
                            //alert (kmInNote);
                            var intKm = Number(kmInNote);
                            if (! Number.isNaN(intKm))
                            {
                                setUserStorageValue (user, userStorageToken.KM, kmInNote);
                            }
                        }
                    }
                }


                if (isDialogMode)
                {
                    var maxLen  = settings.MaxLengthForNoteOnSedcard.value;
                    var content = contentFull;
                    if (content.length > maxLen)
                    {
                        content = content.substring(0, maxLen) + smallEllipsisSpan;
                    }

                    // re-read the elements, they might have been changed!
                    containerElements = theDocument.getElementsByClassName ('s-name');
                    if (containerElements.length > 0)
                    {
                        var divElements = containerElements [0].children;
                        if (divElements.length > 1)
                        {
                            var divTitle = divElements [0];
                            var divCat   = findNextSiblingByStartOfClassName (divTitle, 'sCat');

                            divTitle.setAttribute ('title', contentFull);

                            if (settings.ShowNoteOnSedcard.value)
                            {
                                if (contentFull.length>0)
                                {
                                    var span = theDocument.getElementById (engravedNoteDivID);
                                    if (span == null)
                                    {
                                        span = theDocument.createElement("div");
                                        var colorsOfNote =
                                        isDarkTheme
                                        ? 'color:'+settings.InfoColor_Near.value+'; background-color:#0b0b0b;'
                                        : 'color:'+settings.InfoColor_Near.value+'; background-color:#222222;';
                                        span.setAttribute ('style', 'font-size:12px; font-style: italic; '+colorsOfNote);
                                        span.setAttribute ('id',    engravedNoteDivID);
                                    }
                                    span.setAttribute ('title', contentFull);
                                    span.innerHTML = '&nbsp; '+content+' &nbsp;';

                                    divCat.appendChild (span);
                                }
                                else
                                {
                                    $("#"+engravedNoteDivID).remove();
                                }
                            }
                        }
                    }
                    else
                    {
                        notesElement.append (content);
                    }
                }
            }
            else
            {
                if (isDialogMode)
                {
                    $("#"+engravedNoteDivID).remove();
                }
                setUserStorageValue (user, userStorageToken.NOTE,  '');
            }

            if (waitingDocument != null && callbackFunction != null)
            {
                callbackFunction (waitingDocument, user);
            }
        }




        function makeStyleForSedcardDaysCounter (delta, fontSize)
        {
            var isFuture = (delta  < 0);
            var isToday  = (delta == 0);
            return 'white-space: nowrap; border-radius: 8px; border: 2px solid ' +
                   (isFuture ?
                    '#004200; background-color:#001808' :
                    (isToday ? foregroundToday+'; background-color:'+backgroundToday :
                     '#1d4e58; background-color:#112e34'
                    )
                   ) +
                   '; font-family:Palatino, Times, serif; font-size:'+fontSize
        }


        function processUserSedcard (theDocument, isDialogMode, waitingDocument, callbackFunction)
        {
            var notesElementObject = new Object ();
            getNotesElement (theDocument, notesElementObject);
            var hasActiveNote     = notesElementObject.active;
            var notesElement      = notesElementObject.element;
            var notesElementFound = (notesElementObject.element != null);

            var isActiveUser = true;

            var user      = '';
            var myComment = '';
            if (notesElementFound)
            {
                //alert(notesElement.outerHTML);
                user = notesElement.getAttribute ('data-id');
                myComment = notesElement.getAttribute ('title');
            }
            else
            {
                // fallback: try to find the user in some meta infos:
                var metas = theDocument.getElementsByTagName('meta');

                for (var i=0; i<metas.length; i++)
                {
                    if (metas [i].getAttribute ("name") === "msapplication-starturl")
                    {
                        var inner = metas [i].getAttribute ("content");

                        var token = 'model-kartei.de/u/';

                        // special test to see if we WANTED to load a sedcard but instead we got the u page:
                        var idx = inner.indexOf (token);
                        if (idx > -1)
                        {
                            isActiveUser = false;
                        }
                        else
                        {
                            token = 'model-kartei.de/'+tr('sedcards/','portfolios/');
                            idx = inner.indexOf (token);
                            if (idx < 0)
                            {
                                token = 'model-kartei.de/'+tr('portfolios/','sedcards/');
                                idx = inner.indexOf (token);
                            }
                        }

                        if (idx > -1)
                        {
                            var user = inner.substring (idx+token.length, 100);
                            idx = user.indexOf ('/');
                            if (idx > -1)
                            {
                                if (isActiveUser)
                                {
                                    user = user.substring (idx+1);
                                    idx = user.indexOf ('/');
                                }
                                if (idx > -1)
                                {
                                    name = user.substring (idx+1);
                                    user = user.substring (0, idx);
                                    if (user != ownID)
                                    {
                                        idx = name.indexOf ('/');
                                        if (idx > -1)
                                        {
                                            name = name.substring (0, idx);
                                        }

                                        var userNote = getUserStorageValue (user, userStorageToken.NOTE, null).toLowerCase ();

                                        //alert (user+' '+name);

                                        if (userNote.indexOf (name.toLowerCase ()) < 0)
                                        {
                                            userNote = trFunc ('(User ignoriert mich.)\n\n',
                                                               '(User is ignoring me.)\n\n');
                                            setUserStorageValue (user, userStorageToken.NOTE, userNote);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }

            var isUserIgnoringMe = false;

            var rowTCenterElement      = null;
            var rowTCenterElementClass = 'row tCenter';

            var contentSection = theDocument.getElementById ('content');
            if (contentSection != null)
            {
                var rows = contentSection.getElementsByClassName ('row');
                if (rows.length > 0)
                {
                    var inner = rows [0].innerHTML;
                    if (inner.indexOf ('Dieser Benutzer hat keine aktive Sedcard.') > -1 ||
                        inner.indexOf ('Der Benutzer ist nicht (mehr) vorhanden.' ) > -1 ||
                        inner.indexOf ('hat keine Sedcard die angezeigt werden kann.' ) > -1)
                    {
                        isActiveUser = false;
                    }
                    if (    (inner.indexOf ('Dieser Benutzer ignoriert dich')          > -1)
                         || (inner.indexOf ('You are on this user\'s ignore-list') > -1) )
                    {
                        //alert(user);
                        isUserIgnoringMe = true;
                    }
                }
                rows = contentSection.getElementsByClassName (rowTCenterElementClass);
                if (rows.length > 0)
                {
                    rowTCenterElement = rows [0];

                    if (rowTCenterElement.innerHTML.indexOf ('management/sedcards/edit/') > -1)
                    {
                        // just found my own sedcard :)
                        rowTCenterElement = null;
                    }
                }
            }

            if (isUserIgnoringMe)
            {
                var linkRow = theDocument.createElement ('div');
                linkRow.setAttribute ('class', 'row');
                linkRow.innerHTML =
                    '<p>&nbsp;<br />&nbsp;</p><small>'+
                    trFunc ('Eventuelle PN(s) mit ihr/ihm kannst Du dort nachlesen: ',
                            'Any personal messages with the user can still be seen there: ')+
                    '</small> &nbsp; <a href="http://www.model-kartei.de/pn/user/'+user+'/">http://www.model-kartei.de/pn/user/'+user+'/</a>'+
                    '<p>&nbsp;<br />&nbsp;</p><table><tr><td><small>'+
                    trFunc ('Favorit-Status ausschalten, falls derzeit noch aktiv:',
                            'Disable Favorite status, if enabled:')+
                    '</td><td></small> &nbsp; <a class="tooltip favorit active userFavorit" data-id="'+user+'" href="javascript:;" id="favorit'+user+'" title="Favoriten"><span>'+
                    trFunc ('KLICKE HIER', 'CLICK HERE')+
                    '</span></a></td></tr>'+
                    '<tr><td><small>'+
                    trFunc ('Netzwerk-Status ausschalten, falls derzeit noch aktiv:',
                            'Disable Network status, if enabled:')+
                    '</td><td></small> &nbsp; <a class="tooltip network active userNetzwerk" data-id="'+user+'" href="javascript:;" id="netzwerk'+user+'" title="Netzwerk"><span>'+
                    trFunc ('KLICKE HIER', 'CLICK HERE')+
                    '</span></a></td></tr></table>';

                contentSection.appendChild (linkRow);

                setUserFlag (user, userFlag.IS_IGNORING_ME);
                return;
            }


            var actionElement = null;
            {
                var actionElements = theDocument.getElementsByClassName ('sAction');
                if (actionElements.length > 0)
                {
                    actionElement = actionElements [0];
                }
            }


            var favoriteElement  = null;
            var isFavorite       = false;
            {
                var favoriteElements = theDocument.getElementsByClassName ('tooltip favorit active userFavorit');

                if (favoriteElements.length > 0)
                {
                    isFavorite = true;
                }
                else
                {
                    favoriteElements = theDocument.getElementsByClassName ('tooltip favorit userFavorit');
                }
                if (favoriteElements.length > 0)
                {
                    favoriteElement = favoriteElements [0];
                }
            }


            var networkElement  = null;
            var isNetwork       = false;
            {
                var networkElements = theDocument.getElementsByClassName ('tooltip network active userNetzwerk');

                if (networkElements.length > 0)
                {
                    isNetwork = true;
                }
                else
                {
                    networkElements = theDocument.getElementsByClassName ('tooltip favorit userNetzwerk');
                }
                if (networkElements.length > 0)
                {
                    networkElement = networkElements [0];
                }
            }


            var observer = null;
            if (isDialogMode)
            {
                var lastTimestampWithText = 0;

                // Monitor the style of the notes element to make sure we quickly save the note
                // right after it was entered/changed by the "NOTIZ SPEICHERN" dialog:
                var observerOfActions = new MutationObserver (function(mutations)
                {
                    mutations.forEach (function(mutationRecord)
                    {
                        var newClassName     = mutationRecord.target.className.toLowerCase ();
                        var isFavoritElement = (newClassName.indexOf ('tooltip favorit') >= 0);
                        var isNetworkElement = (newClassName.indexOf ('tooltip network') >= 0);
                        var isNotesElement   = (newClassName.indexOf ('tooltip note'   ) >= 0);
                        if (mutationRecord.type === 'attributes')
                        {
                            //alert ('|'+newClassName+'|');
                            if (isFavoritElement)
                            {
                                //alert (mutationRecord.type+'\n'+'\nold: '+mutationRecord.oldValue+'\nnew: '+mutationRecord.attributeName+'\n'+mutationRecord.target.className);
                                var newIsFavorite = (newClassName.indexOf ('active') >= 0);
                                if (newIsFavorite != isFavorite)
                                {
                                    isFavorite = newIsFavorite;
                                    if (isFavorite)
                                    {
                                        setUserStorageValue (user, userStorageToken.FAVORITE, '1');
                                    }
                                    else
                                    {
                                        setUserStorageValue (user, userStorageToken.FAVORITE, '0');
                                    }
                                }
                            }
                            else if (isNetworkElement)
                            {
                                //alert (mutationRecord.type+'\n'+'\nold: '+mutationRecord.oldValue+'\nnew: '+mutationRecord.attributeName+'\n'+mutationRecord.target.className);
                                var newIsNetwork = (newClassName.indexOf ('active') >= 0);
                                if (newIsNetwork != isNetwork)
                                {
                                    isNetwork = newIsNetwork;
                                    if (isNetwork)
                                    {
                                        setUserStorageValue (user, userStorageToken.NETWORK, '1');
                                    }
                                    else
                                    {
                                        setUserStorageValue (user, userStorageToken.NETWORK, '0');
                                    }
                                }
                            }
                            /*else if (isNotesElement)
                            {
                                var newHasActiveNote = (newClassName.indexOf ('active') >= 0);
                                if (newHasActiveNote != hasActiveNote)
                                {
                                    hasActiveNote = newHasActiveNote;
                                    var textIsEmpty = (notesElement.getAttribute ('title').trim ().length == 0);

                                    // Working around a glitch in the MK tooltip magic:
                                    //
                                    // When loading a sedcard the userNotiz title getst first set, then deleted again
                                    // we need to ignore this deletion so the rule is: if the button is "active"
                                    // but the title is empty, then we will ignore the empty title and just keep the old one

                                    {
                                        // special measure needed for Safari browser:
                                        var d = new Date ();
                                        var tsNow = d.getTime ();
                                        if (textIsEmpty)
                                        {
                                            if (tsNow - lastTimestampWithText < 334)
                                            {
                                                //alert ('x');
                                                return;
                                            }
                                        }
                                        else
                                        {
                                            lastTimestampWithText = tsNow;
                                        }
                                    }

                                    if ( ! (newHasActiveNote && textIsEmpty))
                                    {
                                        retrieveAndStoreNoteData (theDocument, waitingDocument, callbackFunction,
                                                                  isDialogMode, user, notesElement, hasActiveNote,
                                                                  false);
                                    }
                                }
                            }*/
                        }
                        //alert (mutationRecord.type);//+'\n'+actionElement.innerHTML);
                    });
                });

                observerOfActions.observe (actionElement,
                {
                    attributes:      true,
                    //childList:     true,
                    //characterData:   true,
                    subtree:         true
                    //attributeOldValue: true
                });


                // Monitor the text change of the notes element to make sure we quickly save the note
                // right after it was modified by the "NOTIZ SPEICHERN" dialog:
                var observerNotesElement = new MutationObserver (function(mutations)
                {
                    mutations.forEach (function(mutationRecord)
                    {
                        //alert ('|'+mutationRecord.type+'|');
                        //var textChanged = (mutationRecord.type === 'characterData');
                        //if (textChanged)
                        {
                            var newClassName = mutationRecord.target.className.toLowerCase ();
                            if (newClassName.indexOf ('tooltip note') >= 0)
                            {
                                var newHasActiveNote = (newClassName.indexOf ('active') >= 0);
                                var textIsEmpty = (notesElement.getAttribute ('title').trim ().length == 0);
                                // Working around a glitch in the MK tooltip magic:
                                //
                                // When loading a sedcard the userNotiz title getst first set, then deleted again
                                // we need to ignore this deletion so the rule is: if the button is "active"
                                // but the title is empty, then we will ignore the empty title and just keep the old one

                                {
                                    // special measure needed for Safari browser:
                                    var d = new Date ();
                                    var tsNow = d.getTime ();
                                    if (textIsEmpty)
                                    {
                                        if (tsNow - lastTimestampWithText < 334)
                                        {
                                            //alert ('x');
                                            return;
                                        }
                                    }
                                    else
                                    {
                                        lastTimestampWithText = tsNow;
                                    }
                                }

                                if ( ! (newHasActiveNote && textIsEmpty))
                                {
                                    if (! textIsEmpty)
                                    {
                                        lastTimestampWithText = getCurrentBaseTimeOffsetInt ();
                                    }
                                    hasActiveNote = newHasActiveNote;
                                    retrieveAndStoreNoteData (theDocument, waitingDocument, callbackFunction,
                                                              isDialogMode, user, notesElement, hasActiveNote,
                                                              false);
                                }
                            }

                        }
                    });
                });

                observerNotesElement.observe (notesElement,
                {
                    attributes:      true
                    //childList:       true,
                    //characterData:   true,
                    //subtree:         true
                    //attributeOldValue: true
                });

            }

            if (isFavorite)
            {
                setUserStorageValue (user, userStorageToken.FAVORITE, '1');
            }
            else
            {
                setUserStorageValue (user, userStorageToken.FAVORITE, '0');
            }

            if (isNetwork)
            {
                setUserStorageValue (user, userStorageToken.NETWORK, '1');
            }
            else
            {
                setUserStorageValue (user, userStorageToken.NETWORK, '0');
            }

            var userType = '';

            var printLink = theDocument.getElementsByClassName ('tooltip print');
            if (printLink.length > 0)
            {
                var href = printLink [0].getAttribute ('href');
                // e.g. "http://www.model-kartei.de/print/12345/auftraggeber/"
                if (href.length > 0)
                {
                    if (href.lastIndexOf ('/') == href.length-1)
                    {
                        href = href.substring (0, href.length-1);
                    }

                    var userTypeName = href.substring (href.lastIndexOf ('/')+1);
                    if (userTypeName.length > 0)
                    {
                        userType = userTypeFromNameInURL (userTypeName);
                    }
                }
            }


            var detailsElements = theDocument.getElementsByClassName ('sedcardDetails');
            if (detailsElements.length > 0)
            {
                var isMiles = false;
                var km = detailsElements [0].innerHTML.substring (0, detailsElements [0].innerHTML.indexOf ('km<span>Entfernung</span>')-1);
                if (km.length < 1)
                {
                    km = detailsElements [0].innerHTML.substring (0, detailsElements [0].innerHTML.indexOf ('km<span>Distance</span>')-1);
                }
                if (km.length < 1)
                {
                    isMiles = true;
                    km = detailsElements [0].innerHTML.substring (0, detailsElements [0].innerHTML.indexOf ('miles<span>Distance</span>')-1);
                }
                if (km.length < 1)
                {
                    isMiles = true;
                    km = detailsElements [0].innerHTML.substring (0, detailsElements [0].innerHTML.indexOf ('miles<span>Entfernung</span>')-1);
                }
                if (km.length > 0)
                {
                    km = km.substring (km.lastIndexOf ('>')+1);
                    if (isMiles)
                    {
                        var intValue = parseInt (km, 10);
                        if ( ! Number.isNaN(intValue))
                        {
                            intValue = intValue * 1.6;
                            km = intValue.toString ();
                            var posDot = km.indexOf ('.');
                            if (posDot > -1)
                            {
                                km = km.substring (0, posDot);  // just cut off the fraction, the value will be fine enough :)
                            }
                        }
                    }
                    //alert (km);
                    setUserStorageValue (user, userStorageToken.KM, km);
                }
            }


            var divTitle = null;
            var divCat   = null;

            var containerElements = theDocument.getElementsByClassName ('s-name');
            if (containerElements.length > 0)
            {
                var divElements = containerElements [0].children;
                if (divElements.length > 1)
                {
                    divTitle = divElements [0];
                    divCat   = findNextSiblingByStartOfClassName (divTitle, 'sCat');
                }
            }


            if (isDialogMode && (rowTCenterElement != null))
            {
                // add buttons for our nice little additional user flag :)
                if  (settings.UseAdditionalLocalUserFlags.value)
                {
                    var flagButtonSetName = 'niceFlagUserButtonSet';

                    var oldInner = rowTCenterElement.innerHTML;

                    var bgColorOfFlagButton =
                        isDarkTheme
                            ? 'bgcolor:#131313'
                            : 'bgcolor:#222222';

                    var buttonFontSize = '20px';

                    var newInner = oldInner + '<ul><table><tr>';

                    for (var i = 0; i < niceUserFlags.length; i++)
                    {

                        newInner = newInner
                            + '<td '+bgColorOfFlagButton+'; style="font-size:26px;">'
                            +   '<span id="'+flagButtonSetName+i.toString ()+'"></span>'
                            + '</td>';
                        if (niceUserFlags [i][5] > 0)
                        {
                            newInner = newInner
                                + '<td style="font-size:'+buttonFontSize+';">';
                            for (var j = 0; j < niceUserFlags [i][5]; j++)
                            {
                                newInner = newInner
                                    + '&nbsp;';
                            }
                            newInner = newInner
                                + '</td>';
                        }
                    }

                    var dayCounterSettingsAreaID = 'dayCounterSettingsArea';
                    var dayCounterSpanImgID      = 'dayCounterSpanImg';
                    var dayCounterInputDateID    = 'dayCounterInputDate';
                    var dayCounterResultTxtID    = 'dayCounterResultTxt';

                    newInner = newInner
                            + '<td '+bgColorOfFlagButton+'>'
                            +   '<span id="'+dayCounterSettingsAreaID+'"></span>'
                            + '</td>'
                            + '</tr></table></ul>';

                    rowTCenterElement.innerHTML = newInner;


                    var titleElements = divCat.getElementsByClassName   ('s-title');
                    if (titleElements.length > 0)
                    {
                        var currentUserFlagsInt = getUserStorageFlagsAsInt (user, null);

                        var refreshIntervalId = null;

                        var idxContainer = 0;
                        niceUserFlags.forEach (function (niceFlag, index, array)
                        {
                            var container = theDocument.getElementById (flagButtonSetName+idxContainer.toString ());
                            if (container != null)
                            {
                                var elementNameBase = niceFlag [1];
                                var rawSymbol      = niceFlag [3];
                                var strippedSymbol = rawSymbol
                                        .replace ('<big>', '').replace ('</big>', '')
                                        .replace ('<small>', '').replace ('</small>', '')
                                        .replace ('[', '').replace (']', '');

                                createUserFlagAnchorElement (theDocument, container, user, buttonFontSize, niceFlag [0],
                                                             currentUserFlagsInt,
                                                             elementNameBase, niceFlag [2], niceFlag [3], niceFlag [4],
                                                             function (isInitialShow)
                                                             {
                                                                 // function ON:
                                                                 for (var i = 0; i < niceUserFlags.length; i++)
                                                                 {
                                                                     var testedFlag = niceUserFlags [i];
                                                                     if (   testedFlag [0] == userFlag.STOPWATCH
                                                                         && testedFlag [3] == rawSymbol)
                                                                     {
                                                                        var storedOffset  = getUserStorageValue (user, userStorageToken.TS_STOPWATCH, null);
                                                                        if (storedOffset == undefinedStopwatchValue)
                                                                        {
                                                                            storedOffset = getCurrentBaseTimeOffsetInt ();
                                                                        }
//alert (storedOffset);
                                                                        var initialDate    = getDateFromTimeOffset (storedOffset);
                                                                        var stopwatchDelta = getCurrentBaseTimeOffsetInt () - storedOffset;

                                                                        var inputStyle     = ' style="text-align:center; border:1px solid #666; color:#Fb5; background-color:#2e2e2e; font-size:115%" ';
                                                                        var labelStyle     = ' style="color:#888; background-color:#2e2e2e; font-size:85%" ';
                                                                        var settingsArea   = theDocument.getElementById (dayCounterSettingsAreaID);
                                                                        settingsArea.innerHTML =
                                                                            '<table cellpadding="0" cellspacing="0"><tr>'
                                                                            + '<td valign=center>'
                                                                            +   '&nbsp;<span id="'+dayCounterSpanImgID
                                                                            +     '" '
                                                                            + 'style="'+makeStyleForSedcardDaysCounter (stopwatchDelta, '160%')+'"'
                                                                            +    '>'
                                                                            +   '</span>'
                                                                            + '</td>'
                                                                            + '<td valign="center"'+labelStyle+'>&nbsp;&nbsp;&nbsp;'
                                                                            +   '<span>'
                                                                            +     (isInitialShow ? '':'<table style="background-color:#300; color:#FB5"><tr><td>')
                                                                            +     (   isInitialShow
                                                                                    ? trFunc ('Datum des Tagez&auml;hlers &auml;ndern','Adjust date of day counter')
                                                                                    : ('<i>'+trFunc ('&nbsp; <b>1. Datum</b> f&uuml;r Tagez&auml;hler eintragen','1. Enter date for day counter')+'</i>')
                                                                                  )
                                                                            +     ':&nbsp;'
                                                                            +     (isInitialShow ? '':'</td></tr></table>')
                                                                            +   '</span>&nbsp;&nbsp;&nbsp;'
                                                                            + '</td>'
                                                                            + '<td align="left">'
                                                                            +   '<input class="width50" id="'+dayCounterInputDateID+'" '
                                                                            +     'maxlength="10" name="'+dayCounterInputDateID+'" '
                                                                            +     'placeholder="'+trFunc ('TT.MM.JJJJ', 'DD.MM.YYYY')+'" '
                                                                            +     'type="text" '
                                                                            +     inputStyle
                                                                            +     'value="'+ initialDate.getDate     ().toString ()
                                                                                           + '.'
                                                                                           +(initialDate.getMonth    ()+1).toString ()
                                                                                           + '.'
                                                                                           + initialDate.getFullYear ().toString ()+'" />'
                                                                            + '</td>'
                                                                            + '<td align="left"'+labelStyle+'>'
                                                                            +   '<span id="'+dayCounterResultTxtID+'">'
                                                                            +   '</span>'
                                                                            + '</td>'
                                                                            + '</tr></table>';

                                                                        setUserStorageValue (user, userStorageToken.TS_STOPWATCH, storedOffset);

                                                                        var imageTD = theDocument.getElementById (dayCounterSpanImgID);
                                                                        imageTD.innerHTML = makeTokenForDays (true, false, false,
                                                                                                              stopwatchDelta, storedOffset,
                                                                                                              true,
                                                                                                              false);

                                                                        if (notesElementFound)
                                                                        {
                                                                            var blinkingArrowID = 'blinkingArrow';
                                                                            notesElement.innerHTML = '<span style="color:#'+(isInitialShow?'777':'Fb5')+'; background-color:#000; font-size:85%"><br />'+
                                                                            '<b id="'+blinkingArrowID+'" style="font-size:100%">'+
                                                                            (isInitialShow ? '&#x2191;':'&middot;')+'</b><br /><table'+
                                                                            (isInitialShow?'':' style="background-color:#300"')+'><tr><td>'+
                                                                            trFunc ((isInitialShow ? '':'<i><b>2.&nbsp;')+
                                                                                    'Notiz'+
                                                                                    (isInitialShow ? '':'</b>')+
                                                                                    '&nbsp;f&uuml;r Tagez&auml;hler '+
                                                                                    (isInitialShow ? '&auml;ndern':'eintragen</i>')
                                                                                    ,
                                                                                    (isInitialShow ? 'Adjust the':'<i>2.&nbsp;Enter a')+'&nbsp;Note'+(isInitialShow ? '':'</i>')) +
                                                                            '</td></tr></table></span>';

                                                                            if (! isInitialShow)
                                                                            {
                                                                                refreshIntervalId = window.setInterval (function ()
                                                                                {
                                                                                    $('#'+blinkingArrowID).toggle ();
                                                                                }, 600);
                                                                            }
                                                                        }

                                                                        if (! isInitialShow)
                                                                        {
                                                                            var inputSpan = theDocument.getElementById (dayCounterInputDateID);
                                                                            inputSpan.focus ();
                                                                        }

                                                                        var resultSpan = theDocument.getElementById (dayCounterResultTxtID);

                                                                        $('#'+dayCounterInputDateID).on ("keyup",
                                                                            function ()
                                                                            {
                                                                                var validEntry   = false;
                                                                                var elementID    = $( this ).attr ('id');
                                                                                var inputElement = document.getElementById (elementID);
                                                                                var sInput       = inputElement.value;

                                                                                var testInput = sInput.replace (' ', '' ).replace ('.0', '.');

                                                                                if (testInput.length > 1 && testInput.substring (0,1) == '0')
                                                                                {
                                                                                    testInput = testInput.substring (1);
                                                                                }

                                                                                var values = testInput.split ('.');
                                                                                if (values.length == 3)
                                                                                {
                                                                                    var days   = parseInt (values [0]);
                                                                                    var months = parseInt (values [1]);
                                                                                    var years  = parseInt (values [2]);
                                                                                    if ( ! Number.isNaN (days  ) &&
                                                                                         ! Number.isNaN (months) &&
                                                                                         ! Number.isNaN (years ) &&
                                                                                         days   >    0 && days   < 32 &&
                                                                                         months >    0 && months < 13 &&
                                                                                         years  > 1999 && years  < 2100 )
                                                                                    {
                                                                                        var newDate = new Date (years, months-1, days);
                                                                                        var newDateStr = newDate.getDate      ().toString ()
                                                                                                       + '.'
                                                                                                       +(newDate.getMonth () +1).toString ()
                                                                                                       + '.'
                                                                                                       + newDate.getFullYear  ().toString ();
                                                                                        if (newDateStr == testInput)
                                                                                        {
                                                                                            validEntry = true;
                                                                                            resultSpan.innerHTML =
                                                                                                trWeekDay (newDate) + '<br />' + sInput;
                                                                                            var newOffset = getBaseTimeOffsetInt (newDate);
//alert ('new: ' + newOffset.toString ());
                                                                                            setUserStorageValue (user, userStorageToken.TS_STOPWATCH, newOffset);

                                                                                            var newDelta = getCurrentBaseTimeOffsetInt () - newOffset;
                                                                                            var elem = theDocument.getElementById (dayCounterSpanImgID);
                                                                                            elem.style = makeStyleForSedcardDaysCounter (newDelta, '160%');
                                                                                            elem.innerHTML = makeTokenForDays (true, false, false,
                                                                                                                               newDelta, newOffset,
                                                                                                                               true,
                                                                                                                               false);
                                                                                        }
                                                                                    }
                                                                                }
                                                                                if (! validEntry)
                                                                                {
                                                                                    resultSpan.innerHTML = trFunc ('(ung&uuml;ltig)','(invalid)');
                                                                                }
                                                                           }
                                                                        );

                                                                     }
                                                                 }
                                                             },
                                                             function (isInitialShow) // bool parameter ignored as of yet
                                                             {
                                                                 // function OFF:
                                                                 for (var i = 0; i < niceUserFlags.length; i++)
                                                                 {
                                                                     var testedFlag = niceUserFlags [i];
                                                                     if (   testedFlag [0] == userFlag.STOPWATCH
                                                                         && testedFlag [3] == rawSymbol)
                                                                     {
                                                                        if (! isInitialShow)
                                                                        {
                                                                            if (notesElementFound)
                                                                            {
                                                                                notesElement.innerHTML = '<span></span>';
                                                                            }
                                                                            if (refreshIntervalId != null)
                                                                            {
                                                                                window.clearInterval(refreshIntervalId);
                                                                                refreshIntervalId = null;
                                                                            }
                                                                        }

                                                                        var settingsArea = theDocument.getElementById (dayCounterSettingsAreaID);
                                                                        settingsArea.innerHTML = '';
                                                                     }
                                                                 }
                                                             });
                            }

                            idxContainer++;
                        });
                    }
                }
            }

            retrieveAndStoreNoteData (theDocument, waitingDocument, callbackFunction, isDialogMode, user, notesElement, hasActiveNote, true);


            // fix the sedcard selector, if not done already:

            // re-read the elements, they might have been changed!
            containerElements = theDocument.getElementsByClassName ('s-name');
            if (containerElements.length > 0)
            {
                var divElements = containerElements [0].children;
                if (divElements.length > 1)
                {
                    divTitle = divElements [0];
                    divCat   = findNextSiblingByStartOfClassName (divTitle, 'sCat');
                }
            }
        }






        //
        // main menu:
        //
        var origMainNavInnerHTML = '';; // store value in case it should be instantly restored after changes done on Settings page
        var rLastPhotoStreamLocationKey  = preferenceStorageKeyBASE+'lastPhotoStreamLocation';

        if (location.href.indexOf('model-kartei.de/') > -1)
        {
            var userMenuTrigger = document.getElementById ('userMenuTrigger');
            if (userMenuTrigger != null)
            {
                // detect and remember user's choosen location for photo stream (if any)
                if (    ((location.href.indexOf ('model-kartei.de/fotos/stream/') > -1) || (location.href.indexOf ('model-kartei.de/photos/stream/') > -1))
                     && ((location.href.indexOf ('/country/') > -1) || (location.href.indexOf ('/city/') > -1)) )
                {
                    var token = '/city/';
                    var posLocation = location.href.indexOf (token);
                    if (posLocation < 0)
                    {
                        token = '/country/';
                        posLocation = location.href.indexOf (token);
                    }
                    if (posLocation > -1)
                    {
                        var streamLocation = location.href.substring (posLocation+1);
                        ownStorageSetItem (rLastPhotoStreamLocationKey, streamLocation);
                    }
                }

                // extend the main menu
                var li = document.createElement ('li');
                li.innerHTML = '<a href="http://www.model-kartei.de/u/'+ownID+'/?MKBeautifier"><span class="admin"></span>  MKBeautifier</a>';

                var lis = userMenuTrigger.getElementsByTagName ('li');
                if (lis.length > 3)
                {
                    userMenuTrigger.insertBefore (li, lis [lis.length-2]);
                }
                else
                {
                    userMenuTrigger.appendChild (li);
                }
            }
            processMenuItemsForNewPhotos (true);
        }

        function processMenuItemsForNewPhotos (initialCall)
        {
            var mainNav = document.getElementById ('mainnav');
            if (mainNav != null)
            {
                if (initialCall)
                {
                    // if (settings.AddToMenu_Sedcards)  //derzeit wird allen der Menu-Eintrag gezeigt
                    {
                        var navigations = mainNav.getElementsByClassName ('navigation');
                        if (navigations.length > 0)
                        {
                            var navigation = navigations [0];

                            var lastPhotoStreamLocation = ownStorageGetItem (rLastPhotoStreamLocationKey);
                            if (lastPhotoStreamLocation === null)
                            {
                                lastPhotoStreamLocation = 'country/DE/';
                            }
                            var inner = navigation.innerHTML.replace (
                                '<a href="http://www.model-kartei.de/fotos/stream/">',
                                '<a href="http://www.model-kartei.de/fotos/stream/'+lastPhotoStreamLocation+'">' );

                            var firstLI = '<span class="titleSedcard"><a href="http://www.model-kartei.de/sedcards/model/">'+tr ('Weibliche Models','Female Models');
                            var pos     = inner.indexOf (firstLI);
                            if (pos > -1)
                            {
                                var mkbLI = '<span class="titleSedcard"><a href="http://www.model-kartei.de/u/'+
                                ownID+'/?MKBeautifier_Marker">'+tr ('MKBeautifier-Liste','MKBeautifier Flags')+'<span>...</span></a></span>';
                                var newInner = inner.substring (0, pos)
                                + mkbLI
                                + inner.substring (pos);
                                navigation.innerHTML = newInner;
                            }
                        }
                    }
                    origMainNavInnerHTML = mainNav.innerHTML;
                }
                else if (mainNav.innerHTML != origMainNavInnerHTML)
                {
                    mainNav.innerHTML = origMainNavInnerHTML;
                }

                var newSubMenu = '';
                for (var i = 0; i < settings.AddToMenu_NeueFotos.value.length; i++)
                {
                    var setting = settings.AddToMenu_NeueFotos.value [i];
                    if (setting [3] === true)
                    {
                        newSubMenu = newSubMenu+'<a href="http://www.model-kartei.de/'+tr ('fotos','photos')+'/stream/all/?sedcard='
                        + setting [0];

                        if (settings.AddToMenu_NeueFotos_justNear.value)
                        {
                            newSubMenu = newSubMenu+'&kmFilter='+settings.KmFilterNear.value.toString ();
                        }
                        else if (settings.AddToMenu_NeueFotos_justNotTooFar.value)
                        {
                            newSubMenu = newSubMenu+'&kmFilter='+settings.KmFilterNotTooFar.value.toString ();
                        }

                        newSubMenu = newSubMenu + '">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' + setting [2] + '</a>';
                    }
                }
                if (newSubMenu.length > 0)
                {
                    mainNav.innerHTML = mainNav.innerHTML.replace (
                        '<a href="http://www.model-kartei.de/fotos/stream/all/">'+tr ('Neue Fotos','New Photos')+'</a>',
                        '<a href="http://www.model-kartei.de/fotos/stream/all/">'+tr ('Neue Fotos','New Photos')+':</a>'
                        + newSubMenu);
                }
            }
        }




        function createSettings_Heading (title)
        {
            var h2 = document.createElement ('h2');
            h2.setAttribute ('class', 'iLabel');
            h2.innerHTML = title;
            return h2;
        }

        function createSettings_hr_blind_large ()
        {
            var hr = document.createElement ('hr');
            hr.setAttribute ('class', 'blind large');
            return hr;
        }

        function createSettings_hr_blind_medium ()
        {
            var hr = document.createElement ('hr');
            hr.setAttribute ('class', 'blind medium');
            return hr;
        }

        function createWiseGuyWithLamp (title)
        {
            var div = document.createElement ('div');
            div.setAttribute ('class', 'wiseGuy');
            div.innerHTML = '<span class="bulb"></span>'+title;
            return div;
        }


        var nameTokenForOrElement        = '__OR__';
        var nameTokenForValueElement     = '___Value';
        var nameTokenForInputElement     = '___Input';
        var nameTokenForOldValueElement  = '___Old';
        var nameTokenForOrigValueElement = '___Orig';
        var nameTokenForColorPreview     = '___Preview';


        function createColorPreviewElementCODE (tagName, setting, txt)
        {
            var key = keyOfStoredPreferences (setting.storageID);
            return '<'+tagName+' id="' + key + nameTokenForColorPreview + '">' + txt + '</'+tagName+'>';
        }


        function appendSessingsRow (mainDiv, title, title2, toolTip, setting, additionalData) // additionalData can be either a settings element or a string
        {
            //  e.g.: {value: null, storageID: 7, valueType: 'boolean',
            //         origValue: origSettingBeautifyPNTexts, idxInArray: 0};
            if (setting.valueType == 'arrArray')
            {
                var boolIdx = setting.idxInArray;
                for (var i = 0; i < setting.value.length; i++)
                {
                    var item = setting.value [i];
                    var isOn = (item [boolIdx] === true);

                    var divTitle = document.createElement ('div');
                    divTitle.setAttribute ('class', 'col c-3-2-1 fSmaller4');
                    divTitle.setAttribute ('title', toolTip);
                    divTitle.innerHTML = title + ' "' + item [2]+'"';

                    var name  = keyOfStoredArrayPreferences (setting.storageID, i);
                    var name1 = name+'___1';
                    var name0 = name+'___0';

                    var divInput = document.createElement ('div');
                    divInput.setAttribute ('class', 'col c-3-2 multiRadio full');
                    divInput.innerHTML =
                    '<input '+(isOn ? 'checked' : '')+' id="'+name1+'" name="'+name+'" type="radio" value="1" /> '+
                    '<label for="'+name1+'">'+trFunc ('Ja', 'Yes')+'</label>'+
                    '<input '+(isOn ? '' : 'checked')+' id="'+name0+'" name="'+name+'" type="radio" value="0" /> '+
                    '<label for="'+name0+'">'+trFunc ('Nein', 'No')+'</label>';

                    var outerDiv = document.createElement ('div');
                    outerDiv.setAttribute ('class', 'row');
                    outerDiv.appendChild (divTitle);
                    outerDiv.appendChild (divInput);
                    mainDiv.appendChild  (outerDiv);

                    // our arrArray settings are Boolean always
                    $('#'+name1).on ("click", updateBooleanArraySetting);
                    $('#'+name0).on ("click", updateBooleanArraySetting);
                }
            }
            else
            {
                var name      = keyOfStoredPreferences (setting.storageID);
                var nameValue = name+nameTokenForValueElement;

                var divTitle  = document.createElement ('div');
                divTitle.setAttribute ('class', 'col c-3-2-1 fSmaller4');
                divTitle.setAttribute ('title', toolTip);
                divTitle.innerHTML = title;
                var divInput = document.createElement ('div');

                var inputElementID = '';

                switch (setting.valueType)
                {
                    case 'boolean':
                        var name1 = name+'___1';
                        var name0 = name+'___0';
                        if ( ! (additionalData === null))
                        {
                            name1 = name1 + nameTokenForOrElement + keyOfStoredPreferences (additionalData.storageID);
                            name0 = name0 + nameTokenForOrElement + keyOfStoredPreferences (additionalData.storageID);
                        }
                        divInput.setAttribute ('class', 'col c-3-2 multiRadio full');
                        divInput.innerHTML =
                        '<input '+(setting.value ? 'checked' : '')+' id="'+name1+'" name="'+name+'" type="radio" value="1" /> '+
                        '<label for="'+name1+'">'+trFunc ('Ja', 'Yes')+'</label>'+
                        '<input '+(setting.value ? '' : 'checked')+' id="'+name0+'" name="'+name+'" type="radio" value="0" /> '+
                        '<label for="'+name0+'">'+trFunc ('Nein', 'No')+'</label>';
                        break;

                    case 'integer':
                        divTitle.innerHTML = '<table><tr><td valign="bottom" width="99%">'+divTitle.innerHTML + '</td><td valign="bottom" width="1%"><b><big id="'+nameValue+'">'+setting.value+'&nbsp;km</big></b></td></tr></table>';
                        var name  = keyOfStoredPreferences (setting.storageID);
                        var nameDown_20 = name+'___-20';
                        var nameDown_5  = name+'___-5';
                        var nameDown_1  = name+'___-1';
                        var nameUp_1    = name+'___1';
                        var nameUp_5    = name+'___5';
                        var nameUp_20   = name+'___20';
                        var background  = 'style="background-color:'+(isDarkTheme ? '#546460' : '#eda')+'"';
                        divInput.setAttribute ('class', 'col c-3-2 multiRadio');
                        divInput.innerHTML =
                        '<input  id="'+nameDown_20+'" name="'+name+'" type="radio" value="-20" /> '+
                        '<label for="'+nameDown_20+'" '+background+'><big>&nbsp; &nbsp; -20 &nbsp; &nbsp;</big></label>'+
                        '<input  id="'+nameDown_5+'" name="'+name+'" type="radio" value="-5" /> '+
                        '<label for="'+nameDown_5+'" '+background+'><big>&nbsp; &nbsp; -5 &nbsp; &nbsp;</big></label>'+
                        '<input  id="'+nameDown_1+'" name="'+name+'" type="radio" value="-1" /> '+
                        '<label for="'+nameDown_1+'" '+background+'><big>&nbsp; &nbsp; -1 &nbsp; &nbsp;</big></label>'+
                        '<input  id="'+nameUp_1+'" name="'+name+'" type="radio" value="1" /> '+
                        '<label for="'+nameUp_1+'" '+background+'><big>&nbsp; &nbsp; +1 &nbsp; &nbsp;</big></label>'+
                        '<input  id="'+nameUp_5+'" name="'+name+'" type="radio" value="5" /> '+
                        '<label for="'+nameUp_5+'" '+background+'><big>&nbsp; &nbsp; +5 &nbsp; &nbsp;</big></label>' +
                        '<input  id="'+nameUp_20+'" name="'+name+'" type="radio" value="20" /> '+
                        '<label for="'+nameUp_20+'" '+background+'><big>&nbsp; &nbsp; +20 &nbsp; &nbsp;</big></label>';
                        break;

                    case 'color':
                        divTitle.setAttribute ('align', 'right');
                        var divInnerTitle  = document.createElement ('div');
                        divInnerTitle.setAttribute ('class', 'col c-3-2-1 fSmaller4');
                        divInnerTitle.innerHTML = '&nbsp;&nbsp;&nbsp;'+title2;

                        var initialValue = setting.value.substring (1);
                        var originalValue = additionalData.substring (1);

                        var name  = keyOfStoredPreferences (setting.storageID);
                        inputElementID        = name + nameTokenForInputElement;
                        var nameOldValue      = name + nameTokenForOldValueElement;
                        var nameOriginalValue = name + nameTokenForOrigValueElement;
                        var background  = ' style="color:#000; background-color:#f0e8d0; font-size:115%" ';
                        divInput.setAttribute ('class', 'col c-3-2 multiRadio');

                        var toolTipOldButton =
                            trFunc ('Alten Wert wieder eintragen, der vor dem Laden dieser &quot;Einstellungen&quot;-Seite aktiv war',
                                    'Re-enter the old value that was active before you opened this Settings page');
                        var toolTipOrigButton =
                            trFunc ('Originalwert eintragen, der bei MKBeautifier voreingestellt ist',
                                    'Re-enter the MKBeautifier default value');

                        divInput.innerHTML =
                        '<div style="background-color:#363636">'+
                            divInnerTitle.outerHTML+

                            '<table><tr><td><big>&nbsp;#&nbsp;'+
                            '<input autocomplete="off" class="width25" '+background+
                                   'id="'+inputElementID+'" maxlength="6" name="'+name+'" placeholder="?" '+
                                   'type="text" value="'+initialValue+'" lastValidValue="'+initialValue+'" />'+
                            '</big>'+
                            '<button id="'+nameOldValue+'" title="' + toolTipOldButton + ':\n' +
                                initialValue+
                                '" class="marginLeft10" explicitValue="'+initialValue+'">'+
                            '</button>'+
                            '<button id="'+nameOriginalValue+'" title="' + toolTipOrigButton + ':\n' +
                                additionalData.substring (1)+
                                '" class="marginLeft10" explicitValue="'+originalValue+'">'+
                            '</button>'+
                            '</td></tr></table>'
                        +'</div>'
                }

                var outerDiv = document.createElement ('div');
                if (setting.valueType != 'color')
                {
                    outerDiv.setAttribute ('class', 'row');
                }

                outerDiv.appendChild (divTitle);
                outerDiv.appendChild (divInput);

                mainDiv.appendChild  (outerDiv);


                if (setting.valueType == 'color')
                {
                    updateColorPreviewAndButtons (inputElementID, setting.value);
                }


                switch (setting.valueType)
                {
                    case 'boolean':
                        $('#'+name1).on ("click", updateBooleanSetting);
                        $('#'+name0).on ("click", updateBooleanSetting);
                        break;
                    case 'integer':
                        $('#'+nameDown_20).on ("click", updateIntegerSetting);
                        $('#'+nameDown_5 ).on ("click", updateIntegerSetting);
                        $('#'+nameDown_1 ).on ("click", updateIntegerSetting);
                        $('#'+nameUp_1   ).on ("click", updateIntegerSetting);
                        $('#'+nameUp_5   ).on ("click", updateIntegerSetting);
                        $('#'+nameUp_20  ).on ("click", updateIntegerSetting);
                        break;
                    case 'color':
                        $('#'+inputElementID        ).on ("keyup", updateColorSetting); // so we get the changed text right after the key is up again
                        $('#'+nameOldValue     ).on ("click", updateColorSetting);
                        $('#'+nameOriginalValue).on ("click", updateColorSetting);
                        break;
                }
            }
        }


        function updateColorSetting ()
        {
            var newValue = '';

            var elementID = $( this ).attr ('id');
            var posInput  = elementID.indexOf (nameTokenForInputElement);
            if (posInput > -1)
            {
                var inputElement = document.getElementById (elementID);
                var sInput = inputElement.value;
                var sValue = sInput;

                // remove leading '0'
                var removed0s = '';
                while (sValue.length > 0 && sValue.substring (0,1) == '0')
                {
                    removed0s = removed0s + '0';
                    sValue    = sValue.substring (1);
                }

                if (sValue.length == 0)
                {
                    newValue = '#000000';
                }
                else
                {
                    var intValue = parseInt (sValue, 16);
                    if ( ! Number.isNaN(intValue))
                    {
                        var s = intToHexColor (intValue, removed0s);
                        // check length: we do not accept invalid chars in the mid/end of the string
                        if (s.length == sInput.length+1)
                        {
                            newValue = s;
                            //console.log ('OK: ', newValue);
                        }
                    }
                }
                if (newValue.length > 0)
                {
                    inputElement.setAttribute ('lastValidValue', newValue.substring (1));
                    var storageID = getStorageIDFromKey (elementID);
                    //console.log (storageID, '  new value:', newValue);
                    updateSinglePreferenceValue (storageID, newValue, 0);
                }
                else
                {
                    //console.log ('bad input:', sValue);
                    inputElement.value = inputElement.getAttribute ('lastValidValue');
                }
            }
            else // not the input element but one of it's buttons:
            {
                var buttonElement  = document.getElementById (elementID);
                newValue           = '#'+buttonElement.getAttribute ('explicitValue');
                var inputElementID = elementID.substring (0, elementID.indexOf ('___'))+nameTokenForInputElement;
                var inputElement   = document.getElementById (inputElementID);
                inputElement.value = newValue.substring (1);
                var storageID = getStorageIDFromKey (inputElementID);
                updateSinglePreferenceValue (storageID, newValue, 0);
            }

            updateColorPreviewAndButtons (elementID, newValue);
        }


        function updateColorPreviewAndButtons (elementID, newValue)
        {
            if (newValue.length > 0)
            {
                var nameBase = elementID.substring (0, elementID.indexOf ('___'));
                var previewElementID = nameBase + nameTokenForColorPreview;
                var previewElement   = document.getElementById (previewElementID);
                if ( ! (previewElement === null))
                {
                    previewElement.setAttribute ('style', 'color:'+newValue);
                }
                var nameTokens = [nameTokenForOldValueElement, nameTokenForOrigValueElement];

                var valueButtonID = nameBase + nameTokenForOldValueElement;
                var buttonElement = document.getElementById (valueButtonID);
                var areaBgColor  = '#363636';
                var oldColorCode = '';
                if ( ! (buttonElement === null))
                {
                    oldColorCode = '#'+buttonElement.getAttribute ('explicitValue');
                    if (newValue == oldColorCode)
                    {
                        buttonElement.style.backgroundColor = areaBgColor;
                        buttonElement.innerHTML             = '<big style="color:'+areaBgColor+'">&#8630;</big>';
                    }
                    else
                    {
                        buttonElement.style.backgroundColor = '#394945';
                        buttonElement.innerHTML             = '<big>&#8630;</big>';
                    }
                }
                valueButtonID = nameBase + nameTokenForOrigValueElement;
                buttonElement = document.getElementById (valueButtonID);
                if ( ! (buttonElement === null))
                {
                    origColorCode = '#'+buttonElement.getAttribute ('explicitValue');
                    if (newValue == origColorCode || oldColorCode == origColorCode)
                    {
                        buttonElement.style.backgroundColor = areaBgColor;
                        buttonElement.innerHTML             = '<big style="color:'+areaBgColor+'">&#x2600;</big>';
                    }
                    else
                    {
                        buttonElement.style.backgroundColor = '#394945';
                        buttonElement.innerHTML             = '<big>&#x2600;</big>';
                    }
                }
            }
        }


        function updateBooleanSetting ()
        {
            var value       = $( this ).attr ('value');
            var valueIsSet  = (value == '1');
            var elementID   = $( this ).attr ('id');
            var orElementID = '';
            var hasOrElement= false;
            var posOr       = elementID.indexOf (nameTokenForOrElement);
            if (posOr > 0)
            {
                hasOrElement= true;
                orElementID = elementID.substring (posOr + nameTokenForOrElement.length);
                elementID   = elementID.substring (0, posOr);
            }
            var storageID = getStorageIDFromKey (elementID);
            updateSinglePreferenceValue (storageID, valueIsSet, 0);

            // just one of the elements can be ON, but both can be OFF
            if (hasOrElement && valueIsSet)
            {
                var orStorageID = getStorageIDFromKey (orElementID);
                updateSinglePreferenceValue (orStorageID, false, 0);
                var orID1 = orElementID+'___1'+nameTokenForOrElement+elementID.replace ('___1','');
                $('#'+orID1).prop("checked", false);
                var orID0 = orElementID+'___0'+nameTokenForOrElement+elementID.replace ('___1','');
                $('#'+orID0).prop("checked", true);
            }

            if (storageID == settings.AddToMenu_NeueFotos_justNear.storageID ||
                storageID == settings.AddToMenu_NeueFotos_justNotTooFar.storageID)
            {
                processMenuItemsForNewPhotos (false);
            }
        }


        function updateIntegerSetting ()
        {
            var sDelta = $( this ).attr ('value');
            var delta  = Number(sDelta);
            if (! Number.isNaN(delta))
            {
                var elementID = $( this ).attr ('id');
                var storageID = getStorageIDFromKey (elementID);
                var i = elementID.lastIndexOf ('___');
                if (i > 1)
                {
                    var nameForValueElement = elementID.substring (0,i)+nameTokenForValueElement;
                    var container = document.getElementById (nameForValueElement);
                    if (container != null)
                    {
                        var sValue = container.innerHTML.substring (0, container.innerHTML.indexOf ('&nbsp;km'));
                        var value  = Number(sValue);
                        if (! Number.isNaN(value))
                        {
                            value += delta;
                            if (value < 0)
                            {
                                value = 0;
                            }
                            else if (value > 1000)
                            {
                                value = 1000;
                            }
                            container.innerHTML = value.toString ()+'&nbsp;km';
                            updateSinglePreferenceValue (storageID, value, 0);

                            $( this ).prop("checked", false);
                        }
                    }
                }
            }
        }


        function updateBooleanArraySetting ()
        {
            var value     = $( this ).attr ('value');
            var elementID = $( this ).attr ('id');
            var storageID = getStorageIDFromKey (elementID);
            // our arrArray elements always have names ending with '_'+rowNumber+'___'+[1|0]
            var i = elementID.lastIndexOf ('___');
            if (i > 1)
            {
                var s = elementID.substring (0, i);
                i = s.lastIndexOf ('_');
                if (i > -1)
                {
                    var s = s.substring (i+1);
                }
                var rowInArray = Number(s);
                if (! Number.isNaN(rowInArray))
                {
                    updateSinglePreferenceValue (storageID, (value == '1'), rowInArray);

                    if (storageID == settings.AddToMenu_NeueFotos.storageID)
                    {
                        processMenuItemsForNewPhotos (false);
                    }
                }
            }
        }



        var uPageTokenGoToSedcard  = '?GoToSedcard';
        var uPageTokenMKBeautifier = '?MKBeautifier';
        var uPageTokenPrepareDaSi  = '_Save_data';
        var uPageTokenRestoreDaSi  = '_Restore_data';
        var uPageTokenListMarkers  = '_Marker';

        function prepareDaSiFunction ()
        {
            var href = location.href + uPageTokenPrepareDaSi;
            window.location.href = href;
        }

        function restoreDaSiFunction ()
        {
            var href = location.href + uPageTokenRestoreDaSi;
            window.location.href = href;
        }

        function createTooltippedTextForSilentIgnore (txt)
        {
            var tooltip = 'Die Idee des &quot;Silent Ignore&quot;: Ignorieren ohne zu &auml;rgern!\n'+
            '\n'+
            'Verbergen von einigen der Inhalte eines Teilnehmers, OHNE ihn/sie tats&auml;chlich in die Ignore-Liste des MK-Systems einzutragen.\n'+
            '\n'+
            'Wer von Dir in &quot;Silent Ignore&quot; genommen wurde, sieht also weiterhin, was DU ver&ouml;ffentlichst und kann sich (z.B. in Bildkommentaren oder im Forum) beliebig zu Deinen Bildern oder Themen &auml;u&szlig;ern, aber DU selber siehst seine/ihre PN-Titel und/oder Forum-Texte und/oder Bilder in der Vorschauliste der neuen Bilder ggfs. nicht mehr.\n'+
            '\n'+
            'Es ist also eine reine Darstellungs-Unterdr&uuml;ckung bzw. -&Auml;nderung f&uuml;r Dich selber, doch der/die solcherart &quot;ignorierte&quot; bemerkt es vermutlich nicht ... bzw. vermutet es evtl. h&ouml;chstens deswegen, weil Du im Forum nicht auf Beitr&auml;ge reagierst.\n'+
            '\n'+
            'WICHTIG: Ob jemand im &quot;Silent Ignore&quot; ist, oder nicht, wird\n'+
            '         (so wie alle gesetzten MKBeautifier-Marker) nur als lokale\n'+
            '         Information auf Deinem eigenen Rechner gespeichert.\n'+
            '         Das MK-System weiss davon nichts.\n'+
            '\n'+
            'Um einen User ins &quot;Silent Ignore&quot; zu setzen, klicke auf der betreffenden\n'+
            'Sedcard neben dem &quot;Neue Nachricht&quot;-Icon den &quot;i&quot;-Marker\n'+
            '(links nebem dem &quot;!!&quot;-Marker).';
            return '<i title="'+tooltip+'">'+txt+'</i>';
        }


        function createDataLinesForDaSi ()
        {
            var numItems = storage.length;

            var dataLines = '';
            var newLine   = '';

            for (var i=0; i<numItems-1; i++)
            {
                var longKey = storage.key (i);
                var item    = storage.getItem (longKey);
                var key     = storageKeyFromLongKey (longKey);

                var storedOwnID = storageOwnIDFromLongKey (longKey);
                if (storedOwnID == '' || storedOwnID == ownID)
                {

                  if (itemFormatIDItemKey == key)
                  {
                      longKey = key;
                  }
                  else if (storedOwnID == '')
                  {
                      longKey = makeOwnKey (key);
                  }

                  if (key.substring (0, 1) == 'u')
                  {
                    var object = getUserStorageObjectFromString (item);
                    if (object != null)
                    {
                        if (objectHasSettingsOfMine (object))
                        {
                            if (object.note.length > 0)
                            {
                                object.note = '\\';
                                item = createUserStorageItemFromObject (object, false);
                            }
                            var entry = 'i'+longKey+':'+item;
                            if (newLine.length + entry.length > 72)
                            {
                                dataLines = dataLines + newLine + '\n';
                                newLine = '';
                            }
                            newLine = newLine + entry;
                        }
                    }
                  }
                  else if (key.indexOf (preferenceStorageKeyBASE) == 0)
                  {
                    var entry = 's'+longKey+':'+item;
                    dataLines = dataLines + entry + '\n'; // one entry per line
                  }
                }
            }
            if (newLine.length > 0)
            {
                dataLines = dataLines + newLine;
            }
            return dataLines;
        }


        //
        // process the user's OWN u page:
        // if parameter MKBeautifier set we use the u page
        // as a container for the MKBeautifier settings
        //
        var anyStopwatchActive = false;  // aux variable to be set by km-sorting

        var uPageTokenInURL = 'model-kartei.de/u/';
        if (location.href.indexOf (uPageTokenInURL) > -1)
        {
            var s = location.href;
            s     = s.substring (s.indexOf (uPageTokenInURL) + uPageTokenInURL.length);
            if (s.indexOf (ownID + '/') == 0)
            {
                var uPageParameter = s.substring (ownID.length+1);
                if (uPageParameter == uPageTokenMKBeautifier)
                {
                    var content = document.getElementById ('content');
                    if (content != null)
                    {
                        document.title = tr ('MKBeautifier-Einstellungen','MKBeautifier Settings')+' · model-kartei.de';
                        content.innerHTML = '';

                        var outerDiv = document.createElement ('div');
                        outerDiv.setAttribute ('class', 'row');

                        content.appendChild (outerDiv);

                        var h1a = document.createElement ('h1');
                        h1a.setAttribute ('class', 'tCenter');
                        h1a.innerHTML = trFunc ('Datensicherung f&uuml;r MKBeautifier', 'Data Backup for MKBeautifier');
                        outerDiv.appendChild (h1a);

                        outerDiv.appendChild (createSettings_hr_blind_medium ());

                        outerDiv.appendChild (createWiseGuyWithLamp (
                            tr ('MKBeautifier speichert alle Deine Eingaben <i>NUR lokal</i>, darum lege bitte ab und zu eine &quot;Datensicherung&quot; an.',
                                'MKBeautifier is storing your input JUST LOCALLY so make sure to backup your data every here and then.')
                            ));

                        var center1 = document.createElement ('center');
                        var dasiTable = document.createElement ('table');
                        dasiTable.setAttribute ('border', '0');
                        dasiTable.setAttribute ('cellspacing', '32');
                        dasiTable.setAttribute ('cellpadding', '0');

                        var tr    = document.createElement("tr");
                        var td1   = document.createElement("td");
                        var tdGap = document.createElement("td");
                        var td2   = document.createElement("td");

                        td1.innerHTML = '<input id="DaSiPrepare" name="DaSiPrepare" type="button" value="'+trFunc ('Neue Datensicherung jetzt anlegen!',
                                                                                                                   'Create your brand-new backup right now!')+'" /> ';
                        td2.innerHTML = '<input id="DaSiRestore" name="DaSiRestore" type="button" value="'+trFunc ('Alte Datensicherung einspielen?',
                                                                                                                   'Restore data by using your old backup?')+'" /> '

                        tdGap.innerHTML = '&nbsp;';

                        dasiTable.appendChild  (tr);
                        tr.appendChild     (td1);
                        tr.appendChild     (tdGap);
                        tr.appendChild     (td2);

                        center1.appendChild  (dasiTable);
                        outerDiv.appendChild (center1);

                        $('#DaSiPrepare').on ("click", prepareDaSiFunction);
                        $('#DaSiRestore').on ("click", restoreDaSiFunction);


                        outerDiv.appendChild (createSettings_hr_blind_large ());


                        var h1b = document.createElement ('h1');
                        h1b.setAttribute ('class', 'tCenter');
                        h1b.innerHTML = trFunc ('Einstellungen f&uuml;r MKBeautifier', 'MKBeautifier Settings');
                        outerDiv.appendChild (h1b);

                        outerDiv.appendChild (createSettings_hr_blind_medium ());

                        var divHintForH1b  = document.createElement ('center');
                        //divInnerTitle.setAttribute ('class', 'col c-3-2-1 fSmaller4');
                        divHintForH1b.innerHTML = '<small><i>'+
                            trFunc ('Deine hier vorgenommenen Einstellungen und alle von Dir auf besuchten Sedcards evtl. eingeschaltete MKBeautifier-&quot;Marker&quot;<br />'+
                                    'werden NUR im lokalen Speicher des Browsers auf dem Ger&auml;t gespeichert, das Du jetzt gerade verwendest.<br />'+
                                    '<b>Die oben m&ouml;gliche &quot;Datensicherung&quot; ist also durchaus sinnvoll.',
                                    'All of the settings that specified here, and all of the MKBeautifier &quot;Flags&quot; activated on user sedcards<br />'+
                                    'are stored in the &quot;local storage&quot; of your currently used PC\'s browser ONLY.<br />'+
                                    '<b>So it makes a lot of sense to think about creating a backup, see these two buttons shown above.')+
                            '</b></i></small>';

                        outerDiv.appendChild (divHintForH1b);

                        var mainDiv = document.createElement ('div');
                        mainDiv.setAttribute ('class', 'settingList');

                        outerDiv.appendChild (mainDiv);

                        mainDiv.appendChild (createSettings_hr_blind_medium ());

                        mainDiv.appendChild (
                            createSettings_Heading (trFunc ('Allgemeine Einstellungen', 'General Settings')));

                        appendSessingsRow (mainDiv, '&#8596; &nbsp; &nbsp; '+
                            trFunc ('Grenze f&uuml;r &quot;Nah&quot;-Entfernung',
                                    '&quot;Near&quot; distance value'), '',
                            trFunc ('Bis zu welcher km-Entfernung zu Dir gelten Teilnehmer noch als "Nah"?',
                                    'What is the maximum distance (in km please) that you call "Near"?'),
                                           settings.KmFilterNear, null);

                        appendSessingsRow (mainDiv, '<big><b>&#8644;</b> &nbsp; &nbsp; </big>'+
                            trFunc ('Grenze f&uuml;r &quot;Nicht zu weit weg&quot;',
                                    '&quot;Not too far away&quot; value'), '',
                            trFunc ('Bis zu welcher km-Entfernung zu Dir gelten Teilnehmer noch als "Nicht zu weit weg"?',
                                    'What is the maximum distance (in km please) that you call "Not too far away"?'),
                                           settings.KmFilterNotTooFar, null);

                        mainDiv.appendChild (createSettings_hr_blind_medium ());

                        appendSessingsRow (mainDiv,
                            trFunc ('Farben der &quot;km&quot;-Anzeige:',
                                    'Colors of &quot;km&quot; values:'),
                            createColorPreviewElementCODE ('i', settings.InfoColor_Near,
                                                           trFunc ('Farbcode f&uuml;r &quot;Nah&quot;',
                                                                   'Color code for &quot;Near&quot;')),
                            trFunc ('Diese Farben gelten für Teilnehmer, die je nach den oben definierten km-Entfernung-Grenzen als "Nah" angesehen werden, oder als "Nicht zu weit weg" oder als "weit entfernt".',
                                    'Here you may define the colors to be used for showing users that are either "Near" or "Not too far away" or "far away" according to distance values specified above.'),
                                           settings.InfoColor_Near, origSettingInfoColor_Near);

                        appendSessingsRow (mainDiv, '',
                            createColorPreviewElementCODE ('i', settings.InfoColor_NotTooFarAway,
                            trFunc ('f&uuml;r &quot;Nicht zu weit weg&quot;',
                                    'for &quot;Not too far away&quot;')),
                                           '',
                                           settings.InfoColor_NotTooFarAway, origSettingInfoColor_NotTooFarAway);

                        appendSessingsRow (mainDiv, '',
                            createColorPreviewElementCODE ('i', settings.InfoColor_FarAway,
                            trFunc ('f&uuml;r weite Entfernungen',
                                    'for users who are far away')),
                                           '',
                                           settings.InfoColor_FarAway, origSettingInfoColor_FarAway);



                        mainDiv.appendChild (createSettings_hr_blind_large ());


                        mainDiv.appendChild (
                            createSettings_Heading (trFunc ('Pers&ouml;nliche Startseite','Personal Start Page')));

                        appendSessingsRow (mainDiv, trFunc ('Nur ZUKUNFT im Tage-Z&auml;hler-Widget zeigen','Show FUTURE days counters only'), '',
                                   trFunc ('Soll das Startseite-Widget nur zukünftige Tage-Zähler anzeigen?\n\n'+
                                           '(wird ignoriert, falls der obige beiden Schalter inaktiv sind)',
                                           'Show only future items in the list of days counters on your personal start page?\n\n'+
                                           '(setting will be ignored if both of the preceeding options are set to No)'),
                                           settings.JustTheFutureCountersOnStartpage, null);

                        appendSessingsRow (mainDiv, trFunc ('Tage-Z&auml;hler als oberstes Widget','Days counters as top-most widget'), '',
                                   trFunc ('Tage-Zähler-Liste (falls Du auf besuchten Sedcards welche aktiviert hast) als oberstes Startseiten-Widget anzeigen?\n\n'+
                                           '(wird ignoriert, falls der folgende Schalter aktiv ist)',
                                           'Show your list of days counters (if you have activated any on sedcards visited by you) as the top-most widget on your personal start page?\n\n'+
                                           '(setting will be ignored if the following option is set to Yes)'),
                                           settings.ShowListOfDaysAtTopOfStartpage, settings.ShowListOfDaysAtBottomOfStartpage);

                        appendSessingsRow (mainDiv, trFunc ('Tage-Z&auml;hler als unterstes Widget','Days counters as bottom-most widget'), '',
                                   trFunc ('Tage-Zähler-Liste (falls Du auf besuchten Sedcards welche aktiviert hast) als unterstes Startseiten-Widget anzeigen?\n\n'+
                                           '(wird ignoriert, falls der obige Schalter aktiv ist)',
                                           'Show your list of days counters (if you have activated any on sedcards visited by you) as the bottom-most widget on your personal start page?\n\n'+
                                           '(setting will be ignored if the preceeding option is set to Yes)'),
                                           settings.ShowListOfDaysAtBottomOfStartpage, settings.ShowListOfDaysAtTopOfStartpage);

                        appendSessingsRow (mainDiv, trFunc ('Deine MK ID-Nummer einblenden','Show your MK ID number'), '',
                                    trFunc ('Zeigt die ID-Nummer Deines model-kartei.de Accounts einmal oben/links auf Deiner Persönlichen Startseite, wenn Du das nächste Mal die Startseite ansiehst.',
                                            'Show the ID number of your model-kartei.account in the upper/left part of your Personal Start Page? The number will be shown just once, the next time you open the Start Page.'),
                                           settings.ShowShowUserIDOnStartpage, null);



                        mainDiv.appendChild (createSettings_hr_blind_large ());


                        mainDiv.appendChild (
                            createSettings_Heading (trFunc ('Pers&ouml;nliche Nachrichten','Private Messages')));

                        appendSessingsRow (mainDiv,
                                           trFunc ('PN-Titel von Teilnehmern <i>hoher Wichtigkeit</i> hervorheben',
                                                   'Highlight message titles of users of <i>high importance</i>'),
                                            '',
                                           trFunc ('Hervorheben der PN-Titel von Leuten, auf deren Sedcard Du\n'+
                                                   'den Marker "Wichtigkeit: Hoch" aktiviert hast?',
                                                   'Want to highlight the titles of personal messages that were sent to you by people whom you had flagged as "Importance: High" ?'),
                                           settings.HighlightPNTitleIfUserHasSmiley, null);

                        appendSessingsRow (mainDiv,
                                           trFunc ('PN-Titel '+createTooltippedTextForSilentIgnore ('still ignorierter Teilnehmer')+' ausblenden',
                                                   'Hide silently ignored users\' message titles'),
                                            '',
                                           trFunc ('Ausblenden der PN-Titel von Leuten, die Du im "Silent Ignore" hast?\n\n'+
                                                   'Bei "Nein" erkennst Du den Status dennoch am "Silent Ignore"-Marker und an der Graufärbung des Eintrags.',
                                                   'Want to hide the titles of personal messages that were sent to you by people who you had flagged as "Silently Ignored"?\n\n'+
                                                   'If "No" you will still be able to spot their status by seeing the "Silent Ignore" flag and the message list entry being grayed out.'),
                                           settings.HidePNTitleIfUserIgnored, null);

                        mainDiv.appendChild (createSettings_hr_blind_medium ());

                        appendSessingsRow (mainDiv,
                                           trFunc ('Schrift in PNs und PN-Listen versch&ouml;nern',
                                                   'Beautify texts in messages and message lists'), '',
                                           trFunc ('Verschönern der Schrift von PN-Titeln und PN-Inhalt-Texten?\n\n'+
                                                   '(schaltet kursive Schrift ein und erlaubt bei aktiviertem "Standard Theme" besondere Farbgebung)',
                                                   'Prefer to see italics text and (if using the "Standard Theme") special colors?'),
                                           settings.BeautifyPNTexts, null);

                        if (isDarkTheme)
                        {
                            mainDiv.appendChild (createSettings_hr_blind_medium ());

                            appendSessingsRow (mainDiv, '<i>'+trFunc ('nur f&uuml;r Standard Theme','for Standard Theme only')+':</i>',
                                createColorPreviewElementCODE ('i', settings.DarkThemeColorForPNs_UserNames,
                                    trFunc ('Farbcode f&uuml;r Verfassernamen','Color code for author name')),
                                    trFunc ('Farbcodes zur Anzeige der PN-Verfasser und PN-Titel/-Inhalte.\n\n'+
                                           '(nur verfügbar, wenn Du das "Standard Theme" eingeschaltet hast, also nicht möglich für das "Helle Theme")',
                                            'Color codes to be used for author name of personal messages and for their titles/contents.\n\n'+
                                            '(available for "Standard Theme" only, but not for the "Bright Theme")'),
                                            settings.DarkThemeColorForPNs_UserNames, origSettingDarkThemeColorForPNs_UserNames);

                            appendSessingsRow (mainDiv, '',
                                                        createColorPreviewElementCODE ('i', settings.DarkThemeColorForPNs_Content,
                                                                trFunc ('Farbcode f&uuml;r Titel und Text','Color code for title and text')),
                                           '',
                                            settings.DarkThemeColorForPNs_Content, origSettingDarkThemeColorForPNs_Content);
                        }


                        mainDiv.appendChild (createSettings_hr_blind_large ());


                        mainDiv.appendChild (createSettings_Heading (trFunc ('Sedcards', 'Portfolio Pages')));

                        appendSessingsRow (mainDiv, trFunc ('Den Anfang Deiner Notiz einblenden','Display the (first words of) your Note'), '',
                                   trFunc ('Den Anfang Deiner evtl. auf einer Sedcard eingetragenen "Notiz" dort immer unter dem Teilnehmer-Namen einblenden?\n\n'+
                                           '(Egal ob ein oder ausgeschaltet, wird in jedem Fall die komplette Notiz als ToolTip auf dem Teilnehmernamen und auf dem (dann roten) Notiz-Marker eingeblendet.)',
                                           'If you have entered a Note on a sedard do you want to see the (first part of) of it engraved below the user name when ever you visit that sedcard again?\n\n(No matter if Yes or No you will in any case be able to see the complete note as a tooltip text by moving the mouse pointer over the user name / or over the (then red) Note action flag.)'),
                                           settings.ShowNoteOnSedcard, null);

                        appendSessingsRow (mainDiv, trFunc ('Schaltfl&auml;chen f&uuml;r neue &quot;Marker&quot; einblenden','Show additional &quot;Flags&quot;'), '',
                                   trFunc ('Zusätzliche "Marker" einblenden, deren Status allerdings NUR LOKAL im Speicher des von Dir verwendeten Browsers abgelegt wird?\n\n'+
                                           'BEACHTE die ggfs. nur begrenzte Nützlichkeit dieser Marker:\n\n'+
                                           'Falls Du von mehreren Geräten aus und/oder mit mehreren Browsern in die MK gehst, weiss der eine Browser jeweils NICHTS davon, welche Markern Du unter Verwendung des anderen Browsers (bzw. während der Nutzung des anderen Geräts) ein- oder ausgeschaltet hast.',
                                           'When using the additional MKBeautifier Flags please remember their status will be stored in the "local storage" of your currently used browser only!'),
                                           settings.UseAdditionalLocalUserFlags, null);



                        mainDiv.appendChild (createSettings_hr_blind_large ());


                        mainDiv.appendChild (createSettings_Heading (
                                trFunc ('Sedcard-Suchergebnis (beim suchen nach Fotografen, Visas, Models, ...)',
                                        'Sedcard Search Result (when searching for Photographers, Make-up Artists, Models, ...)')));

                        appendSessingsRow (mainDiv, trFunc ('Namen '+createTooltippedTextForSilentIgnore ('still ignorierter Teilnehmer')+' durchstreichen',
                                                            'Strike-out users with &quot;Silent Ignore&quot; flag'), '',
                                   trFunc ('Durchstreichen der Namen von Leuten, die Du im "Silent Ignore" hast?\n\n'+
                                           '(wird ignoriert, falls der folgende Schalter aktiv ist)',
                                           'Strike-out the names of users with "Silent Ignore" flag?\n\n'+
                                           '(setting will be ignored if the following option is set to Yes)'),
                                           settings.SearchResultPageStrikeOutIfSilentIgnored, settings.SearchResultPageHideIfSilentIgnored);

                        appendSessingsRow (mainDiv, trFunc ('Sedcards '+createTooltippedTextForSilentIgnore ('still ignorierter Teilnehmer')+' ausblenden',
                                                            'Hide users with &quot;Silent Ignore&quot; flag'), '',
                                   trFunc ('Ausblenden der Sedcards von Leuten, die Du im "Silent Ignore" hast?\n\n'+
                                           'Bei "Nein" werden die Sedcards solcher Leute nicht ausgeblendet, sondern nur durch das "Silent Ignore"-Symbol markiert.\n\n'+
                                           '(wird ignoriert, falls der obige Schalter aktiv ist)',
                                           'Remove users with "Silent Ignore" flag from the search result list?\n\n'+
                                           '(setting will be ignored if the preceeding option is set to Yes)'),
                                           settings.SearchResultPageHideIfSilentIgnored, settings.SearchResultPageStrikeOutIfSilentIgnored);



                        mainDiv.appendChild (createSettings_hr_blind_large ());


                        mainDiv.appendChild (createSettings_Heading (
                                trFunc ('&quot;Photostream&quot;, &quot;Best Of&quot;, und &quot;Neue Fotos&quot;-Seiten',
                                        '&quot;Photostream&quot;, &quot;Best Of&quot;, and &quot;New Photos&quot; pages')));

                        appendSessingsRow (mainDiv, trFunc ('Umrandungen neuer Fotos entfernen','Remove frames from new photos'), '',
                                           trFunc ('Ausblenden der senffarbenen Umrandungen neuer Bilder?', 'Remove those extra frames that are normally drawn around photo preview images that were uploaded recently'),
                                           settings.RemoveFramesFromNewFotos, null);

                        appendSessingsRow (mainDiv, trFunc ('Farbige Markierung je Teilnehmerart einblenden','Indicate user type via color bar'), '',
                                           trFunc ('Anzeige einer farbige Markierungslinie links des Links zur Sedcard der/des Hochladenden?\n\n'+
                                           'Speziell für die Foto-Liste mit neuen Bildern ALLER Sedcard-Typen!\n\n'+
                                           '(Unabhängig von dieser Einstellung wird der Sedcard-Typ immer (auch) als ToolTip auf dem Link angezeigt.)',
                                           'Show left side color bars indicating the user type'),
                                           settings.AddColorBarAsSedcardTypeIndicator, null);

                        appendSessingsRow (mainDiv, trFunc ('Online-Statusanzeige durch Leuchtpunkt ersetzen','Replace &quot;Online status&quot; lamp by little dot'), '',
                                   trFunc ('Anzeigen eines dezenteren "ist online"-Lämpchens links der Teilnehmer-Namen?\n\n'+
                                           '(wird ignoriert, falls der folgende Schalter aktiv ist)',
                                           'Replace that thick green bloc by a non-disturbing little dot-like status indicator?\n\n'+
                                           '(setting will be ignored if the following option is set to Yes)'),
                                           settings.BeautifyUserStatusLightForPhotoLinks, settings.RemoveUserStatusLightFromPhotoLinks);

                        appendSessingsRow (mainDiv, trFunc ('Online-Statusanzeige v&ouml;llig ausblenden','Totally hide the &quot;Online status&quot; indicator'), '',
                                   trFunc ('Ausblenden des "ist online"-Lämpchens links der Teilnehmer-Namen?\n\n'+
                                           '(wird ignoriert, falls der obige Schalter aktiv ist)',
                                           'Just hide the thick green bloc, so the online status will not be indicated any longer?\n\n'+
                                           '(setting will be ignored if the preceeding option is set to Yes)'),
                                           settings.RemoveUserStatusLightFromPhotoLinks, settings.BeautifyUserStatusLightForPhotoLinks);

                        appendSessingsRow (mainDiv, trFunc ('Namen hervorheben, wenn nicht zu weit weg','Highlight names if not too far away'), '',
                                   trFunc ('Farbliche Hervorhebung der "Nah" oder "nicht ZU weit entfernt" wohnenden Teilnehmer?\n\n'+
                                           '(Bei "Nein" verschwindet die Information dennoch nicht völlig, denn für alle "Nah" oder "nicht ZU weit entfernt" wird immer anstelle von "km" das entsprechende Doppelpfeil-Symbol eingeblendet)\n\n'+
                                           '(wirkt sich NICHT aus, wenn der Marker "Geringe Wichtigkeit" oder der "Warnung"-Marker aktiv sind)\n\n'+
                                           '(Wenn Du die Liste nach "Nah"-Entfernung filterst, wirkt sich der Schalter nur dann aus, wenn der folgende Schalter ebenfalls aktiv ist.)',
                                           ''),
                                           settings.HighlightNamesWhenNearOrNotTooFar, null);

                        appendSessingsRow (mainDiv, trFunc ('Namen auch beim &quot;Nah&quot;-Filtern hervorheben','Highlight names even if &quot;Near&quot; filter is active'), '',
                                   trFunc ('Namen auch DANN hervorheben, wenn nach "Nah"-Entfernung gefiltert wird?\n\n'+
                                           'Dieser Ergänzungs-Schalter zu obiger Einstellung und wirkt sich NUR dann aus, wenn obiger Schalter ebenfalls aktiv ist.\n\n'+
                                           '(Normalerweise werden Teilnehmer NICHT farblich als "Nah" hervorgehoben, wenn der km-Filter auf "Nah" steht, doch Du kannst die Hervorhebung mit diesem Schalter erzwingen.)',
                                           ''),
                                           settings.HighlightNamesWhenKmNearFilterActive, null);

                        appendSessingsRow (mainDiv, trFunc ('Namen von Favoriten so hervorheben wie &quot;Nah&quot;','Highlight your Favorites just like &quot;Near&quot; users'), '',
                                   trFunc ('Farbliche Hervorhebung Deiner Favoriten, so als seien sie alle in "Nah"- Entfernung?\n\n'+
                                           '(wirkt sich NICHT aus, wenn der Marker "Geringe Wichtigkeit" oder der "Warnung"-Marker aktiv sind)',
                                           ''),
                                           settings.HighlightFavoritesLikeNear, null);

                        appendSessingsRow (mainDiv, trFunc ('Dein Netzwerk so hervorheben wie &quot;Nah&quot;','Highlight your Network just like &quot;Near&quot;'), '',
                                   trFunc ('Farbliche Hervorhebung Deines Netzwerks, so als seien sie alle in "Nah"- Entfernung?\n\n'+
                                           '(wirkt sich NICHT aus, wenn der Marker "Geringe Wichtigkeit" oder der "Warnung"-Marker aktiv sind)',
                                           ''),
                                           settings.HighlightNetworkLikeNear, null);

                        appendSessingsRow (mainDiv, trFunc ('Bilder '+createTooltippedTextForSilentIgnore ('still ignorierter Teilnehmer')+' ausblenden',
                                                            'Hide images of users with &quot;Silent Ignore&quot; flag'), '',
                                   trFunc ('Ausblenden der Bilder von Leuten, die Du im "Silent Ignore" hast?\n\n'+
                                           'Bei "Nein" werden die Bilder solcher Leute nicht ausgeblendet, sondern nur durch das "Silent Ignore"-Symbol und durch Graufärbung des Teilnehmer-Namens markiert.',
                                           ''),
                                           settings.RemoveFiguresIfUserIgnored, null);

                        appendSessingsRow (mainDiv, trFunc ('Bilder aller MaleModels ausblenden',
                                                            'Hide images of male models'), '',
                                           trFunc ('Ausblenden aller von männlichen Models veröffentlichten Bilder?',
                                           ''),
                                           settings.RemoveFiguresOfMaleModels, null);



                        mainDiv.appendChild (createSettings_hr_blind_large ());


                        mainDiv.appendChild (createSettings_Heading (trFunc ('Einzelfoto-Seiten','Single Photo pages')));

                        appendSessingsRow (mainDiv, trFunc ('Ort, km und neue &quot;Marker&quot; oben einblenden','Show on top: Location, distance and new Flags'), '',
                                   trFunc ('Anzeige von Flagge, Ort und Entfernung zusätzlich auch oben direkt nebem dem Teilnehmer-Namen?\n\n'+
                                           '(bewirkt KEINE Verschiebung des großen Bildes)',
                                           'This does NOT change the position of the large image.'),
                                           settings.SinglePhotoPageShowLocationAtTop, null);

                        appendSessingsRow (mainDiv, trFunc ('Deine Notiz zum Teilnehmer oben einblenden','Show on top: Your Note for this user'), '',
                                   trFunc ('Anzeige Deiner evtl. auf der Sedcard des Teilnehmers eingetragenen "Notiz" oben unter dem Teilnehmer-Namen?\n\n'+
                                           '(dann wird das große Bild ein wenig weiter unten angezeigt)',
                                           'This causes the large image to be moved downwards just a little bit.'),
                                           settings.SinglePhotoPageShowNotesAtTop, null);


                        mainDiv.appendChild (createSettings_hr_blind_large ());


                        mainDiv.appendChild (createSettings_Heading (trFunc ('Forum','Forum')));

                        appendSessingsRow (mainDiv, trFunc ('<small>Liste &quot;Neue Beitr&auml;ge&quot;:</small> Abw&auml;rts-Pfeile einblenden',
                                                            'List of new posts: Show &quot;Down&quot; arrows'), '',
                                   trFunc ('Hinzufügen eines Schalters ganz rechts zu jedem Thread, der es erlaubt, diesen an der untere Ende der Seite herab zu sortieren?\n\n'+
                                           '(kostet ein wenig horizontalen Platz in der Thread-Liste und wird bei langen Forum-Namen etwas unschön aussehen, weil diese ein Stückchen weit in den Latest-Link-Button hinein geschrieben werden)',
                                           'Can be used to prevent a high activity thread from showing up at the top of the page again and again, if that thread is not interesting for you.'),
                                           settings.AddVotingButtonsToThreadList, null);

                        appendSessingsRow (mainDiv,
                                           trFunc ('<small>Einzelthema:</small> '+createTooltippedTextForSilentIgnore ('Still ignorierte Teilnehmer')+' minimieren',
                                                   'Single thread: Minimize posts if &quot;Silent Ignore&quot;'), '',
                                   trFunc ('Reduzieren der Beiträge von Leuten, die Du im "Silent Ignore" hast?\n\n'+
                                           '(Eingeblendet wird dann nur eine knappe Platzhalterzeile mit Verfassernamen, damit Du noch siehst, DASS der/die Betreffende etwas schrieb, aber Dir den Text nicht anzutun brauchst.',
                                           'Show placeholders for posts of users with "Silent Ignore" flag:\n\nTheir texts will be hidden,\njust the users\' names will be shown,\nso you see THAT they wrote something\nbut you will not see WHAT they wrote.'),
                                           settings.MinimizePostingsIfUserIgnored, null);



                        mainDiv.appendChild (createSettings_hr_blind_large ());


                        mainDiv.appendChild (createSettings_Heading (trFunc ('Hauptmenu &quot;Fotos&quot;','Main menu &quot;Photos&quot;')));

                        var groupNameForMenuEntryKmFilter = 'groupNameForMenuEntryKmFilter';
                        appendSessingsRow (mainDiv, '&#8596; &nbsp; &nbsp; <small>'+
                                                    trFunc ('Die Menu-Eintr&auml;ge gelten f&uuml;r</small> &quot;Nah&quot;-Entfernung','Create menu entries for</small> &quot;Near&quot; distance'), '',
                                    trFunc ('Sollen die zusätzlichen Menueinträge (siehe folgende Teilnehmertyp-Zeilen) auf spezielle Nach-Filterung der Listen verlinken, so dass Du nur die Bilder der Teilnehmer siehst, die in "Nah"-Entfernung zu Dir sind?',''),
                                           settings.AddToMenu_NeueFotos_justNear, settings.AddToMenu_NeueFotos_justNotTooFar);
                        appendSessingsRow (mainDiv, '<big><b>&#8644;</b> &nbsp; &nbsp; </big><small>'+
                                                    trFunc ('Die Menu-Eintr&auml;ge gelten f&uuml;r</small> &quot;Nicht zu weit weg&quot;','Create menu entries for</small> &quot;Not too far away&quot;'), '',
                                    trFunc ('Sollen die zusätzlichen Menueinträge (siehe folgende Teilnehmertyp-Zeilen) auf spezielle Nach-Filterung der Listen verlinken, so dass Du nur die Bilder der Teilnehmer siehst, die "nicht ZU weit entfernt" sind?',''),
                                           settings.AddToMenu_NeueFotos_justNotTooFar, settings.AddToMenu_NeueFotos_justNear);


                        mainDiv.appendChild (createSettings_hr_blind_medium ());

                        appendSessingsRow (mainDiv, trFunc ('Eintrag hinzuf&uuml;gen','Add menu item for'), '',
                                    trFunc ('Soll ein praktischen, zusätzlicher Menü-Eintrag für diesen Teilnehmer-Typ erzeugt werden?\n\n'+
                                           '(Du siehst den neuen Menüpunkt im ganz oben sichtbaren "FOTOS"-Menü der MK dann unter der Zeile "Neue Fotos".)',
                                            'These additional menu items will be shown in the "Photos" main menu, right below the "New Photos" item, so you can go to the page of new photos of a single sedcard type.'),
                                           settings.AddToMenu_NeueFotos, null);

                        mainDiv.appendChild (createSettings_hr_blind_large ());

                        outerDiv.appendChild (createWiseGuyWithLamp (
                            trFunc ('Du siehst hier keine &quot;Speichern&quot;-Taste, denn MKBeautifier speichert die Einstellungen sofort bei &Auml;nderung.',
                                    'There is no &quot;Save&quot; button here: MKBeautifier saves all of your settings instantly as soon as you change them.')));
                    }
                }
                else if (uPageParameter == uPageTokenMKBeautifier+uPageTokenPrepareDaSi)
                {
                    var content = document.getElementById ('content');
                    if (content != null)
                    {
                        document.title = trFunc ('MKBeautifier-Datensicherung anlegen','Create MKBeautifier Backup')+' · model-kartei.de';
                        content.innerHTML = '';

                        var outerDiv = document.createElement ('div');
                        outerDiv.setAttribute ('class', 'row');

                        content.appendChild (outerDiv);

                        var d = new Date ();
                        var curDateString = d.toUTCString ();

                        var h1a = document.createElement ('h1');
                        h1a.setAttribute ('class', 'tCenter');
                        h1a.innerHTML = trFunc ('MKBeautifier-Datensicherung anlegen','Create MKBeautifier Backup');
                        outerDiv.appendChild (h1a);

                        outerDiv.appendChild (createSettings_hr_blind_medium ());

                        var centerHint  = document.createElement ('center');
                        //divInnerTitle.setAttribute ('class', 'col c-3-2-1 fSmaller4');
                        centerHint.innerHTML = trFunc ('<i><small>Gesichert werden Deine auf den Sedcards eingeschalteten &quot;MKBeautifier-Marker&quot; und Deine MKBeautifier-Einstellungen.<br />'+
                        'Zeitstempel dieser Datensicherung: '+curDateString+'</small></i>',
                        '<i><small>The backup will include your activated &quot;MKBeautifier Flags&quot; and your MKBeautifier Settings.<br />'+
                        'timestamp of this backup: '+curDateString+'</small></i>');

                        outerDiv.appendChild (centerHint);

                        outerDiv.appendChild (createSettings_hr_blind_large ());

                        outerDiv.appendChild (createWiseGuyWithLamp (
                            trFunc ('Das Textfeld enth&auml;lt Deine zu sichernden MKBeautifier-Daten. Speichere den Inhalt <b>vollst&auml;ndig und unver&auml;ndert</b> in eine Datei:',
                                'The area below has your to-be-saved MKBeautifier data. Save all of that content in a file, without modifying the data:')));

                        var allTheData = createDataLinesForDaSi ();

                        var dataElementID = 'NewData';
                        var dataElement = document.createElement ('textarea');
                        dataElement.setAttribute ('id', dataElementID);
                        dataElement.setAttribute ('rows', '5');
                        dataElement.readOnly = true;
                        dataElement.innerHTML = '\n'+
                        '*** MKBeautifier data as of '+curDateString+'\n\nSTART OF DATA\n'+allTheData+'\nEND OF DATA\n';

                        outerDiv.appendChild (dataElement);

                        outerDiv.appendChild (createSettings_hr_blind_medium ());

                        var centerHint2  = document.createElement ('center');
                        //divInnerTitle.setAttribute ('class', 'col c-3-2-1 fSmaller4');
                        centerHint2.innerHTML =
                            trFunc ('<i><small>Die zu sicherenden Daten sind in obigem Textfeld bereits vollst&auml;ndig markiert.<br />&nbsp;<br />'+
                        'Du kannst jetzt einfach die Tasten-Kombination &nbsp;</small><b>'+
                        (isMacOS ? '[Meta]' : '[Strg]')+
                        ' [C] bet&auml;tigen</b>,<br />'+
                        '<small>um so auf einen Schlag alle Daten zu kopieren.</small><br />'+
                        'F&uuml;ge sie dann in eine Textdatei ein und speichere diese ab.<br />&nbsp;<br />'+
                        'Notiere Dir, dass die Datei Deine MKBeautifier-Datensicherung ist.</i>'
                        ,
                        '<i><small>In the area above all of the data to be saved have been automatically selected for you.<br />&nbsp;<br />'+
                        'You might now just press the key combination &nbsp;</small><b>'+
                        (isMacOS ? '[Meta]' : '[Strg]')+
                        ' [C] </b>,<br />'+
                        '<small>to copy all of the data in one go.</small><br />'+
                        'Next please paste them into a text file and save that file.<br />&nbsp;<br />'+
                        'Remember to make a note that it is your MKBeautifier Backup file.</i>');

                        var goBackElement = document.createElement ('a');
                        goBackElement.style.textDecoration = 'none';
                        goBackElement.setAttribute ('href', location.href.substring (0, location.href.indexOf (uPageTokenPrepareDaSi)));
                        goBackElement.innerHTML = '[ <small>'+trFunc ('zur&uuml;ck zu den MKBeautifier-Einstellungen','go back to MKBeautifier Settings page')+'</small> ]';

                        outerDiv.appendChild (dataElement);
                        outerDiv.appendChild (centerHint2);
                        outerDiv.appendChild (createSettings_hr_blind_large ());
                        outerDiv.appendChild (goBackElement);

                        selectAllInElement (dataElementID);
                    }
                }
                else if (uPageParameter == uPageTokenMKBeautifier+uPageTokenRestoreDaSi)
                {
                    var content = document.getElementById ('content');
                    if (content != null)
                    {
                        var hrefToSettings = location.href.substring (0, location.href.indexOf (uPageTokenRestoreDaSi));

                        document.title = trFunc ('Alte MKBeautifier-Datensicherung einspielen', 'Restore data by using your old backup')+' · model-kartei.de';
                        content.innerHTML = '';

                        var outerDiv = document.createElement ('div');
                        outerDiv.setAttribute ('class', 'row');

                        content.appendChild (outerDiv);

                        var d = new Date ();
                        var curDateString = d.toUTCString ();

                        var h1a = document.createElement ('h1');
                        h1a.setAttribute ('class', 'tCenter');
                        h1a.innerHTML = trFunc ('Alte MKBeautifier-Datensicherung einspielen', 'Restore data by using your old backup');
                        outerDiv.appendChild (h1a);

                        var centerHint = document.createElement ('center');
                        var styleSheet = ' style="color:#a8a8a8; background-color:#222"';
                        //divInnerTitle.setAttribute ('class', 'col c-3-2-1 fSmaller4');
                        centerHint.innerHTML = '<table border="0" width="100%" cellpadding="0" cellspacing="36"><tr>'+
                        '<td align="center" valign="top" width="50%"'+styleSheet+'><small>'+
                            trFunc ('Das Einspielen einer alten &quot;Datensicherung&quot; bewirkt zweierlei:',
                                    'Restoring data by using your old backup means:')+'</small><br />'+
                        '&nbsp;<br />'+
                        '<i>'+
                        trFunc ('Auf von Dir besuchten Sedcards werden die &quot;<b>MKBeautifier-Marker</b>&quot; entsprechend der Datensicherung umgeschaltet, FALLS bei der Datensicherung für die betreffende Sedcard mindestens EIN Marker eingeschaltet war.<br />'+
                        '&nbsp;<br />'+
                        'Auch Deine MKBeautifier-<a'+styleSheet+' href="'+hrefToSettings+'">Einstellungen</a> werden zur&uuml;ckgesetzt.'
                        ,
                        '&quot;<b>MKBeautifier Flags</b>&quot; on sedcards visited by you will be reset according to the backup, IF in the backup there is at least ONE flag set active for that respective sedcard.<br />'+
                        '&nbsp;<br />'+
                        'Your MKBeautifier <a'+styleSheet+' href="'+hrefToSettings+'">Settings</a> will be reset too.'
                        )+
                        '</i></td>'
                        +
                        '<td align="center" valign="top" width="50%"'+styleSheet+'><small>'+
                        trFunc ('Kein Datenabgleich mit MK beim einspielen der &quot;Datensicherung&quot;:',
                                'No comparison of your backup data with MK data:')+
                        '</small><br />'+
                        '&nbsp;<br />'+
                        trFunc ('<i>Dies &auml;ndert KEINE Infos zu von Dir auf Sedcards eingetragen &quot;Notizen&quot;.<br />'+
                                'MKBeautifier zeigt danach die gleichen Notizen an wie vorher,<br /> '+
                                'auch die Herz-Marker f&uuml;r Favorit/Netzwerk bleiben so wie jetzt.</i><br />&nbsp;<br />'+
                                '<small>(Notizen und Favorit/Netzwerk werden nur beim Sedcardbesuch aktualisiert.)<br />&nbsp;</small>'
                                ,
                                '<i>Using your old backup will NOT change any information regarding Notes that you might have entered on sedcards visited by you.<br />'+
                                'After the backup was used MKBeautifier wil show the same notes as before,<br /> '+
                                'and also the heart flags indicating Favorite/Network will remain the same.</i><br />&nbsp;<br />'+
                                '<small>(Notes and Favorite/Network will be updated when you visit a sedcard again.)<br />&nbsp;</small>')+
                        '</td></tr></table>';

                        outerDiv.appendChild (centerHint);

                        outerDiv.appendChild (createSettings_hr_blind_medium ());

                        outerDiv.appendChild (createWiseGuyWithLamp (
                            trFunc ('Kopiere bitte den Inhalt Deiner fr&uuml;her gespeicherten MKBeautifier-Datensicherung-Datei <b>vollst&auml;ndig und unver&auml;ndert</b> in dieses Textfeld:',
                                'To restore the data please copy all of the unaltered content of your MKBeautifier Backup file into this area:')
                            ));

                        var dataElementID = 'OldData';
                        var dataElement = document.createElement ('textarea');
                        dataElement.setAttribute ('id', dataElementID);
                        dataElement.setAttribute ('rows', '5');
                        dataElement.innerHTML = '';

                        outerDiv.appendChild (dataElement);

                        var centerHint2  = document.createElement ('center');
                        var dasiTable = document.createElement ('table');
                        dasiTable.setAttribute ('border', '0');
                        dasiTable.setAttribute ('cellspacing', '24');
                        dasiTable.setAttribute ('cellpadding', '0');

                        var tr    = document.createElement("tr");
                        var td1   = document.createElement("td");
                        var td2   = document.createElement("td");
                        var td3   = document.createElement("td");

                        td1.setAttribute ('valign', 'top');
                        td2.setAttribute ('valign', 'top');
                        td3.setAttribute ('valign', 'top');

                        td1.innerHTML = '<small>'+trFunc ('Nachdem Du sie in obiges Textfeld einkopiert hast,<br />klicke bitte hier, um die Datensicherung einzuspielen:',
                                                          'After having copied the backup in the area above<br />please click here to restore the data:')+'<br />&nbsp;</small>';
                        td2.innerHTML = '&nbsp;<br /><input id="DaSiRestoreNow" name="DaSiRestoreNow" type="button" value="'+
                        trFunc ('Alte Datensicherung jetzt einspielen!',
                                'Restore data by using the old backup!')+'" /> ';
                        td3.innerHTML = '';

                        dasiTable.appendChild  (tr);
                        tr.appendChild     (td1);
                        tr.appendChild     (td2);
                        tr.appendChild     (td3);
                        centerHint2.appendChild (dasiTable);

                        var goBackElement = document.createElement ('a');
                        goBackElement.style.textDecoration = 'none';
                        goBackElement.setAttribute ('href', hrefToSettings);
                        goBackElement.innerHTML = '[ <small>'+trFunc ('zur&uuml;ck zu den MKBeautifier-Einstellungen','go back to MKBeautifier Settings page')+'</small> ]';

                        outerDiv.appendChild (dataElement);
                        outerDiv.appendChild (centerHint2);
                        outerDiv.appendChild (createSettings_hr_blind_large ());
                        outerDiv.appendChild (goBackElement);

                        dataElement.focus ();

                        $('#DaSiRestoreNow').on ("click", function () {
                            dataElement.readOnly = true;
                            var allTheData = dataElement.value;
                            $('#DaSiRestoreNow').remove ();
                            $('.wiseGuy').remove ();
                            td1.innerHTML = trFunc ('<i>verarbeitete Daten:</i>','<i>data processed:</i>');
                            td2.innerHTML = trFunc ('(keine g&uuml;ltigen Einstellungen gefunden)','(no valid Settings found)');
                            td3.innerHTML = trFunc ('(keine g&uuml;ltigen Marker-Informationen gefunden)','(no valid Flag information found)');

                            var lines        = allTheData.split ('\n');
                            var nMarkerInfos = 0;
                            var nMarkerSame  = 0;
                            var nSettings    = 0;

                            var inDataBloc   = false;
                            for (var i=0; i<lines.length; i++)
                            {
                                var line = lines [i];
                                if (line == 'START OF DATA')
                                {
                                    inDataBloc = true;
                                    continue;
                                }
                                if (inDataBloc)
                                {
                                    if (line == 'END OF DATA')
                                    {
                                        inDataBloc = false;  // we support more than one data bloc!
                                        continue;
                                    }

                                    if (line.length > 2)
                                    {
                                        if (line.indexOf ('sv5mkb_') == 0 || line.indexOf ('s'+ownID+'.v5mkb_') == 0)
                                        {
                                            // settings data
                                            var settingsLine = line.substring (1);
                                            var posColon = settingsLine.indexOf (':');
                                            if (posColon > 5 && posColon < settingsLine.length-1)
                                            {
                                                var longKey     = settingsLine.substring (0, posColon);
                                                var storedOwnID = storageOwnIDFromLongKey (longKey);
                                                if (storedOwnID == '' || storedOwnID == ownID)
                                                {
                                                    var value   = settingsLine.substring (posColon+1);
                                                    var key     = storageKeyFromLongKey  (longKey);
                                                    if (itemFormatIDItemKey == key)
                                                    {
                                                        storage.setItem (key, value);
                                                    }
                                                    else
                                                    {
                                                        ownStorageSetItem (key, value);
                                                    }
                                                    nSettings++;
                                                    td2.innerHTML = trFunc ('Einstellungen','Settings')+': <big>'+nSettings.toString ()+'</big>';
                                                }
                                            }
                                        }
                                        else if (line.substring (0,1) == 'i')
                                        {
                                            // user data
                                            var userLines = line.split ('i');
                                            for (var iUser=0; iUser<userLines.length; iUser++)
                                            {
                                                var userLine = userLines [iUser].trim ();
                                                if (userLine.length > 0)
                                                {
                                                    var posColon = userLine.indexOf (':');
                                                    if (posColon > 1 && posColon < userLine.length-1)
                                                    {
                                                        var longKey     = userLine.substring (0, posColon);
                                                        var storedOwnID = storageOwnIDFromLongKey (longKey);
                                                        if (storedOwnID == '' || storedOwnID == ownID)
                                                        {
                                                          var value = userLine.substring (posColon+1);
                                                          var key   = storageKeyFromLongKey  (longKey);
                                                          if (key.substring(0,1) != 'u')
                                                          {
                                                            key = 'u'+key;
                                                          }
                                                          var daSiObject = getUserStorageObjectFromString (value);
                                                          if (objectHasNoteOrStopwatchOrMKBeautifierFlagsSet (daSiObject))
                                                          {
                                                            var storageItem = ownStorageGetItem (key);
                                                            var storageObject =
                                                                  (storageItem === null)
                                                                ? createNewUserStorageObject ()
                                                                : getUserStorageObjectFromString (storageItem);
                                                            if (storageObject != null)
                                                            {
                                                                var needNoteHint =
                                                                    (storageObject.note.length < 1 && daSiObject.note.length > 0);

                                                                if (   (storageObject.tsStopwatch != daSiObject.tsStopwatch)
                                                                    || (storageObject.flags       != daSiObject.flags)
                                                                    || needNoteHint
                                                                )
                                                                {
                                                                    if (storageObject.km == '-1')
                                                                    {
                                                                        storageObject.km      = daSiObject.km;
                                                                    }
                                                                    storageObject.tsStopwatch = daSiObject.tsStopwatch;
                                                                    storageObject.flags       = daSiObject.flags;
                                                                    if (needNoteHint)
                                                                    {
                                                                        storageObject.note = noteUnknownText;
                                                                    }

                                                                    var newItem = createUserStorageItemFromObject (storageObject, false);
                                                                    ownStorageSetItem (key, newItem);

                                                                    nMarkerInfos++;
                                                                    td3.innerHTML =
                                                                        trFunc ('Marker ge&auml;ndert auf',
                                                                                'Flags changed on')+
                                                                        ' <big>'+nMarkerInfos.toString ()+'</big> '+
                                                                        trFunc ('Sedcards.',
                                                                                'portfolios.');
                                                                }
                                                                else
                                                                {
                                                                    nMarkerSame++;
                                                                }
                                                            }
                                                          }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                            td1.innerHTML = trFunc ('<b>Datensicherung wurde eingelesen.</b>',
                                                    '<b>Data restoring done.</b>');
                            if (nMarkerSame > 0)
                            {
                                td3.innerHTML =
                                    trFunc ('Marker ge&auml;ndert auf <big>'+nMarkerInfos.toString ()+'</big> Sedcard',
                                            'Flags changed on <big>'+nMarkerInfos.toString ()+'</big> sedcard')+
                                    (nMarkerInfos == 1 ? '':'s')+
                                    '.<small><br />'+
                                    trFunc ('(Marker waren identisch auf '+nMarkerSame.toString ()+' Sedcards.)',
                                            '(Flags were equal on '+nMarkerSame.toString ()+' sedcards.)')+
                                    '</small>';
                            }
                        });

                    }
                }
                else if (uPageParameter.indexOf (uPageTokenMKBeautifier+uPageTokenListMarkers) == 0)
                {
                    var content = document.getElementById ('content');
                    if (content != null)
                    {
                        document.title = trFunc ('MKBeautifier-Marker', 'MKBeautifier Flags') + ' · model-kartei.de';
                        content.innerHTML = '';

                        var outerDiv = document.createElement ('div');
                        outerDiv.setAttribute ('class', 'row');


                        var h1a = document.createElement ('h1');
                        h1a.setAttribute ('class', 'tCenter');
                        h1a.setAttribute ('id', 'h1MainHeader');
                        h1a.innerHTML = trFunc ('MKBeautifier-Marker und zugeh&ouml;rige MK-Notizen', 'MKBeautifier Flags and their respective MK Notes');
                        outerDiv.appendChild (h1a);

                        var centerHint  = document.createElement ('center');
                        centerHint.innerHTML = '<i><small title="\n'+
                        trFunc ('    Die Liste ben&ouml;tigt Deine aktive Mithilfe:\n\n'+
                                '    Einen  N A M E N  siehst Du hier n&auml;mlich nur dann, wenn   \n'+
                                '    Du ihn als Teil Deiner eigenen  N O T I Z  auf der betreffenden    \n'+
                                '    Sedcard eingetragen hast, denn aus rechtl. Gr&uuml;nden speichert    \n'+
                                '    MKBeautifier keine Account-Namen der von Dir    \n'+
                                '    besuchten Sedcards.    \n\n'+
                                '    Standard-Account-Nutzer k&ouml;nnen auf nur wenigen Sedcards    \n'+
                                '    eine Notiz eintragen, d.h. diese besondere Liste ist prim&auml;r   \n'+
                                '    für VIP-Silber- und VIP-Gold-Nutzer gedacht.    \n\n'+
                                '    (Die &uuml;brigen MKBeautifier-Funktionen stehen auch    \n'+
                                '     Standard-Account-Nutzern vollst&auml;ndig zur Verf&uuml;gung.)'
                                ,
                                '    This list needs your help to be really useful:\n\n'+
                                '    You will see  N A M E S  here if (and only if) you have    \n'+
                                '    entered the names as part of your  N O T E  texts when    \n'+
                                '    visiting the respective users\' sedcards.    \n'+
                                '    For legal reasons MKBeautifier does not store any user names,     \n'+
                                '    that\'s why you won\'t see any unless you write such notes.    \n\n'+
                                '    However MK users enjoying a free Standard Account may store     \n'+
                                '    notes on a very limited number of sedcards only, so this    \n'+
                                '    special list page is mainly meant to be used by VIP Silver    \n'+
                                '    or VIP Gold users of the MK.    \n\n'+
                                '    (All of the other features provided by MKBeautifier can be    \n'+
                                '     used by Standard Account users without limitation.)')+
                        '">'+
                        trFunc ('Wie kann ich hier auch Teilnehmer-Namen sehen?',
                                'What could I do to see user names in this list?')+
                        '</small></i>';

                        outerDiv.appendChild (centerHint);

                        outerDiv.appendChild (createSettings_hr_blind_medium ());

                        var sortOrderTable = document.createElement ('table');
                        sortOrderTable.setAttribute ('border', '0');
                        sortOrderTable.setAttribute ('cellspacing', '8');
                        sortOrderTable.setAttribute ('cellpadding', '0');

                        var tr    = document.createElement("tr");
                        var td1   = document.createElement("td");
                        var td2   = document.createElement("td");
                        var td3   = document.createElement("td");
                        var td4   = document.createElement("td");
                        var td5   = document.createElement("td");
                        var td6   = document.createElement("td");
                        var td7   = document.createElement("td");
                        var td8   = document.createElement("td");
                        var td9   = document.createElement("td");
                        var tdGap1= document.createElement("td");
                        var tdGap2= document.createElement("td");
                        var tdGap3= document.createElement("td");
                        var tdGap4= document.createElement("td");

                        td1.setAttribute ('valign', 'top');
                        td2.setAttribute ('valign', 'top');
                        td3.setAttribute ('valign', 'top');
                        td4.setAttribute ('valign', 'top');
                        td5.setAttribute ('valign', 'top');
                        td6.setAttribute ('valign', 'top');
                        td7.setAttribute ('valign', 'top');
                        td8.setAttribute ('valign', 'top');
                        td9.setAttribute ('valign', 'top');

                        var individualSortButtonBase = 'individualSortButton_';

                        function createButtonCell (flagID, symbol)
                        {
                            var token = (symbol == '') ? niceUserFlags[flagID][3] : symbol;
                            return '<td align=center>'+
                                        '<table border="1" cellspacing="0" cellpadding="0" style="border-color:#444"><tr><td id="'+individualSortButtonBase+flagID.toString ()+'" align=center style="border-color:#444; background-color:#000">&nbsp;' + token +'&nbsp;</td></tr></table></td>';
                        }


                        var sortButtons =
                            ['SortBtnPrio', 'SortBtnProbability', 'SortBtnAspectMarkers', 'SortBtnDays', 'SortBtnFavorites', 'SortBtnNetwork', 'SortBtnKm', 'SortBtnNote'];

                        var importanceButtonsCode =
                            '<table border="0" cellspacing="3" cellpadding="0"><tr>'+
                            createButtonCell (0, '')+
                            createButtonCell (1, '')+
                            createButtonCell (2, '')+
                            createButtonCell (3, '')+
                            createButtonCell (4, '&#x2590;i&#x258C;')+
                            '</tr></table>';

                        var probabilityButtonsCode =
                            '<table border="0" cellspacing="3" cellpadding="0"><tr>'+
                            createButtonCell (5, '&nbsp;!!&nbsp;')+
                            createButtonCell (6, '&nbsp;!&nbsp;')+
                            createButtonCell (7, '&nbsp;?&nbsp;')+
                            createButtonCell (8, '')+
                            '</tr></table>';

                        var aspectsButtonsCode =
                            '<table border="0" cellspacing="3" cellpadding="0"><tr>'+
                            createButtonCell ( 9, '')+
                            createButtonCell (10, '')+
                            createButtonCell (11, '')+
                            createButtonCell (12, '')+
                            createButtonCell (13, '')+
                            createButtonCell (14, '')+
                            '</tr></table>';


                        td1.innerHTML = '<small>'+trFunc ('Sortierung','sort order')+':&nbsp;</small><br /><small>'+trFunc ('oder','or')+'</small>&nbsp;<br /><small>'+trFunc ('Einzel-Sortierung','individual sorting')+':&nbsp;</small>';
                        td2.innerHTML = '<input id="'+sortButtons [0]+'" name="'+sortButtons [0]+
                            '" type="button" value="'+trFunc ('Wichtigkeit','Importance')+'" style="font-size:75%" /><br />'+importanceButtonsCode;
                        td3.innerHTML = '<input id="'+sortButtons [1]+'" name="'+sortButtons [1]+
                            '" type="button" value="'+trFunc ('Wahrscheinlichkeit','Probability')+'" style="font-size:75%" /><br />'+probabilityButtonsCode;
                        td4.innerHTML = '<input id="'+sortButtons [2]+'" name="'+sortButtons [2]+
                            '" type="button" value="'+trFunc ('Aspekte','Aspects')+'" style="font-size:75%" /><br />'+aspectsButtonsCode;
                        td5.innerHTML = '<input id="'+sortButtons [3]+'" name="'+sortButtons [3]+
                            '" type="button" value="'+trFunc ('Tage','Days')+'" style="font-size:75%" />';
                        td6.innerHTML = '<input id="'+sortButtons [4]+'" name="'+sortButtons [4]+
                            '" type="button" value="'+trFunc ('Favorit','Favorite')+'" style="font-size:75%" />';
                        td7.innerHTML = '<input id="'+sortButtons [5]+'" name="'+sortButtons [5]+
                            '" type="button" value="'+trFunc ('Netzwerk','Network')+'" style="font-size:75%" />';
                        td8.innerHTML = '<input id="'+sortButtons [6]+'" name="'+sortButtons [6]+
                            '" type="button" value="'+trFunc ('Entfernung','Distance')+'" style="font-size:75%" />';
                        td9.innerHTML = '<input id="'+sortButtons [7]+'" name="'+sortButtons [7]+
                            '" type="button" value="'+trFunc ('Notiz','Note text')+'" style="font-size:75%" />';

                        tdGap1.innerHTML = '&nbsp;';
                        tdGap2.innerHTML = '&nbsp;';
                        tdGap3.innerHTML = '&nbsp;';
                        tdGap4.innerHTML = '&nbsp;';

                        sortOrderTable.appendChild  (tr);
                        tr.appendChild     (td1);
                        tr.appendChild     (td5);
                        tr.appendChild     (tdGap2);
                        tr.appendChild     (td2);
                        tr.appendChild     (td3);
                        tr.appendChild     (td4);
                        tr.appendChild     (tdGap1);
                        tr.appendChild     (td6);
                        tr.appendChild     (td7);
                        tr.appendChild     (tdGap3);
                        tr.appendChild     (td8);
                        tr.appendChild     (tdGap4);
                        tr.appendChild     (td9);
                        outerDiv.appendChild (sortOrderTable);


                        outerDiv.appendChild (createSettings_hr_blind_medium ());

                        content.appendChild (outerDiv);

                        var numItems       = storage.length;
                        var numDayCounters = 0;
                        var userObjects    = new Array ();

                        for (var i=0; i<numItems-1; i++)
                        {
                            var storageKey = ownStorageKey (i);
                            if (storageKey.length > 0 && storageKey.substring (0, 1) == 'u')
                            {
                                var storageItem  = ownStorageGetItem (storageKey);
                                if (storageItem != null)
                                {
                                    var object  = getUserStorageObjectFromString (storageItem);
                                    if (object != null)
                                    {
                                        if (objectHasStopwatchOrMKFlagsOrMKBeautifierFlagsOrNote (object))
                                        {
                                            var id = storageKey.substring (1);
                                            if (id.length > 1 && id.substring (0, 2) == 'MK')
                                            {
                                                id = id.substring (2);
                                            }
                                            else
                                            {
                                                id = parseInt (id, 16).toString ();
                                            }
                                            var infoLineObject = new Object ();

                                            createCompactInfoline (id, 15, 20, false, infoLineObject, true, false, true, false, true, object);

                                            object.id       = id;
                                            object.userFlagsObject = infoLineObject.userFlagsObject;
                                            object.isIgnoringMe    = infoLineObject.userIsIgnoringMe;
                                            object.infoLine = infoLineObject.text;
                                            if (object.userFlagsObject.hasStopwatch)
                                            {
                                                object.infoLine = object.infoLine
                                                    .replace ('#1C1C1C">&nbsp;</td><td ',
                                                              '#1C1C1C">&nbsp;</td><td width="42" align="center" style="'+
                                                              makeStyleForSedcardDaysCounter (object.userFlagsObject.stopwatchDelta, '100%')+'" ');
                                            }else{
                                                object.infoLine = object.infoLine
                                                    .replace ('#1C1C1C">&nbsp;</td><td ',
                                                              '#1C1C1C">&nbsp;</td><td width="42" ');
                                            }
                                            if (object.userFlagsObject.hasStopwatch)
                                            {
                                                numDayCounters++;
                                            }
                                            userObjects.push (object);
                                        }
                                    }
                                }
                            }
                        }

                        var pageSize        = 50; // number of list entries per page
                        var numberOfObjects = userObjects.length;
                        var startIdx        = 0;

                        var pageButtonTail = ' type="button" style="background-color:#000; color:#999" />';
                        if (numberOfObjects > pageSize)
                        {
                            var topButtonPageUp    = '<input id="TopButtonPageUp"      name="TopButtonPageUp"    value="&#x2190;"'        +pageButtonTail;
                            var topButtonPageDown  = '<input id="TopButtonPageDown"    name="TopButtonPageDown"  value="&#x2192;"'        +pageButtonTail;
                            var topButtonPageUps   = '<input id="TopButtonPageUps"     name="TopButtonPageUps"   value="&#x2190;&#x2190;"'+pageButtonTail;
                            var topButtonPageDowns = '<input id="TopButtonPageDowns"   name="TopButtonPageDowns" value="&#x2192;&#x2192;"'+pageButtonTail;
                            var topPageButtons = document.createElement ('div');
                            topPageButtons.innerHTML = '<table border=0><tr>' +
                                '<td>' + topButtonPageUps + '</td>' +
                                '<td>' + topButtonPageUp  + '</td>' +
                                '<td style="font-size:180%; font-family:Courier; color:#b0b0b0">&nbsp;<span id="TopStartIndicator" style="vertical-align:60%">' +
                                (startIdx / pageSize + 1) +
                                '</span>&nbsp;</td>' +
                                '<td>' + topButtonPageDown  + '</td>' +
                                '<td>' + topButtonPageDowns + '</td>' +
                                '</tr></table><small>&nbsp;</small>';
                            outerDiv.appendChild (topPageButtons);
                        }

                        var centerTable = document.createElement ('center');

                        outerDiv.appendChild (centerTable);

                        if (numberOfObjects > pageSize)
                        {
                            var bottomButtonPageUp    = '<input id="BottomButtonPageUp"    name="BottomButtonPageUp"  value="&#x2190;"'        +pageButtonTail;
                            var bottomButtonPageDown  = '<input id="BottomButtonPageDown"  name="BottomButtonPageUp"  value="&#x2192;"'        +pageButtonTail;
                            var bottomButtonPageUps   = '<input id="BottomButtonPageUps"   name="BottomButtonPageUps" value="&#x2190;&#x2190;"'+pageButtonTail;
                            var bottomButtonPageDowns = '<input id="BottomButtonPageDowns" name="BottomButtonPageUps" value="&#x2192;&#x2192;"'+pageButtonTail;

                            var bottomPageButtons = document.createElement ('div');
                            bottomPageButtons.innerHTML = '<table border=0><tr>' +
                                '<td>' + bottomButtonPageUps + '</td>' +
                                '<td>' + bottomButtonPageUp  + '</td>' +
                                '<td style="font-size:180%; font-family:Courier; color:#b0b0b0">&nbsp;<span id="BottomStartIndicator" style="vertical-align:60%">' +
                                (startIdx / pageSize + 1) +
                                '</span>&nbsp;</td>' +
                                '<td>' + bottomButtonPageDown  + '</td>' +
                                '<td>' + bottomButtonPageDowns + '</td>' +
                                '</tr></table>';
                            outerDiv.appendChild (bottomPageButtons);
                        }

                        outerDiv.appendChild (createSettings_hr_blind_large ());

                        sortButtons.forEach (
                            function (currentButton, index, array)
                            {
                                $('#'+currentButton).on ("click", function ()
                                {
                                    for (var iSortBtn = 0; iSortBtn < 15; iSortBtn++)
                                    {
                                        $('#'+individualSortButtonBase+iSortBtn.toString ()).css('background-color', '#000');
                                    }
                                    for (var i=0; i<sortButtons.length; i++)
                                    {
                                        var button = sortButtons [i];
                                        if (button == currentButton)
                                        {
                                            $('#'+button).css('background-color', '#001840');
                                            $('#'+button).css('color', '#ffd080');
                                        }
                                        else
                                        {
                                            $('#'+button).css('background-color', '#000');
                                            $('#'+button).css('color', '#999');
                                        }
                                    }
                                    switch (currentButton)
                                    {
                                        //['SortBtnPrio', 'SortBtnProbability', 'SortBtnAspectMarkers', 'SortBtnFavorites', 'SortBtnNetwork', 'SortBtnKm', 'SortBtnNote'];

                                        case 'SortBtnPrio':
                                            userObjects.sort (function(a, b)
                                            {
                                                return b.userFlagsObject.importance - a.userFlagsObject.importance;
                                            });
                                            break;
                                        case 'SortBtnProbability':
                                            userObjects.sort (function(a, b)
                                            {
                                                return b.userFlagsObject.probability - a.userFlagsObject.probability;
                                            });
                                            break;
                                        case 'SortBtnAspectMarkers':
                                            userObjects.sort (function(a, b)
                                            {
                                                return b.userFlagsObject.aspectValue - a.userFlagsObject.aspectValue;
                                            });
                                            break;
                                        case 'SortBtnDays':
                                            userObjects.sort (function(a, b)
                                            {
                                                aVal = a.userFlagsObject.hasStopwatch ? a.userFlagsObject.stopwatchDelta : undefinedStopwatchValue;
                                                bVal = b.userFlagsObject.hasStopwatch ? b.userFlagsObject.stopwatchDelta : undefinedStopwatchValue;
                                                return aVal - bVal;
                                            });
                                            break;
                                        case 'SortBtnFavorites':
                                            userObjects.sort (function(a, b)
                                            {
                                                return booleanToInt (b.userFlagsObject.isFavorite) - booleanToInt (a.userFlagsObject.isFavorite);
                                            });
                                            break;
                                        case 'SortBtnNetwork':
                                            userObjects.sort (function(a, b)
                                            {
                                                return booleanToInt (b.userFlagsObject.inNetwork) - booleanToInt (a.userFlagsObject.inNetwork);
                                            });
                                            break;
                                        case 'SortBtnKm':
                                            userObjects.sort (sortMKBeautifierUserObjectsPerKm);
                                            break;
                                        case 'SortBtnNote':
                                            userObjects.sort (function(a, b)
                                            {
                                                var retValue = 0;
                                                var aVal = a.note.replace ('(','').replace ('[','').replace ('"','').toUpperCase ().trim ();
                                                var bVal = b.note.replace ('(','').replace ('[','').replace ('"','').toUpperCase ().trim ();
                                                if (aVal.length < 1)
                                                {
                                                    aVal = 'ZZZZZZZZZZZZZZ';
                                                }
                                                if (bVal.length < 1)
                                                {
                                                    bVal = 'ZZZZZZZZZZZZZZ';
                                                }
                                                if (bVal > aVal)
                                                {
                                                    return -1;
                                                }
                                                else if (bVal < aVal)
                                                {
                                                    return 1;
                                                }
                                                return 0;
                                            });
                                            break;
                                    }

                                    startIdx = 0;

                                    showSortedTable (centerTable, userObjects, numDayCounters, startIdx, pageSize);
                                });
                            }
                        );

                        for (var iIndSrtBtn = 0; iIndSrtBtn < 15; iIndSrtBtn++)
                        {
                            var thisBtnID = individualSortButtonBase+iIndSrtBtn.toString ();
                            $('#'+thisBtnID).on ("click", function ()
                            {
                                var currentID = $(this).attr("id");
                                for (var iSortBtn = 0; iSortBtn < 15; iSortBtn++)
                                {
                                    var loopID = individualSortButtonBase+iSortBtn.toString ();
                                    var currentFound = (loopID == currentID);
                                    $('#'+individualSortButtonBase+iSortBtn.toString ()).css('background-color', currentFound ? '#001840' : '#000');
                                    if (currentFound)
                                    {
                                        for (var i=0; i<sortButtons.length; i++)
                                        {
                                            var button = sortButtons [i];
                                            $('#'+button).css('background-color', '#000');
                                            $('#'+button).css('color', '#999');
                                        }
                                        switch (iSortBtn)
                                        {
                                            case 0:
                                                userObjects.sort (function(a, b)
                                                {
                                                    return b.userFlagsObject.ValueSmiley - a.userFlagsObject.ValueSmiley;
                                                });
                                                break;
                                            case 1:
                                                userObjects.sort (function(a, b)
                                                {
                                                    return b.userFlagsObject.ValueLittleSmile - a.userFlagsObject.ValueLittleSmile;
                                                });
                                                break;
                                            case 2:
                                                userObjects.sort (function(a, b)
                                                {
                                                    return b.userFlagsObject.ValueSad - a.userFlagsObject.ValueSad;
                                                });
                                                break;
                                            case 3:
                                                userObjects.sort (function(a, b)
                                                {
                                                    return b.userFlagsObject.ValueWarning - a.userFlagsObject.ValueWarning;
                                                });
                                                break;
                                            case 4:
                                                userObjects.sort (function(a, b)
                                                {
                                                    return b.userFlagsObject.ValueIgnore - a.userFlagsObject.ValueIgnore;
                                                });
                                                break;
                                            case 5:
                                                userObjects.sort (function(a, b)
                                                {
                                                    return b.userFlagsObject.ValueExclamations - a.userFlagsObject.ValueExclamations;
                                                });
                                                break;
                                            case 6:
                                                userObjects.sort (function(a, b)
                                                {
                                                    return b.userFlagsObject.ValueExclamation - a.userFlagsObject.ValueExclamation;
                                                });
                                                break;
                                            case 7:
                                                userObjects.sort (function(a, b)
                                                {
                                                    return b.userFlagsObject.ValueQuestion - a.userFlagsObject.ValueQuestion;
                                                });
                                                break;
                                            case 8:
                                                userObjects.sort (function(a, b)
                                                {
                                                    return b.userFlagsObject.ValueQuestions - a.userFlagsObject.ValueQuestions;
                                                });
                                                break;
                                            case 9:
                                                userObjects.sort (function(a, b)
                                                {
                                                    return b.userFlagsObject.ValueFlower - a.userFlagsObject.ValueFlower;
                                                });
                                                break;
                                            case 10:
                                                userObjects.sort (function(a, b)
                                                {
                                                    return b.userFlagsObject.ValueSun - a.userFlagsObject.ValueSun;
                                                });
                                                break;
                                            case 11:
                                                userObjects.sort (function(a, b)
                                                {
                                                    return b.userFlagsObject.ValueMusic - a.userFlagsObject.ValueMusic;
                                                });
                                                break;
                                            case 12:
                                                userObjects.sort (function(a, b)
                                                {
                                                    return b.userFlagsObject.ValueCheck - a.userFlagsObject.ValueCheck;
                                                });
                                                break;
                                            case 13:
                                                userObjects.sort (function(a, b)
                                                {
                                                    return b.userFlagsObject.ValueCheckOK - a.userFlagsObject.ValueCheckOK;
                                                });
                                                break;
                                            case 14:
                                                userObjects.sort (function(a, b)
                                                {
                                                    return b.userFlagsObject.ValueDiamond - a.userFlagsObject.ValueDiamond;
                                                });
                                                break;
                                        }

                                        startIdx = 0;

                                        showSortedTable (centerTable, userObjects, numDayCounters, startIdx, pageSize);
                                    }
                                }
                            });
                        }


                        if (numberOfObjects > pageSize)
                        {
                            var bigStep = 5*pageSize;

                            $('#TopButtonPageUps').on ("click", function () {
                                if (startIdx > bigStep-1)
                                {
                                    startIdx = startIdx - bigStep;
                                }
                                else
                                {
                                    startIdx = 0;
                                }
                                showSortedTable (centerTable, userObjects, numDayCounters, startIdx, pageSize);
                            });
                            $('#BottomButtonPageUps').on ("click", function () {
                                if (startIdx > bigStep-1)
                                {
                                    startIdx = startIdx - bigStep;
                                }
                                else
                                {
                                    startIdx = 0;
                                }
                                showSortedTable (centerTable, userObjects, numDayCounters, startIdx, pageSize);
                                h1a.scrollIntoView(true);
                            });
                            $('#TopButtonPageUp').on ("click", function () {
                                if (startIdx > pageSize-1)
                                {
                                    startIdx = startIdx - pageSize;
                                }
                                showSortedTable (centerTable, userObjects, numDayCounters, startIdx, pageSize);
                            });
                            $('#BottomButtonPageUp').on ("click", function () {
                                if (startIdx > pageSize-1)
                                {
                                    startIdx = startIdx - pageSize;
                                }
                                showSortedTable (centerTable, userObjects, numDayCounters, startIdx, pageSize);
                                h1a.scrollIntoView(true);
                            });
                            $('#TopButtonPageDown').on ("click", function () {
                                if (startIdx + pageSize < numberOfObjects)
                                {
                                    startIdx = startIdx + pageSize;
                                }
                                showSortedTable (centerTable, userObjects, numDayCounters, startIdx, pageSize);
                            });
                            $('#BottomButtonPageDown').on ("click", function () {
                                if (startIdx + pageSize < numberOfObjects)
                                {
                                    startIdx = startIdx + pageSize;
                                }
                                showSortedTable (centerTable, userObjects, numDayCounters, startIdx, pageSize);
                                h1a.scrollIntoView(true);
                            });
                            $('#TopButtonPageDowns').on ("click", function () {
                                if (startIdx + bigStep < numberOfObjects)
                                {
                                    startIdx = startIdx + bigStep;
                                }
                                else
                                {
                                    while (startIdx + pageSize < numberOfObjects)
                                    {
                                        startIdx = startIdx + pageSize;
                                    }
                                }
                                showSortedTable (centerTable, userObjects, numDayCounters, startIdx, pageSize);
                            });
                            $('#BottomButtonPageDowns').on ("click", function () {
                                if (startIdx + bigStep < numberOfObjects)
                                {
                                    startIdx = startIdx + bigStep;
                                }
                                else
                                {
                                    while (startIdx + pageSize < numberOfObjects)
                                    {
                                        startIdx = startIdx + pageSize;
                                    }
                                }
                                showSortedTable (centerTable, userObjects, numDayCounters, startIdx, pageSize);
                                h1a.scrollIntoView(true);
                            });
                        }


                        anyStopwatchActive = false;

                        $('#SortBtnKm').click ();

                        if (anyStopwatchActive)
                        {
                            $('#SortBtnDays').click ();
                        }
                    }
                }
            }
            else // NOT my own ID, so this is another U page
            {
                var posOfParam = s.indexOf (uPageTokenGoToSedcard);
                if (posOfParam == s.length - uPageTokenGoToSedcard.length)
                {
                    // go to to the first sedcard listed in the U page
                    var userID = s.substring (0, posOfParam-1);
                    var lListElements = document.getElementsByClassName ('lList');
                    if (lListElements.length > 0)
                    {
                        var anchors = lListElements [0].getElementsByTagName ('a');
                        if (anchors.length > 0)
                        {
                            var trailingUserName = ' ...';
                            var h1s = document.getElementsByTagName ('h1');
                            if (h1s.length > 0)
                            {
                                var as = h1s [0].getElementsByTagName ('a');
                                if (as.length > 0)
                                {
                                    trailingUserName =
                                        ': &nbsp; &nbsp; &nbsp; </span><span style="font-size:150%'+(isDarkTheme ? '; color:#FB5':'')+'">' +
                                        as[0].innerHTML +
                                        '</span>';
                                }
                            }
                            var urlOfFirstSedcard = anchors [0].getAttribute ('href');
                            var contentElement = document.getElementById ('content');
                            contentElement.innerHTML = '<div class="row"><span style="font-style: italic">&nbsp;<br />&nbsp;<br />&nbsp;<br />'+
                                trFunc ('Sedcard wird geladen', 'Loading portfolio')+trailingUserName+
                                '</span></div>';

                            window.location.assign (urlOfFirstSedcard);
                        }
                    }
                }
            }
        }


        function sortMKBeautifierUserObjectsPerKm (a, b)
        {
            if (a.userFlagsObject.hasStopwatch || b.userFlagsObject.hasStopwatch)
            {
                anyStopwatchActive = true;
            }

            var aVal = Number (a.km.replace ('.',''));
            var bVal = Number (b.km.replace ('.',''));

            if (Number.isNaN(aVal) || aVal == -1)
            {
                if (a.isIgnoringMe)
                {
                    aVal = 100000;
                }
                else
                {
                    aVal = -100000;
                }
            }
            if (Number.isNaN(bVal) || bVal == -1)
            {
                if (b.isIgnoringMe)
                {
                    bVal = 100000;
                }
                else
                {
                    bVal = -100000;
                }
            }
            return aVal-bVal;
        }


        function showSortedTable (tableElement, userObjects, numDayCounters, startIdxByButton, pageSize)
        {
            var numberOfObjects = userObjects.length;

            var startIdx = startIdxByButton;

            if (numberOfObjects > pageSize)
            {
                var pageNumber = (startIdx / pageSize + 1);
                var indicatorElement = document.getElementById ('TopStartIndicator');
                indicatorElement.innerHTML = pageNumber.toString ();
                indicatorElement = document.getElementById ('BottomStartIndicator');
                indicatorElement.innerHTML = pageNumber.toString ();
            }

            var centerTableInner = '<table border="0" width="100%" cellpadding="16" cellspacing="0">';

            for (var i = startIdx; i < startIdx+pageSize && i < numberOfObjects; i++)
            {
                object = userObjects [i];
                var noteTextIsUnknown = (object.note == noteUnknownText);
                var anchorForPNs = '<a href="http://www.model-kartei.de/pn/user/'+object.id+'/" '+
                    'style="text-decoration: none; color:#BD9E7B; font-size:200%; text-align:left; vertical-align:top" title="'+
                    trFunc ('Gehe zur Liste der PN(s), die Ihr Euch geschrieben habt.',
                            'Go to the personal message(s) that you have exchanged with this user.')+'"><big>&nbsp;&#x2709;&nbsp;</big></a>';
                var anchorID   = '<a href="http://www.model-kartei.de/u/'+object.id+'/'+uPageTokenGoToSedcard+'"'+
                ' style="text-decoration: none; color:#777">';
                var anchor     = '<a href="http://www.model-kartei.de/u/'+object.id+'/'+uPageTokenGoToSedcard+'" style="text-decoration: none">';
                var anchorNote = '<a href="http://www.model-kartei.de/u/'+object.id
                +'/'+uPageTokenGoToSedcard+'" style="text-decoration: none; font-size:100%; font-style: italic; color:#BD9E7B">';
                //80c048">';
                centerTableInner = centerTableInner
                +'<tr style="color:#bbb; background-color:#000">'
                +'<td width="1%" valign="bottom" align="center" style="background-color:#200">'
                +   anchorForPNs
                +'</td>'
                +'<td width="99%" valign="center" align="left">'
                +   anchor
                +'<table border="0" cellpadding="0" cellspacing="0"><tr>' + object.infoLine + '</tr></table>'
                +'</a></td></tr>';

                centerTableInner = centerTableInner
                +'<tr style="color:#777; background-color:#2E2E2E">'
                +'<td>'+anchor+'&nbsp;'+'</a></td>'
                +'<td valign="top"align="left">&nbsp;&nbsp;&nbsp;'
                +   anchorNote
                +  (noteTextIsUnknown ? '<small><i>':'')
                +   object.note.replace ('\\n','<br />&nbsp;&nbsp;&nbsp;')
                +  '<br />&nbsp;'
                +  (noteTextIsUnknown ? '</i></small>':'')
                +'</a></td></tr>';
            }

            var divPagination = '';
            /*
            if (numberOfObjects > pageSize)
            {
                divPagination = '<div class="pagination"><ul>';

                var pageNumber = 0;
                do
                {
                    divPagination = divPagination + '<li><a ';
                    if (pageNumber == startPageIdx)
                    {
                        divPagination = divPagination + 'class="active" '
                    }
                    divPagination = divPagination + 'href="' + pageLink0 + hrefPageParameter + pageNumber.toString () +
                        '">' + (pageNumber+1).toString () +
                        '</a></li>';
                    pageNumber++;
                } while (numberOfObjects > (pageNumber)*pageSize);

                divPagination = divPagination + '</ul></div>';
            }
            */
            var hasEntries     = (numberOfObjects > 0);
            var hasDayCounters = (numDayCounters  > 0);

            centerTableInner = centerTableInner + '</table>' +
                divPagination +
                '&nbsp;<br />&nbsp;<br />' +
                (hasEntries ? '<small>' : '<big>') +
                trFunc ('Eintr&auml;ge','entries')+': ' + numberOfObjects.toString () +
                (   hasDayCounters
                  ? (' &nbsp; &nbsp; '+trFunc ('Tage-Z&auml;hler','day counters')+': '+numDayCounters.toString ())
                  : ''
                ) +
                (hasEntries ? '</small>' : '</big>') +
                '<small> &nbsp; &nbsp; MKBeautifier'+trFunc ('-Version',' rev.')+': '+MKBeautifierVERSION+'</small>';
            tableElement.innerHTML = centerTableInner;
        }


        var isSettingsPageForStartPage = (location.href.indexOf ('model-kartei.de/einstellungen/startseite/') > -1);

        if (isSettingsPageForStartPage)
        {
            var h2Elements = document.getElementsByTagName ('h2');
            if (h2Elements.length > 0)
            {
                var h2NewTop = document.createElement("h2");
                h2NewTop.innerHTML = '&nbsp;<br />MKBeautifier: '+trFunc ('Widget-Position festlegen', 'Select position of Widget');

                var pNew = document.createElement("p");
                pNew.setAttribute ('class', 'intro fSmaller4');
                pNew.innerHTML = trFunc ('Das Widget wird nur dann eingeblendet, wenn Du <i>auf mindestens einer</i> der von Dir besuchten Sedcards einen Tage-Z&auml;hler aktiviert hast.<br />Bitte w&auml;hle, ob es &uuml;ber den MK-Widgets eingeblendet wird, oder darunter, oder gar nicht.',
                                         'Widget will be shown if (and only if) you have activated a days counter on at least ONE of the sedcards visited.<br />Please specify if it should be shown above of the MK widgets, or below of them, or just not be shown.');

                var newDiv = document.createElement ('div');
                newDiv.setAttribute ('class', 'settingList');

                var h2NewPosition = document.createElement("h2");
                h2NewPosition.setAttribute ('class', 'iLabel');
                h2NewPosition.innerHTML = trFunc ('Tage-Z&auml;hler', 'Days Counters');

                var h2Element = h2Elements [0];
                h2Element.innerHTML = '&nbsp;<br />&nbsp;<br />MK: '+h2Element.innerHTML;
                h2Element.parentNode.insertBefore (h2NewTop,      h2Element);
                h2Element.parentNode.insertBefore (pNew,          h2Element);
                h2Element.parentNode.insertBefore (h2NewPosition, h2Element);
                h2Element.parentNode.insertBefore (newDiv,        h2Element);

                // Note: Appending the settings rows must be done AFTER inserting newDiw into the DOM tree.
                //       Otherwise jQuery cannot wire-up their connections.
                appendSessingsRow (newDiv, trFunc ('Als oberstes Widget einblenden','Show as top-most widget'), '',
                                   trFunc ('Tage-Zähler-Liste (falls Du auf besuchten Sedcards welche aktiviert hast) als oberstes Startseiten-Widget anzeigen?\n\n'+
                                   '(wird ignoriert, falls der folgende Schalter aktiv ist)',
                                           'Show your list of days counters (if you have activated any on sedcards visited by you) as the top-most widget on your personal start page?\n\n'+
                                           '(setting will be ignored if the following option is set to Yes)'),
                                   settings.ShowListOfDaysAtTopOfStartpage, settings.ShowListOfDaysAtBottomOfStartpage);

                appendSessingsRow (newDiv, trFunc ('Als unterstes Widget einblenden','Show as bottom-most widget'), '',
                                   trFunc ('Tage-Zähler-Liste (falls Du auf besuchten Sedcards welche aktiviert hast) als unterstes Startseiten-Widget anzeigen?\n\n'+
                                   '(wird ignoriert, falls der obige Schalter aktiv ist)',
                                           'Show your list of days counters (if you have activated any on sedcards visited by you) as the bottom-most widget on your personal start page?\n\n'+
                                           '(setting will be ignored if the preceeding option is set to Yes)'),
                                   settings.ShowListOfDaysAtBottomOfStartpage, settings.ShowListOfDaysAtTopOfStartpage);
            }
        }




        function selectAllInElement (id)
        {
            var element = document.getElementById (id);
            element.focus  ();
            element.select ();
        }



        var unknownUsers           = new Array ();
        var receivedUserKmDataList = new Array ();
        function getUnknownInfolineData (waitingDocument, callbackFunction)
        {
            {
                var $dashSeparatedListOfIDs = '';
                unknownUsers.forEach (
                    function (userID, index, array)
                    {
                        if ($dashSeparatedListOfIDs.length > 0)
                        {
                            $dashSeparatedListOfIDs = $dashSeparatedListOfIDs + '-';
                        }
                        $dashSeparatedListOfIDs = $dashSeparatedListOfIDs + userID;
                    }
                );

                if ($dashSeparatedListOfIDs.length > 0)
                {
                  $.ajax({
                    type:     'POST',
                    url:      'https://www.model-kartei.de/assets/ajax/distance.php',
                    dataType: 'json',
                    async:    true,
                    timeout:  15000, // sets timeout to 15 seconds
                    data: {
                        dataList: $dashSeparatedListOfIDs,
                        ds9:      $('#ds9x').val (),
                        ds9:      $('#ds9y').val ()
                    },
                    success: function(theData, textStatus, jqXHR)
                    {
                        if (textStatus == 'success')
                        {
                            var receivedUserKmDataList = theData.msgContent;

                            for (var i=0; i<receivedUserKmDataList.length; i++)
                            {
                                var userID = receivedUserKmDataList [i].uid.toString ();
                                var km     = receivedUserKmDataList [i].km.toString ();

                                setUserStorageValue (userID, userStorageToken.KM, km);
                                callbackFunction (waitingDocument, userID);
                            }
                        }
                    },
                    error: function(response)
                    {
                        // ...
                    }
                  });
                }
            }
        }


        var mapOfWaitingUserElementArrays = new Map ();
        var numUnknownUsersProcessed      = 0;

        function processInfolineDependendElements (theDocument,
                                                   waitingElements,
                                                   functionToGetUserID,
                                                   functionToProcessWaitingElements)
        {
            if (waitingElements.length > 0)
            {
                mapOfWaitingUserElementArrays.clear ();

                unknownUsers.length          = 0;
                numUnknownUsersProcessed     = 0;

                for (var i = 0; i < waitingElements.length; i++)
                {
                    var waitingElement = waitingElements [i];

                    var userID = functionToGetUserID (waitingElement);

                    if (userID != '')
                    {
                        if ( ! mapOfWaitingUserElementArrays.has (userID))
                        {
                            var elements = new Array ();
                            mapOfWaitingUserElementArrays.set (userID, elements);
                        }
                        mapOfWaitingUserElementArrays.get (userID).push (waitingElement);
                    }
                }

                mapOfWaitingUserElementArrays.forEach (
                    function (elementsForThisUser, userID, map)
                    {
                        if (userHasStorageData (userID))
                        {
                            functionToProcessWaitingElements (theDocument, userID);
                        }
                        else
                        {
                            unknownUsers.push  (userID);
                        }
                    }
                );
                getUnknownInfolineData (theDocument, functionToProcessWaitingElements);
            }
        }



        // these need to be defined outside of the functions,
        // so addDataToFigures() and addDataToULists() can use them:
        var activeKmFilterIsNear              = false;
        var toolTipListOfIgnoredUsersPictures = '';
        var toolTipListOfTooFarUsersPictures  = '';
        var toolTipListOfMaleModelPictures    = '';



        //
        // user links on "list of users" pages
        //
        function isListOfUsersPage ()
        {
            var foundIt = false;
            var urlBase = 'model-kartei.de/sedcards/';
            var urlTail1 = '/?';
            var urlTail2 = '/city/';
            origSettingAddToMenu_NeueFotos.forEach (function (userItem, index, array)
                {
                    var tokenBase = urlBase + userItem [1];
                    if (location.href.indexOf (tokenBase + urlTail1) > -1 ||
                        location.href.indexOf (tokenBase + urlTail2) > -1
                    )
                    {
                        foundIt = true;
                        return;
                    }
                }
            );
            return foundIt;
        }

        if (isListOfUsersPage ())
        {
            processListOfUsersPage (document);
        }
        else
        {
            if (   location.href.indexOf('model-kartei.de/sedcards/'  ) > -1
                || location.href.indexOf('model-kartei.de/portfolios/') > -1)
            {
                processUserSedcard (document, true, null, null);
            }
        }



        function processListOfUsersPage (theDocument)
        {
            var uLists = theDocument.querySelectorAll ('figure[class^="uList"]');
            processInfolineDependendElements (theDocument,
                                              uLists,
                                              getUserIDFromFirstAnchorInElement,
                                              addDataToULists);
        }


        function addDataToULists (waitingDocument, userID)
        {
            if (mapOfWaitingUserElementArrays.has (userID))
            {
                var infoLineObject = new Object ();
                createCompactInfoline (userID, 10, 13, true, infoLineObject, true, true, false, false, false, null);
                var infoLine           = infoLineObject.text;
                var userInSilentIgnore = infoLineObject.hasFlagIgnore;
                var markThisUser       = (hCheck && infoLineObject.userFlagsObject.ValueCheckOK == 0);

                var styleLineThrough = ' style="text-decoration:line-through"';

                var uListElements = mapOfWaitingUserElementArrays.get (userID);

                var userName = getUserNameFromUListFigure (uListElements [0]);

                uListElements.forEach (function (uListElement, index, array)
                {
                    if (markThisUser)
                    {
                        var figCaptionElements = uListElement.getElementsByTagName ('figcaption');
                        if (figCaptionElements.length > 0)
                        {
                            var figCaptionElement = figCaptionElements [0];
                            figCaptionElement.setAttribute ('style', 'background-color:#00a000');

                        }
                    }
                    var uDescElements = uListElement.getElementsByClassName ('uDesc');
                    if (uDescElements.length > 0)
                    {
                        var uDescElement = uDescElements [0];

                        //kh
                        if ((userInSilentIgnore && settings.SearchResultPageHideIfSilentIgnored.value) || (hCheck && ! markThisUser))
                        {
                            uListElement.innerHTML = '';
                            toolTipListOfIgnoredUsersPictures = toolTipListOfIgnoredUsersPictures + userName + ' &nbsp;  &nbsp; ';
                        }
                        else
                        {
                            var newInner = uDescElement.innerHTML;
                            if (userInSilentIgnore && settings.SearchResultPageStrikeOutIfSilentIgnored.value)
                            {
                                newInner = newInner.replace ('<span class="block"',           '<span class="block"'          +styleLineThrough);
                                newInner = newInner.replace ('<span class="uLocation block"', '<span class="uLocation block"'+styleLineThrough);
                            }
                            uDescElement.innerHTML =
                                newInner +
                                '<center><table cellpadding="0" cellspacing="0"><tr><td align=center style="background-color:#000">&nbsp;' +
                                infoLine.replace ('>N</span>','>N </span>'); +
                                '&nbsp;</td></tr></table></center>';
                        }
                    }
                });



                numUnknownUsersProcessed++;
                var jobsLeftContainer = null;
                {
                    var detailsBtns = document.querySelectorAll ('label[class^="labelTrigger btn medium tCenter"]');
                    if (detailsBtns.length > 0)
                    {
                        jobsLeftContainer = detailsBtns [0];
                        showJobsForUnknownUsersLeft (jobsLeftContainer, '&nbsp; ');
                    }
                }


                if (numUnknownUsersProcessed >= mapOfWaitingUserElementArrays.size)
                {
                    // all of the map's entries have been processed, so we now remove empty space (if any)

                    var figures = waitingDocument.getElementsByClassName ('uList');

                    var figuresRemoved = 0;
                    for (i = figures.length-1; i>-1; i=i-1)
                    {
                        var figure = figures [i];

                        if (figure.innerHTML.length == 0)
                        {
                            figure.remove ();
                            figuresRemoved++;
                        }
                    }


                    if (figuresRemoved > 0 && jobsLeftContainer != null)
                    {
                        var colorOfHint = isDarkTheme ? '#777' : '#666';
                        var justOne = (figuresRemoved == 1);
                        var toolTipForHidden =
                              'title="'+trFunc ('Es wurde'+(justOne ? '' : 'n'),'hidden users: ')+' '+figuresRemoved.toString ()+
                                        trFunc (' Teilnehmer ausgeblendet:  ','')+'\n\n'
                            + toolTipListOfIgnoredUsersPictures
                            + '\n "';

                        jobsLeftContainer.innerHTML = jobsLeftContainer.innerHTML + ' &nbsp; <small '+toolTipForHidden+' style="color:' + colorOfHint + '">&nbsp;'
                        + trFunc ('verborgen: ','hidden: ')
                        + figuresRemoved.toString ()
                        + '&nbsp;</small>';
                    }
                }
            }
        }





        //
        // my favorites page
        //
        var isFavoritesPhotoPage = (location.href.indexOf('model-kartei.de/management/favoriten/') > -1);

        if (isFavoritesPhotoPage)
        {
            var favoriteElements = document.querySelectorAll ('div[class^="mListing sedcard"]');
            processInfolineDependendElements (document,
                                              favoriteElements,
                                              getUserIDFromFirstAnchorInElement,
                                              addDataToEntriesOnFavoritePage);
        }

        function addDataToEntriesOnFavoritePage (waitingDocument, userID)
        {
            if (mapOfWaitingUserElementArrays.has (userID))
            {
                var infoLineObject = new Object ();
                createCompactInfoline (userID, 12, 14, false, infoLineObject, false, true, false, false, false, null);
                var infoLine = infoLineObject.text;

                var arrayOfFavorites = mapOfWaitingUserElementArrays.get (userID);
                arrayOfFavorites.forEach (function (element, index, array)
                {
                    var nameElements = element.getElementsByClassName ('uName');
                    if (nameElements.length > 0)
                    {
                        var nameElement = nameElements [0];
                        nameElement.setAttribute ('title', nameElement.innerHTML);

                        var wasShortened = false;

                        var inner  = nameElement.innerHTML;
                        var maxLen = 20;
                        if (inner.length > maxLen)
                        {
                            wasShortened = true;
                            nameElement.innerHTML = inner.substring (0, maxLen);
                        }
                        nameElement.innerHTML =
                                    '<table border="0" width="100%" cellpadding="0" cellspacing="0">'+
                                        '<tr><td>'+nameElement.innerHTML+ (wasShortened ? smallEllipsisSpan : '') + '</td>'+
                                            '<td align="right">' + infoLine+'</td></tr></table>';
                    }
                });
            }
        }



        //
        // single-foto page
        //
        var isSinglePhotoPage = (    location.href.indexOf('model-kartei.de/fotos/foto/'  ) > -1
                                  || location.href.indexOf('model-kartei.de/photos/photo/') > -1);

        if (isSinglePhotoPage)
        {
            var userID     = '';
            var isOwnPhoto = false;

            var publisher = null;
            for (var i = 0; i < settings.AddToMenu_NeueFotos.value.length; i++)
            {
                var publishers = document.getElementsByClassName ('p-publisher sedcard'+ settings.AddToMenu_NeueFotos.value [i][0]);
                if (publishers.length > 0)
                {
                    publisher   = publishers [0];
                    var anchors = publisher.getElementsByTagName ('a');
                    if (anchors.length > 0)
                    {
                        var anchor = anchors [0];
                        userID     = getUserIDFromHRefToSedcard (anchor.getAttribute ('href'));
                        isOwnPhoto = (userID == ownID);
                        break;
                    }
                }
            }

            var userStorageObject = getUserStorageObject (userID);

            var pageTopElement = document.getElementById ('pageTop');

            // 1. synchoneous actions:
            //    Show information on top of the page.
            if ( (! isOwnPhoto) && (settings.SinglePhotoPageShowLocationAtTop.value || settings.SinglePhotoPageShowNotesAtTop.value))
            {
                if (publisher != null)
                {
                    var details = document.getElementsByClassName ('cameraDetails');
                    if (details.length > 0)
                    {
                        var detail = details [0];
                        var rows = detail.getElementsByClassName ('row');
                        if (rows.length > 0)
                        {
                            var row = rows [0];
                            var divs = row.getElementsByTagName ('div');
                            if (divs.length > 0)
                            {
                                var div = divs [0];

                                var codes = div.getElementsByTagName ('code');
                                if (codes.length > 0)
                                {
                                    var code = codes [0].cloneNode (true);
                                    if (settings.SinglePhotoPageShowLocationAtTop.value)
                                    {
                                        publisher.innerHTML = publisher.innerHTML+'&nbsp; &nbsp; &nbsp;';
                                        publisher.appendChild (code);
                                    }

                                    var anchors = div.getElementsByTagName ('a');
                                    if (anchors.length > 0)
                                    {
                                        var city = '';
                                        if (anchors.length > 1)
                                        {
                                            city = anchors [1].innerHTML;
                                        }
                                        else // sometimes the city is not an HTML link:
                                        {
                                            city = div.innerHTML;
                                            city = city.substring (city.lastIndexOf ('>')+1);
                                            if (city.length > 0 && city.indexOf (',') == 0)
                                            {
                                                city = city.substring (1).trim ();
                                            }
                                        }

                                        var userNote = null;
                                        var userKm   = null;
                                        var userIgnored = false;

                                        var userFlagsText  = '';
                                        var userFlagsFound = false;

                                        var publisherHRefs = publisher.getElementsByTagName ('a');
                                        if (publisherHRefs.length > 0)
                                        {
                                            userNote = getUserStorageValue (userID, userStorageToken.NOTE, userStorageObject);
                                            userKm   = getUserStorageValue (userID, userStorageToken.KM  , userStorageObject);

                                            var userFavorite = getUserStorageValue (userID, userStorageToken.FAVORITE, userStorageObject) == '1';
                                            var userNetwork  = getUserStorageValue (userID, userStorageToken.NETWORK , userStorageObject ) == '1';

                                            var userFlagsObject = new Object ();
                                            getUserFlagsObject (userID, userFavorite, userNetwork, 14,
                                                                settings.InfoColor_Near.value,
                                                                false, userFlagsObject, false, false, false, false, '', userStorageObject);
                                            userFlagsText  = userFlagsObject.text;
                                            userFlagsFound = userFlagsObject.found;
                                            userIgnored    = userFlagsObject.hasFlagIgnore;
                                            // var userImportance  = userFlagsObject.importance;
                                        }


                                        if (userIgnored)
                                        {
                                            publisher.innerHTML = '<strike>'+publisher.innerHTML+'</strike>';
                                        }
                                        else
                                        {
                                            if (userNote != null)
                                            {
                                                publisher.innerHTML = '<i>'+publisher.innerHTML+'</i>';
                                            }
                                        }

                                        if (userKm != null && userKm != '-1')
                                        {
                                            userKm = userKm+' km';
                                        }
                                        else
                                        {
                                            userKm = '';
                                        }

                                        if (userFlagsFound)
                                        {
                                            if (! isDarkTheme)
                                            {
                                                userFlagsText = '<span style="background-color:#222"> &nbsp;' + userFlagsText + '&nbsp; </span>';
                                            }
                                            userKm = userKm+'</i><big> &nbsp; '+userFlagsText+'</big><i>';
                                        }


                                        if (settings.SinglePhotoPageShowLocationAtTop.value)
                                        {
                                            publisher.innerHTML = publisher.innerHTML+'&nbsp; '+city;
                                            publisher.innerHTML = publisher.innerHTML+'<span> &nbsp; <b><i>'+userKm+'</i></b></span>';
                                        }

                                        if (settings.SinglePhotoPageShowNotesAtTop.value && userNote != null && userNote.trim ().length > 0)
                                        {
                                            var colorsOfNote =
                                            isDarkTheme
                                            ? 'color:'+settings.InfoColor_Near.value+'; background-color:#131313;'
                                            : 'color:'+settings.InfoColor_Near.value+'; background-color:#222222;';
                                            var span = document.createElement("p");
                                            span.setAttribute ('style', 'font-size:14px; font-style: italic; '+colorsOfNote);

                                            span.innerHTML = '&nbsp;&nbsp; '+userNote.replace ('\\n','<br />&nbsp;&nbsp; ')+' &nbsp;&nbsp;';

                                            //publisher.innerHTML = publisher.innerHTML+'&nbsp; '+userNote;
                                            publisher.appendChild (span);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            // 2. asynchoneous actions:
            //    If this is my own photo, add km information to all of the commentors.
            if (isOwnPhoto)
            {
                var comments = document.querySelectorAll ('div[class^="comment sedcard"]');
                processInfolineDependendElements (document,
                                                  comments,
                                                  getUserIDFromFirstAnchorInElement,
                                                  addDataToCommentsOnPhotoPage);
            }
        }

        function addDataToCommentsOnPhotoPage (waitingDocument, userID)
        {
            if (mapOfWaitingUserElementArrays.has (userID))
            {
                var infoLineObject = new Object ();
                createCompactInfoline (userID, 12, 14, false, infoLineObject, true, true, false, false, false, null);
                var infoLine = infoLineObject.text;

                var arrayOfComments = mapOfWaitingUserElementArrays.get (userID);
                arrayOfComments.forEach (function (comment, index, array)
                {
                    var headerElements = comment.getElementsByClassName ('row commentHeader');
                    if (headerElements.length > 0)
                    {
                        var divs = headerElements [0].getElementsByTagName ('div');
                        if (divs.length > 0)
                        {
                            var nameElement = divs [0];

                            // shorten the name to make room for the infoLine:
                            var wasShortened = false;
                            var anchors = nameElement.getElementsByTagName ('a');
                            if (anchors.length > 0)
                            {
                                anchor = anchors [0];
                                anchor.setAttribute ('title', anchor.innerHTML);

                                var inner  = anchor.innerHTML;
                                var maxLen = 24;
                                if (inner.length > maxLen)
                                {
                                    wasShortened = true;
                                    anchor.innerHTML = inner.substring (0, maxLen);
                                }
                            }

                            nameElement.innerHTML =
                                    '<table border="0" width="100%" cellpadding="0" cellspacing="0">'+
                                        '<tr><td>'+nameElement.innerHTML+ (wasShortened ? smallEllipsisSpan : '') + '</td>'+
                                            '<td align="right">' + infoLine+'</td></tr></table>';
                        }
                    }
                });
            }
        }



        function getKmFilterFromHref (href)
        {
            var kmFilter = kmFilterMAXVALUE;
            var idxKmFilter = href.indexOf ('kmFilter=');
            if (idxKmFilter > -1)
            {
                var sKm = location.href.substring (idxKmFilter+9);
                var intKm = Number(sKm);
                if (! Number.isNaN(intKm))
                {
                    kmFilter = intKm;
                }
            }
            return kmFilter;
        }



        function colorByTheme (flag)
        {
            if (isDarkTheme)
            {
                if (flag)
                {
                    return '#ccc';
                }
                return     '#666';
            }
            if (flag)
            {
                return '#000';
            }
            return     '#666';
        }

        // for unknown reasons our colorByTheme settings do not work in bright theme
        // that's why we mark the selected arrows by '(..)' then:
        function arrowByTheme (flag, arrow)
        {
            if (isDarkTheme)
            {
                return '&nbsp;' + arrow + '&nbsp;';
            }
            if (flag)
            {
                return  '(' + arrow + ')';
            }
            return '&nbsp;' + arrow + '&nbsp;';
        }



        function makeImgWithHintForEmptyOrHiddenDaysCounterWidget (hint, style)
        {
          return '<span title="'+hint+style+'>&#x231A;</span>';
        }

        function createBeautifiedUserID ()
        {
            var beautifiedUserID = '('+userID+')';
            return beautifiedUserID;
        }

        function createInnerDaysTable (maxLines, label, userObjects, leftSide)
        {
            var gapTR = '<tr height="5px" style="background-color:#1c1c1c; font-size:6px"><td colspan="5"></td></tr>';
            var hGap  = '<span style="font-size:33%">&nbsp;</span>';

            var innerTable =
                '<table width="100%" border="0" cellpadding="0" cellspacing="0">'+
                '<tr><td colspan="5"><table width="100%" border="0" cellpadding="0" cellspacing="0"><tr><td>'+label+'&nbsp;&nbsp;<small>'+
                (   (userObjects.length > 0)
                  ? userObjects.length.toString ()
                  : trFunc ('(noch keine Eintr&auml;ge)','(no entries yet)')
                )+
                '</small></td><td align="center" valign="top">'+
                ((leftSide || hSWLs) ? '' /*('<a href="http://www.model-kartei.de/u/'+ownID+'/?MKBeautifier_Infos"><small>'+
                                tr ('gehe zur MKBeautifier-&Uuml;bersicht','go to MKBeautifier overview')+'</small></a>')
                                */
                          : (' &nbsp; <a href="http://www.model-kartei.de/u/'+ownID+'/?MKBeautifier_Marker" style="text-decoration: none; font-size:90%; color:#aaa">'+
                               '<span style="border:1px solid gray; border-radius:4px">&nbsp;'+tr ('Gehe zur Gesamtliste …','Goto long list …')+'&nbsp;</span>'+
                             '</a>'+
                             '&nbsp; &nbsp; &nbsp;'+
                             '<a href="http://www.model-kartei.de/u/'+ownID+'/?MKBeautifier" style="text-decoration: none; font-size:100%; color:#aaa">'+
                               '<span style="border:1px solid gray; border-radius:4px">&nbsp;'+tr ('Gehe zu Einstellungen …','Goto settings …')+'&nbsp;</span>'+
                             '</a>'+
                             ' &nbsp; &nbsp; '
                        ))+
                '</td></tr></table></td></tr>';

            var useSmallFont = leftSide || (settings.JustTheFutureCountersOnStartpage.value && userObjects.length > 4);

            for (var i = 0; i < maxLines && i < userObjects.length; i++)
            {
                var anchorForPNs = '<a href="http://www.model-kartei.de/pn/user/'+userObjects [i].id+'/" '+
                    'style="text-decoration: none; font-size:'+(useSmallFont ? '180%':'200%')+'; color:#b09060" title="'+
                    trFunc ('Gehe zur Liste der PN(s), die Ihr Euch geschrieben habt.',
                            'Go to the personal message(s) that you have exchanged with this user.')+'">'+hGap+'&#x2709;'+hGap+'</a>';
                var anchorTag = '<a href="http://www.model-kartei.de/u/'+userObjects [i].id+'/'+uPageTokenGoToSedcard+'" '+
                    'style="text-decoration: none; text-align:left; vertical-align:top" title="'+
                            trFunc ('Gehe zur Sedcard dieses Teilnehmers.',
                                    'Go to Portfolio of this user.')+'">';

                var newInfoLine = userObjects [i].infoLine
                .replace (
                    'class="spanBaseInUserFlagsObject" style="text-align: center',
                    'class="spanBaseInUserFlagsObject" style="text-align:left; vertical-align:top')
                .replace (
                    '" class="spanOfDaysNumber"',
                    '; '+makeStyleForSedcardDaysCounter (userObjects [i].userFlagsObject.stopwatchDelta, leftSide ? '75%':'85%')+
                    '" class="spanOfDaysNumber"');

                var newTR = '<tr style="background-color:#323232">\n'+
                    '<td width="1%" valign="top" style="background-color:#361616; padding-top:2px">'+
                        '<span style="text-align:center; vertical-align:top; padding-top:1px">'+
                            anchorForPNs+
                        '</span>'+
                    '</td>\n'+
                    '<td width="18%" style="text-align:left; vertical-align:top">'+
                        anchorTag+
                            '<span style="white-space: nowrap">'+
                                newInfoLine+
                            '</span>'+
                        '</a>&nbsp;&nbsp;&nbsp;'+
                    '</td>\n'+
                  //  '<td width="1%">&nbsp;</td>\n'+
                    '<td width="80%" style="text-align:left; vertical-align:top; font-size:'+(useSmallFont ? '75%; line-height:150%':'80%')+'">'+
                        anchorTag+
                            '<span style="color:#FFDCA7">'+
                               userObjects [i].note.replace ('\\n','<br />') +
                               // '1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 ' +
                            '</span>'+
                        '</a>'+
                    '</td>\n</tr>';
                //alert(newTR);
                innerTable = innerTable + newTR + gapTR;
            }
            innerTable = innerTable + '</table>';

            return innerTable;
        }




        //
        // links on condensed lists of users: News/Sedcards and Radar/
        //
        if (    (location.href.indexOf ('model-kartei.de/news/sedcards/') > -1)
             || (location.href.indexOf ('model-kartei.de/radar/')         > -1) )
        {
          var elementsForCondensedUserList = document.getElementsByClassName ('userListing');
          processInfolineDependendElements (document,
                                            elementsForCondensedUserList,
                                            getUserIDFromFirstAnchorInElement,
                                            addDataToElementsInCondensedUserlist);
        }


        //
        // fix a bug on the Default Message page
        //
        /*
        var isDefaultMessagPage = (location.href.indexOf('model-kartei.de/pn/standard/') > -1);
        if (isDefaultMessagPage)
        {
            var titleInputElem = document.getElementById ('replyTitle');
            if (titleInputElem != null)
            {
                titleInputElem.setAttribute ('maxlength', '64'); // this value as in the "Konversationsdaten ändern" dialog
            }
            alert (titleInputElem.outerHTML);
        }
        */



        //
        // links on photo previews:
        //
        function isPhotoPage (token)
        {
            return (location.href.indexOf ('model-kartei.de/fotos/' +token) > -1)
                || (location.href.indexOf ('model-kartei.de/photos/'+token) > -1);
        }

        var isSelectionPage     = isPhotoPage ('selection/');
        var isAwesomePage       = isPhotoPage ('awesome/');
        var isNewPhotosPage     = isPhotoPage ('stream/');
        var isDiscussionPage    = isPhotoPage ('diskussion/')
                               || isPhotoPage ('discussion/');
        var isBestOfList        = isPhotoPage ('bestof/');
        var isTaggedPhotosPage  = isPhotoPage ('tagged/');
        var isNetworkPage       = isPhotoPage ('stream/network');
        var isPhotoFavoritesPage= (location.href.indexOf('model-kartei.de/management/fotos/favoriten/') > -1);
        var isKeywordPhotosPage = isPhotoPage ('keywords/');

        var isPhotosOfMyFavoritesPage = isPhotoPage ('stream/favourites');

        var photosMainPageEndOfURLDe = 'model-kartei.de/fotos/';
        var photosMainPageEndOfURLEn = 'model-kartei.de/photos/';
        var isPhotosMainPage = (location.href.indexOf (photosMainPageEndOfURLDe) == location.href.length - photosMainPageEndOfURLDe.length)
                            || (location.href.indexOf (photosMainPageEndOfURLEn) == location.href.length - photosMainPageEndOfURLEn.length);
        var isPhotosOfPhotographersPage = (    (location.href.indexOf ('model-kartei.de/fotos/stream/' ) > -1)
                                            || (location.href.indexOf ('model-kartei.de/photos/stream/') > -1) )
                                       && (     location.href.indexOf ('sedcard=2') > -1);
        var isPhotosOfVisasPage = (    (location.href.indexOf ('model-kartei.de/fotos/stream/' ) > -1)
                                            || (location.href.indexOf ('model-kartei.de/photos/stream/') > -1) )
                                       && (     location.href.indexOf ('sedcard=3') > -1);
        var isPhotosOfBodypaintersPage = (    (location.href.indexOf  ('model-kartei.de/fotos/stream/' ) > -1)
                                            || (location.href.indexOf ('model-kartei.de/photos/stream/') > -1) )
                                       && (     location.href.indexOf ('sedcard=11') > -1);

        var userType = '0';
        var typePos  = location.href.indexOf('sedcard=');
        if (typePos > -1 && location.href.length > typePos+8)
        {
            userType   = location.href.substring (typePos+8);
            var ampPos = userType.indexOf ('&');
            if (ampPos > -1)
            {
                userType = userType.substring (0, ampPos);
            }
        }

        var totalNumberOfIgnoredFiguresDueToKm        = 0;
        var totalNumberOfIgnoredFiguresDueToIgnore    = 0;
        var totalNumberOfIgnoredFiguresDueToMaleModel = 0;
        var hMPs         = (ownStorageGetItem (preferenceStorageKeyBASE+'hMPs' ) != null) && ! isKeywordPhotosPage;
        var hSWLs        = (ownStorageGetItem (preferenceStorageKeyBASE+'hSWLs') != null);
        var rVersion     = '';
        var rVersionKey  = preferenceStorageKeyBASE+'rVersion';
        var rVersionItem = ownStorageGetItem (rVersionKey);
        if (rVersionItem != null)
        {
            rVersion = rVersionItem;
        }
        if (isMyStartPage || isPhotosMainPage || isSelectionPage || isAwesomePage || isDiscussionPage || isNewPhotosPage || isBestOfList || isTaggedPhotosPage || isPhotoFavoritesPage ||  isKeywordPhotosPage)
        {
            var kmFilter = getKmFilterFromHref (location.href);

            activeKmFilterIsNear  = (kmFilter <= settings.KmFilterNear.value);

            var kmFilterOff       = (kmFilter == kmFilterMAXVALUE);
            var kmFilterNotTooFar = (kmFilter <= settings.KmFilterNotTooFar.value) && ! activeKmFilterIsNear;
            var kmFilterNear      = activeKmFilterIsNear;

            var kmFilterParameter = '';

            if ( isMyStartPage)
            {
                var statusElem = document.getElementById ('mainpageStatus');
                if (statusElem != null)
                {
                    var userID = getUserIDFromFirstAnchorInElement (statusElem);
                    if (userID.length < 7)
                    {
                        if (settings.ShowShowUserIDOnStartpage.value)
                        {
                            var token = '<div class="col c-3-2 pDesc">';
                            statusElem.innerHTML = statusElem.innerHTML.replace (token, token + createBeautifiedUserID () + '&nbsp;');
                            settings.ShowShowUserIDOnStartpage.value = false;
                            updateSinglePreferenceValue (settings.ShowShowUserIDOnStartpage.storageID, false, 0);
                        }
                        var copyrightElem = document.getElementById ('copyright');
                        if (copyrightElem != null)
                        {
                            copyrightElem.innerHTML = createBeautifiedUserID () + '<br/> '+ copyrightElem.innerHTML;
                        }
                        if (rVersion != MKBeautifierVERSION)
                        {
                            ownStorageSetItem (rVersionKey, MKBeautifierVERSION);
                        }
                    }
                }
                if (settings.ShowListOfDaysAtTopOfStartpage.value || settings.ShowListOfDaysAtBottomOfStartpage.value)
                {
                    var numItems          = storage.length;
                    var userObjectsPast   = new Array ();
                    var userObjectsFuture = new Array ();

                    for (var i=0; i<numItems-1; i++)
                    {
                        var storageKey = ownStorageKey (i);
                        //alert(storageKey);
                        if (storageKey.length > 0 && storageKey.substring (0, 1) == 'u')
                        {
                            var storageItem  = ownStorageGetItem (storageKey);
                            if (storageItem != null)
                            {
                                var object  = getUserStorageObjectFromString (storageItem);
                                if (object != null)
                                {
                                    if (objectHasStopwatchSet (object))
                                    {
                                        var id = storageKey.substring (1);
                                        if (id.length > 1 && id.substring (0, 2) == 'MK')
                                        {
                                            id = id.substring (2);  // very old 10-based UID format
                                        }
                                        else
                                        {
                                            id = parseInt (id, 16).toString ();
                                        }
                                        var infoLineObject = new Object ();
                                        createCompactInfoline (id, 10, 14, false, infoLineObject, true, false, false, false, true, object);
                                        object.id              = id;
                                        object.infoLine        = infoLineObject.text;
                                        object.userFlagsObject = infoLineObject.userFlagsObject;
                                        object.isIgnoringMe    = infoLineObject.userIsIgnoringMe;
                                        if (object.userFlagsObject.hasStopwatch && object.userFlagsObject.stopwatchDelta != undefinedStopwatchValue)
                                        {
                                            if (object.userFlagsObject.stopwatchDelta > 0)
                                            {
                                                if ( ! settings.JustTheFutureCountersOnStartpage.value)
                                                {
                                                    userObjectsPast.push (object);
                                                }
                                            }
                                            else
                                            {
                                                userObjectsFuture.push (object);
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }

                    var weHaveCounters = false;

                    if (userObjectsPast.length > 0)
                    {
                        weHaveCounters = true;
                        userObjectsPast.sort (function(a, b)
                        {
                            return a.userFlagsObject.stopwatchDelta - b.userFlagsObject.stopwatchDelta;
                        });
                    }
                    if (userObjectsFuture.length > 0)
                    {
                        weHaveCounters = true;
                        userObjectsFuture.sort (function(a, b)
                        {
                            return b.userFlagsObject.stopwatchDelta - a.userFlagsObject.stopwatchDelta;
                        });
                    }

                    var contentElem = document.getElementById ('content');
                    if (weHaveCounters && contentElem != null)
                    {
                        var maxLines = 4;

                        var tablePastDays =
                            settings.JustTheFutureCountersOnStartpage.value
                            ? ''
                            : createInnerDaysTable (
                                maxLines+1,
                                trFunc ('Tage-Z&auml;hler: Vergangenheit','Days Counters: Past'),
                                userObjectsPast,
                                true);

                        var tableNextDays =
                            createInnerDaysTable (
                                maxLines + (settings.JustTheFutureCountersOnStartpage.value ? 2 : 0),
                                settings.JustTheFutureCountersOnStartpage.value
                                ? trFunc ('Tage-Z&auml;hler','Days Counters')
                                : trFunc ('Zukunft','Future'),
                                userObjectsFuture,
                                false);

                        var inner = '<div class="c-1"><table width="100%" border="0" cellpadding="0" cellspacing="9" style="background-color:#1c1c1c">'+
                            '<tr>'+
                            (   settings.JustTheFutureCountersOnStartpage.value
                              ?   '<td valign="top" width="100%">'+tableNextDays+'</td>'
                              : ( '<td valign="top" width="48%">'+tablePastDays+'</td>'+
                                  '<td valign="top" width="52%">'+tableNextDays+'</td>'  )) +
                            '</tr></table>&nbsp;</div>';

                        var divRow = document.createElement ('div');
                        divRow.setAttribute ('class', 'row');
                        divRow.innerHTML = inner;

                        if (settings.ShowListOfDaysAtTopOfStartpage.value)
                        {
                            contentElem.innerHTML = divRow.outerHTML + contentElem.innerHTML;
                        }
                        else
                        {
                            contentElem.innerHTML = contentElem.innerHTML + divRow.outerHTML;
                        }
                    }
                    else
                    {
                        // show small placeholder symbol instead of the big widget
                        var actionsDivs = document.querySelectorAll ('div[class^="col c-4-3-1 right"]');
                        if (actionsDivs.length > 0)
                        {
                            var actionDiv = actionsDivs [0];
                            var imgCode = makeImgWithHintForEmptyOrHiddenDaysCounterWidget (
                                            trFunc ('Tagezähler-Widget ist ausgeblendet.',
                                                    'Days counter widget is hidden.'     ) +
                                            '\n\n' +
                                            trFunc (
                                                    'Du siehst das Tagezähler-Widget, wenn Du auf besuchten Sedcards einen Tage-Zähler aktiviert und dabei ein Datum eingetragen hast.',
                                                    'If you have activated a Days Counter when visiting a sedcard you will the days counter widget here.'
                                                    ),
                                            ' style="border:1px solid #666"' );
                            actionDiv.innerHTML = '<a href="http://www.model-kartei.de/u/'+ownID+'/?MKBeautifier_Marker">' +
                                                    imgCode +
                                                  '</a>' +
                                                  actionDiv.innerHTML;
                        }
                    }
                }
            }
            else
            {
                var startOfHRef = '';
                var sedcardFilter = '';
                if (typePos > 0)
                {
                    startOfHRef   = location.href.substring (0, typePos);
                    if (userType != '0')
                    {
                        sedcardFilter = 'sedcard='+userType;
                    }
                }
                else
                {
                    var endPos = location.href.indexOf('?');
                    if (endPos == -1)
                    {
                        endPos = location.href.length;
                    }
                    startOfHRef = location.href.substring (0, endPos);
                }

                var h2Elements = document.getElementsByTagName ('h2');
                if (h2Elements.length > 0)
                {
                    var kmFilterParameterSeparator = '&';
                    if (userType == '0')
                    {
                        kmFilterParameterSeparator = '?';
                    }
                    if (! kmFilterOff)
                    {
                        kmFilterParameter = 'kmFilter='+kmFilter.toString ();
                    }

                    var inH2 = h2Elements [0].innerHTML;
                    inH2 =
                        '<a style="text-decoration: none; font-size:22px; font-weight: normal; color:'+colorByTheme (kmFilterNear)
                        +'" href="'+startOfHRef+sedcardFilter+kmFilterParameterSeparator+'kmFilter='+settings.KmFilterNear.value+'" title="'+
                        trFunc ('Nur Bilder anzeigen bis zu '+settings.KmFilterNear.value.toString ()+' km Entfernung',
                                'Show images up to a maximum distance of '+settings.KmFilterNear.value.toString ()+' km only')
                        +'">'
                        +arrowByTheme (kmFilterNear, '&#8596;')
                        +'</a> '
                        +
                        '<a style="text-decoration: none; font-size:22px; font-weight: normal; color:'+colorByTheme (kmFilterNotTooFar)
                        +'" href="'+startOfHRef+sedcardFilter+kmFilterParameterSeparator+'kmFilter='+settings.KmFilterNotTooFar.value+'" title="'+
                        trFunc ('Nur Bilder anzeigen bis zu '+settings.KmFilterNotTooFar.value.toString ()+' km Entfernung',
                                'Show images up to a maximum distance of '+settings.KmFilterNotTooFar.value.toString ()+' km only')
                        +'">'
                        +arrowByTheme (kmFilterNotTooFar, '<b>&#8644;</b>')
                        +'</a> '
                        +
                        '<a style="text-decoration: none; font-size:22px; font-weight: normal; color:'+colorByTheme (kmFilterOff)
                        +'" href="'+startOfHRef+sedcardFilter+'" title="'+trFunc ('Zeige alle Fotos','Show all photos')+'">'
                        +arrowByTheme (kmFilterOff, '&#8622;')
                        +'</a>'
                        +
                        ' &nbsp; &nbsp;'+
                        inH2.replace(trFunc ('Bilduploads vom','Uploads from'),trFunc ('neu am','uploaded'));
                    h2Elements [0].innerHTML = inH2;
                }

                if (! kmFilterOff)
                {
                    var pagination = document.getElementsByClassName ('pagination');
                    if (pagination.length > 0)
                    {
                        var anchors = pagination [0].getElementsByTagName ('a');
                        for (var i = 0; i < anchors.length; i++)
                        {
                            var anchor = anchors [i];
                            var href = anchor.getAttribute ('href');
                            anchor.setAttribute ('href', href+'&'+kmFilterParameter); // separator is always '&' here
                        }
                    }
                }
            }

            commentElements = document.getElementsByClassName ('commentDesc');
            if (commentElements.length > 0)
            {
              var colorCodeForNote = isDarkTheme ? '; color:#FFDCA7':'';
              for (i = 0; i<commentElements.length; ++i)
              {
                var commentElement = commentElements [i];

                var userID   = getUserIDFromFirstAnchorInElement (commentElement);
                var infoLine = '<span title="'+noteUnknownInfoline+'" style="color:#fff"><big>&#8505;</big></span>';
                if (userHasStorageData (userID))
                {
                    var infoLineObject = new Object ();
                    createCompactInfoline (userID, 10, 12, true, infoLineObject, true, true, false, false, false, null);
                    infoLine = infoLineObject.text;
                }

                var newInner = findAndReplaceAll (commentElement.innerHTML, '  ', ' ');
                newInner = findAndReplaceAll (newInner, '....', '...');
                newInner = findAndReplaceAll (newInner, '...', '<small>&#8230;</small>');
                newInner = newInner.
                    replace ('<span class="row">','<span style="font-size:90%">').
                    replace ('<span class="col c-3-2">','<span class="col c-3-2" style="line-height:120%">').
                    replace ('<span class="col c-3-2-1 right fSmaller5"><i>','<span class="col c-3-2-1 right" style="font-size:95%"><i>').
                    replace ('<span class="commentText">','<span class="commentText" style="font-size:100%'+colorCodeForNote+'">')
                    .replace (                                                   '</span>\n <span class="col c-3-2-1 right',
                              '<br /><span style="float:right">'+infoLine+'</span></span>\n <span class="col c-3-2-1 right')
                    ;
                commentElement.innerHTML = newInner;
              }
            }


            var figures = document.getElementsByClassName ('photoPreview');
            processInfolineDependendElements (document,
                                              figures,
                                              getUserIDFromFigure,
                                              addDataToFigures);
        }



        // expects two (either 3-digits or 6-digits) hex color codes
        // (optionally with a leading '#')
        function averageOfColors (colA, colB)
        {
            var colorA = extendHexColorCode (colA);
            var colorB = extendHexColorCode (colB);
            var i      = 1;
            var red    = (hex2ToInt (colorA, i) + hex2ToInt (colorB, i)) / 2;
            i          = i+2;
            var green  = (hex2ToInt (colorA, i) + hex2ToInt (colorB, i)) / 2;
            i          = i+2;
            var blue   = (hex2ToInt (colorA, i) + hex2ToInt (colorB, i)) / 2;

            return '#' + intToHex2 (red) + intToHex2 (green) + intToHex2 (blue);
        }
        function extendHexColorCode (color)
        {
            var s = color;
            if (s.indexOf ('#') < 0)
            {
                s = '#'+s;
            }
            if (s.length == 7)
            {
                return s;
            }
            if (s.length == 4)
            {
                return s.substring (0,2)+'0'+s.substring (2,3)+'0'+s.substring (3,4)+'0';
            }
            return '#FFFFFF';
        }
        function hex2ToInt (color, iStart)
        {
            return parseInt (color.substring (iStart, iStart+2), 16);
        }
        function intToHex2 (value)
        {
            var s = value.toString (16).toUpperCase();
            var posDot = s.indexOf ('.');
            if (posDot > -1)
            {
                s = s.substring (0, posDot);  // just cut off the fraction, the value will be fine enough :)
            }
            return lPad (s, '0', 2);
        }
        function intToHexColor (value, leading0s)
        {
            var s = value.toString (16).toUpperCase();
            var posDot = s.indexOf ('.');
            if (posDot > -1)
            {
                s = s.substring (0, posDot);  // just cut off the fraction, the value will be fine enough :)
            }
            return '#'+leading0s+s;
        }



        function evaluateUserKm (userKmOrig, activeKmFilterIsNear, userFlagsObject, ret_object)
        {
            ret_object.isNear      = false;
            ret_object.isNotTooFar = false;

            if (userKmOrig === '-1' || ! userKmOrig)
            {
                ret_object.userKm           = '?';
                ret_object.userKmForTooltip = '?';
                ret_object.intKm            = 0;
                ret_object.hasKm            = false;
                ret_object.linkColor        = settings.InfoColor_Near.value;

                return;
            }

            var userKm = userKmOrig.replace ('.', ''); // get rid of the dot

            ret_object.userKmForTooltip = userKm+' km';

            ret_object.intKm = Number(userKm);

            ret_object.hasKm = (! Number.isNaN(ret_object.intKm));

            if (ret_object.hasKm)
            {
                if (ret_object.intKm <= settings.KmFilterNear.value)
                {
                    ret_object.isNear = true;
                }
                else if (ret_object.intKm <= settings.KmFilterNotTooFar.value)
                {
                    ret_object.isNotTooFar = true;
                }
            }

            if (ret_object.isNear)
            {
                ret_object.userKm = userKm+' &#8596;';
            }
            else if (ret_object.isNotTooFar)
            {
                ret_object.userKm = userKm+' <big>&#8644;</big>';
            }
            else
            {
                ret_object.userKm = userKm+' km';
            }

            ret_object.linkColor = settings.InfoColor_FarAway.value;

            if (   (! (userFlagsObject.hasFlagSad || userFlagsObject.hasFlagWarning || userFlagsObject.hasFlagIgnore))
                && (userFlagsObject.hasFlagHappy || settings.HighlightNamesWhenKmNearFilterActive.value || ! activeKmFilterIsNear))
            {
                if (userFlagsObject.hasFlagHappy ||
                    (ret_object.isNear && settings.HighlightNamesWhenNearOrNotTooFar.value  ) ||
                    (userFlagsObject.isFavorite && settings.HighlightFavoritesLikeNear.value) ||
                    (userFlagsObject.inNetwork  && settings.HighlightNetworkLikeNear.value  )
                   )
                {
                    ret_object.linkColor = settings.InfoColor_Near.value;
                }
                else if (ret_object.isNotTooFar && settings.HighlightNamesWhenNearOrNotTooFar.value)
                {
                    ret_object.linkColor = settings.InfoColor_NotTooFarAway.value; // averageOfColors (settings.InfoColor_Near.value, settings.InfoColor_FarAway.value);
                }
            }
        }


        function showJobsForUnknownUsersLeft (jobsLeftContainer, prefix)
        {
            var colorOfBlueHint = isDarkTheme ? '#BBF' : '#006';
            var colorInF5       = isDarkTheme ? '#006' : '#BBF';
            var toolTipForF5    = 'title="'+
            trFunc ('Anzeige der noch zu ladenden Teilnehmer-Informationen\n\nFalls der Wert sich mehr als 15 Sekunden lang nicht ändert,\nkannst Du mit der [F5]-Taste die Seite aktualisieren.',
                    'Number of user information to be retrieved.\n\nFeel free to refresh page by pressing [F5]\nif this value is unchanged for more that 15 seconds.')+'"';

            var startOfCounter = '&nbsp;<small ' + toolTipForF5 + ' style="font-family: Courier; color:' + colorOfBlueHint + '">&nbsp;'+trFunc ('fremd: ','unknown: ');
            //var endOfCounter   = '</small>&nbsp; <big ' + toolTipForF5 + ' style="'+shadowCodeForOutline (colorOfBlueHint)+' color:'+colorInF5+'">&nbsp;F5</big>'
            var endOfCounter   = '</small>&nbsp; '

            //alert (numUnknownUsersProcessed+' '+mapOfWaitingUserElementArrays.size);

            if (numUnknownUsersProcessed < mapOfWaitingUserElementArrays.size)
            {
                if (jobsLeftContainer != null)
                {
                    var newInner = jobsLeftContainer.innerHTML;
                    var posOfCounter = newInner.indexOf (startOfCounter);
                    if (posOfCounter > -1)
                    {
                        newInner = newInner.substring (0, posOfCounter);
                    }

                    jobsLeftContainer.innerHTML = newInner +
                        prefix +
                        startOfCounter +
                        (mapOfWaitingUserElementArrays.size - numUnknownUsersProcessed).toString () +
                        endOfCounter;
                }
            }
            else
            {
                // all of the map's entries have been processed, so we now remove empty space (if any)

                if (jobsLeftContainer != null)
                {
                    var posOfCounter = jobsLeftContainer.innerHTML.indexOf (prefix+startOfCounter);
                    if (posOfCounter > -1)
                    {
                        jobsLeftContainer.innerHTML = jobsLeftContainer.innerHTML.substring (0, posOfCounter);
                    }
                }
            }
        }




        function addDataToFigures (waitingDocument, userID)
        {
            var arrayOfFigures = mapOfWaitingUserElementArrays.get (userID);
            if (arrayOfFigures != null)
            {
              var userName = getUserNameFromFigure (arrayOfFigures [0]);

              var isPageForMultipleSedcardTypes =
                isPhotosMainPage ||
                isSelectionPage ||
                isAwesomePage ||
                isDiscussionPage ||
                isBestOfList ||
                isMyStartPage ||
                isTaggedPhotosPage ||
                isPhotoFavoritesPage ||
                isKeywordPhotosPage ||
                ( (isNewPhotosPage || isDiscussionPage) && (location.href.indexOf('sedcard=') <  0) ) ||
                ( (isPhotosOfPhotographersPage || isPhotosOfVisasPage || isPhotosOfBodypaintersPage) && languageIsGerman () );

              var kmFilter             = getKmFilterFromHref (location.href);
              var kmFilterOff          = (kmFilter == kmFilterMAXVALUE);
              var activeKmFilterIsNear = (kmFilter <= settings.KmFilterNear.value) && !kmFilterOff;

              var userStorageObject = getUserStorageObject (userID);

              var userFavorite = isPhotosOfMyFavoritesPage ? false : (getUserStorageValue (userID, userStorageToken.FAVORITE, userStorageObject) == '1');
              var userNetwork  = isNetworkPage             ? false : (getUserStorageValue (userID, userStorageToken.NETWORK , userStorageObject) == '1');

              var userFlagsObject = new Object ();
              getUserFlagsObject (userID, userFavorite, userNetwork, 14,
                                  settings.InfoColor_Near.value,
                                  false, userFlagsObject, false, false, false, false, '', userStorageObject);
              var userFlagsText   = userFlagsObject.text;
              var userFlagsFound  = userFlagsObject.found;
              var userImportance  = userFlagsObject.importance;

              var userIsIgnoringMe   = userFlagsObject.isIgnoringMe;
              var userInSilentIgnore = userFlagsObject.hasFlagIgnore;
              var userIgnored        = userInSilentIgnore;
              var markThisUser       = (hCheck && userFlagsObject.ValueCheckOK == 0);

              /* not needed here:
              if (userFlagsFound && ! isDarkTheme)
              {
                  userFlagsText = '<span style="background-color:#222">&nbsp;' + userFlagsText + '&nbsp;</span>';
              }
              */

              var userNote    = getUserStorageValue (userID, userStorageToken.NOTE, userStorageObject);
              var userHasNote = (userNote != null && userNote != '');

              var userKmOrig  = getUserStorageValue (userID, userStorageToken.KM, userStorageObject);

              var kmEvaluationObject = new Object ();
              evaluateUserKm (userKmOrig,
                              activeKmFilterIsNear,
                              userFlagsObject,
                              kmEvaluationObject);

              var userKm           = kmEvaluationObject.userKm;
              var hasKm            = kmEvaluationObject.hasKm;
              var intKm            = kmEvaluationObject.intKm;
              var userKmForTooltip = kmEvaluationObject.userKmForTooltip;
              //var isNear         = kmEvaluationObject.isNear;
              //var isNotTooFar    = kmEvaluationObject.isNotTooFar;

              if (hasKm && (! kmFilterOff) && kmFilter > 0 && kmFilter < intKm)
              {
                  userIgnored = true;
              }

              var linkColor = userIgnored ? '#505050' : (markThisUser ? '#000':kmEvaluationObject.linkColor);
              var bgColor   = markThisUser ? '#60ff30':'#101010';

              var noteMarker = '';

              if (userHasNote)
              {
                  if (userIgnored)
                  {
                      noteMarker = '&#9785;';
                  }
                  else
                  {
                      noteMarker = '<span style="'+shadowCodeForOutline (linkColor)+' color:#000">&nbsp;<big>N</big>&nbsp;</span>';
                  }
              }

              var userKmAndNote = hasKm ? userKm : (userIsIgnoringMe ? '' : makeSpanWithBigI (userID));

              if (noteMarker != '')
              {
                  if (hasKm && intKm < 1000)
                  {
                      userKmAndNote = userKmAndNote + '&nbsp; ';
                  }
                  userKmAndNote = userKmAndNote + noteMarker;
              }


              var toolTip = '';

              if (userHasNote)
              {
                  toolTip = '  '+userNote+'  ';
              }
              if (! hasKm && ! userIsIgnoringMe)
              {
                  if (userHasNote)
                  {
                      toolTip = toolTip + '\n\n';
                  }
                  toolTip = toolTip + makeToolTipHintYouMayEditKm (userName, userID);
              }


              var numberOfIgnoredFiguresDueToKm     = 0;
              var numberOfIgnoredFiguresDueToIgnore = 0;
              var numberOfIgnoredFiguresDueToMaleModel = 0;


              arrayOfFigures.forEach (function (figure, index, array)
              {
                // Note: We need to detect the user's sedcard type from the figure
                //       because the user might more than one sedcard type.
                var userTypeName = getUserTypeNameFromFigure (figure);
                var userType     = userTypeFromNameInURL     (userTypeName);
                var userIsMaleModel = false;
//console.log(userTypeName)

                if (userTypeName == 'malemodel')
                {
                    // we just show "Model" instead of "malemodel"
                    userTypeName = 'Model';
                }

                if (settings.RemoveFiguresOfMaleModels.value && (figure.innerHTML.indexOf ('sedcards/malemodel') > -1))
                {
                  // we hide all malemodels:
                  //figure.innerHTML = '';
                  userIgnored = true;
                  userIsMaleModel = true;
                }

                var userTypeCAPS = userTypeName.toUpperCase  ();

                if ((settings.RemoveFiguresIfUserIgnored.value && userIgnored)
                    || (hMPs && userType == '2' && userTypeCAPS.indexOf ('IN') != userTypeCAPS.length-2))
                {
                    figure.innerHTML = '';
                    figure.setAttribute ('class', 'photoPreview'); // removes the 'newPhoto' frame, if any
                    if (userInSilentIgnore)
                    {
                        numberOfIgnoredFiguresDueToIgnore++;
                    }
                    else
                    {
                        if (userIsMaleModel)
                        {
                            numberOfIgnoredFiguresDueToMaleModel++;
                        }
                        else
                        {
                            numberOfIgnoredFiguresDueToKm++;
                        }
                    }
                }
                else
                {
                    if (settings.RemoveFramesFromNewFotos.value)
                    {
                        figure.setAttribute ('class', 'photoPreview'); // removes the 'newPhoto' frame, if any
                    }

                    //figure.setAttribute ('importance', userImportance);

                    var figTexts = figure.getElementsByClassName ('figText');
                    if (figTexts.length > 0)
                    {
                        var figText = figTexts [0];

                        var anchors = figText.getElementsByTagName ('a');
                        if (anchors.length > 0)
                        {
                            var anchor = anchors [0];

                            var sedcardTypeHint = trFunc ('(veröffentlicht auf ','(published on ')
                                    +userTypeName+trFunc ('-Sedcard)',' sedcard)');

                            anchor.setAttribute ('style', 'font-size:12px; font-weight: normal; color:'+linkColor+'; background-color:'+bgColor+';');
                            if (toolTip.length > 0)
                            {
                                anchor.setAttribute ('title', sedcardTypeHint+'\n\n'+toolTip);
                            }
                            else
                            {
                                anchor.setAttribute ('title', sedcardTypeHint);
                            }

                            var spans = anchor.getElementsByTagName ('span');
                            if (spans.length > 0)
                            {
                                var spanInfoline = spans [spans.length-1];

                                spanInfoline.innerHTML = userFlagsText+' &nbsp; '+userKmAndNote;

                                var spanUser = spans [0];
                                var spansStatus = spanUser.getElementsByClassName ('userStatus light');
                                if (spansStatus.length > 0)
                                {
                                    var spanStatus = spansStatus [0];
                                    if (settings.RemoveUserStatusLightFromPhotoLinks.value)
                                    {
                                        spanStatus.remove ();
                                    }
                                    else if (settings.BeautifyUserStatusLightForPhotoLinks.value)
                                    {
                                        if (spanStatus.innerHTML.indexOf ('online1') > -1)
                                        {
                                            // using tiny 14 px font here:
                                            spanStatus.innerHTML = '<span style="font-size:14px; font-weight: normal; color:#0b0; background-color:#101010">&#8226;</span>';
                                        }
                                        else
                                        {
                                            // using slightly bigger font to get the optical illusion as if both 'lamps' had same size:
                                            spanStatus.innerHTML = '<span style="font-size:16px; font-weight: normal; color:#282828; background-color:#101010">&#8226;</span>';
                                        }
                                    }
                                }
                            }
                        }

                        if (isPageForMultipleSedcardTypes && settings.AddColorBarAsSedcardTypeIndicator.value)
                        {
                            var table = waitingDocument.createElement("table");

                            table.setAttribute ('border', '0');
                            table.setAttribute ('cellspacing', '0');
                            table.setAttribute ('cellpadding', '0');

                            var tr  = waitingDocument.createElement("tr");
                            var td1 = waitingDocument.createElement("td");
                            var td2 = waitingDocument.createElement("td");

                            td1.setAttribute ('bgcolor', colorForUserType (userType));
                            td1.setAttribute ('title',   userTypeCAPS);

                            if ((userType == '2' || userType == '3' || userType == '11') && languageIsGerman () )
                            {
                                td1.innerHTML = '<table border="0" cellpadding="0" cellspacing="0">'+
                                                '<tr><td>&nbsp;</td></tr>'+
                                                '<tr><td bgcolor="'+
                                                         (  (userTypeCAPS == 'FOTOGRAFIN' ||
                                                             userTypeCAPS == 'VISAGISTIN' ||
                                                             userTypeCAPS == 'BODYPAINTERIN'
                                                            )
                                                          ? colorForUserType ( '1')
                                                          : colorForUserType ('99')
                                                         )
                                                         +'">&nbsp;</td></tr>'+
                                                '</table>';
                            }
                            else
                            {
                                td1.innerHTML = '&nbsp;';
                            }

                            figure.appendChild (table);
                            table.appendChild  (tr);
                            tr.appendChild     (td1);
                            tr.appendChild     (td2);

                            td2.appendChild (figText);
                        }
                    }
                    else
                    {
                      // There is no "extended" image preview?
                      // Might be a Image Favorites page!
                      if (isPhotoFavoritesPage)
                      {
                        var figCaptions = figure.getElementsByClassName ('pAction');
                        if (figCaptions.length > 0)
                        {
                          //
                          // extra "DEL" links in the image favorites list pages
                          //
                          var imageID = figure.getAttribute ('id');
                          if (imageID.indexOf ('image') == 0)
                          {
                            imageID = imageID.substring (5);
                            var delFavImgLinkCode = '<a href="javascript:;" onclick="deFavr(\'photo\', '+imageID+', \'imageFav'+imageID+'\', \'image'+imageID+'\', \'deFav\');">'+
                                    '<big title="'+
                                    trFunc ('Klicke hier, wenn das Bild nicht länger in der Favoriten haben möchtest.',
                                            'Click to remove this image from your list of favorite images.') +
                                    '" style="color:#f03; background-color:#000">&nbsp;&#x2620;&nbsp;</big>'+
                                    '</a>';

                            var figCaption = figCaptions [0];
                            figCaption.innerHTML = figCaption.innerHTML + '&nbsp; &nbsp; ' + delFavImgLinkCode;
                          }
                        }
                      }
                    }
                }

              });

              if (numberOfIgnoredFiguresDueToIgnore > 0)
              {
                  toolTipListOfIgnoredUsersPictures = toolTipListOfIgnoredUsersPictures
                  + userName
                  + '  ('
                  + numberOfIgnoredFiguresDueToIgnore.toString ()
                  + ')      ';
                  totalNumberOfIgnoredFiguresDueToIgnore += numberOfIgnoredFiguresDueToIgnore;
              }
              else if (numberOfIgnoredFiguresDueToKm > 0)
              {
                  toolTipListOfTooFarUsersPictures = toolTipListOfTooFarUsersPictures
                    + userKmForTooltip
                    + ': '
                    + userName
                    + '  ('
                    + numberOfIgnoredFiguresDueToKm.toString ()
                    + ')      ';
                  totalNumberOfIgnoredFiguresDueToKm += numberOfIgnoredFiguresDueToKm;
              }
              else if (numberOfIgnoredFiguresDueToMaleModel > 0)
              {
                  toolTipListOfMaleModelPictures = toolTipListOfMaleModelPictures
                  + userName
                  + '  ('
                  + numberOfIgnoredFiguresDueToMaleModel.toString ()
                  + ')      ';
                  totalNumberOfIgnoredFiguresDueToMaleModel += numberOfIgnoredFiguresDueToMaleModel;
              }


                numUnknownUsersProcessed++;
                var jobsLeftContainer = null;
                {
                    var datePickers = waitingDocument.getElementsByClassName ('counter black');
                    if (datePickers.length == 0)
                    {
                        datePickers = waitingDocument.getElementsByClassName ('counter white');
                    }
                    if (datePickers.length > 0)
                    {
                        jobsLeftContainer = datePickers [0].parentNode;
                        showJobsForUnknownUsersLeft (jobsLeftContainer, '');
                    }
                }


                if (numUnknownUsersProcessed >= mapOfWaitingUserElementArrays.size)
                {
                    // all of the map's entries have been processed, so we now remove empty space (if any)

                    var figures = waitingDocument.getElementsByClassName ('photoPreview');

                    var figuresRemoved = 0;
                    for (i = figures.length-1; i>-1; i=i-1)
                    {
                        var figure = figures [i];

                        if (figure.innerHTML.length == 0)
                        {
                            figure.remove ();
                            figuresRemoved++;
                        }
                    }

                    if (figuresRemoved > 0 && jobsLeftContainer != null)
                    {
                        var colorOfHint = isDarkTheme ? '#777' : '#666';
                        if (toolTipListOfTooFarUsersPictures.length > 0)
                        {
                            toolTipListOfTooFarUsersPictures = trFunc ('Entfernung zu groß','distanced exceeded')
                                +'  ('+totalNumberOfIgnoredFiguresDueToKm.toString ()+')\n\n' + toolTipListOfTooFarUsersPictures;
                            if (toolTipListOfIgnoredUsersPictures.length > 0)
                            {
                                toolTipListOfTooFarUsersPictures = toolTipListOfTooFarUsersPictures+'\n\n';
                            }
                        }
                        if (toolTipListOfIgnoredUsersPictures.length > 0)
                        {
                            toolTipListOfIgnoredUsersPictures = trFunc ('Teilnehmer ignoriert','users ignored')
                                +'  ('+totalNumberOfIgnoredFiguresDueToIgnore.toString ()+')\n\n' + toolTipListOfIgnoredUsersPictures;
                        }
                        if (toolTipListOfMaleModelPictures.length > 0)
                        {
                            toolTipListOfMaleModelPictures = trFunc ('MaleModel ignoriert','users ignored')
                                +'  ('+totalNumberOfIgnoredFiguresDueToMaleModel.toString ()+')\n\n' + toolTipListOfMaleModelPictures;
                        }

                        var justOne = (figuresRemoved == 1);
                        var toolTipForHidden =
                              'title="'+trFunc ('Es wurde'+(justOne ? '' : 'n'),'hidden images: ')+' '+figuresRemoved.toString ()+
                                        trFunc (' Bild'+(justOne ? '' : 'er')+' ausgeblendet:  ','')+'\n\n'
                            + toolTipListOfTooFarUsersPictures
                            + toolTipListOfIgnoredUsersPictures
                            + '\n\n'
                            + toolTipListOfMaleModelPictures
                            + '\n "';

                        jobsLeftContainer.innerHTML = jobsLeftContainer.innerHTML + ' &nbsp;<small '+toolTipForHidden+' style="color:' + colorOfHint + '">&nbsp;'
                            + trFunc ('verborgen: ','hidden: ')
                            + figuresRemoved.toString ()
                            + '&nbsp;</small>';
                        if (hMPs && figuresRemoved > 19)
                        {
                            // there are just one or two rows of images visible
                            // so we show a copy of the pagination above the first row
                            var paginations = waitingDocument.getElementsByClassName ('pagination');
                            if (paginations.length > 0)
                            {
                                var lViews = waitingDocument.getElementsByClassName ('grid lView');
                                if (lViews.length > 0)
                                {
                                    var lView      = lViews [0];
                                    var pagination = paginations [0];
                                    if (lView.parentNode == pagination.parentNode)
                                    {
                                        var extraPaginationElement = waitingDocument.createElement("div");
                                        extraPaginationElement.setAttribute ('class', 'pagination');
                                        extraPaginationElement.innerHTML = pagination.innerHTML;

                                        lView.parentNode.insertBefore (extraPaginationElement, lView);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }


        function getUserIDFromFigure (figure)
        {
            var photoLink = getPhotoLink (figure);

            var imgs = photoLink.getElementsByTagName ('img');
            if (imgs.length > 0)
            {
                var img = imgs [0];
                var user = img.getAttribute ('src');
                var idx = user.indexOf ('.jpg');
                if (idx < 0)
                {
                    idx = user.indexOf ('.png');
                }
                user = user.substring (0,                        idx);
                user = user.substring (0,                        user.lastIndexOf ('/'));
                user = user.substring (user.lastIndexOf ('/')+1);
                //alert ('user: '+user);

                return user;
            }
            return '';
        }


        function getUserTypeNameFromFigure (figure)
        {
            /*..
             * <div class="figText">
             *   <a href="http://www.model-kartei.de/sedcards/malemodel/12345/the_name/">
             *     <span class="user">
             *       <span class="userStatus light">
             *         <span class="online1">
             *           <span></span>
             *         </span>
             *       </span>the_name
             *     </span>
             *     <span>Model</span>
             *   </a>
             * </div>
             *</figure>
             */
            var figTexts = figure.getElementsByClassName ('figText');
            if (figTexts.length > 0)
            {
                var anchors = figTexts [0].getElementsByTagName ('a');

                // We take the user type names from the visible text
                // IF the name in the href is NOT "malemodel".
                // If "malemodel" we just return that, because
                // when MKBeautifier not active the visible name for
                // both, female and male model, would just be "Model",
                // so looking for THAT name would result in us using
                // the wrong color for that small vertical sedcard type indicator.

                if (anchors.length > 0)
                {
                    var anchor = anchors [0];
                    if (    (anchor.getAttribute ('href').indexOf ('sedcards/malemodel'  ) > -1)
                         || (anchor.getAttribute ('href').indexOf ('portfolios/malemodel') > -1))
                    {
                        return 'malemodel';
                    }

                    var spans = anchors [0].getElementsByTagName ('span');

                    if (spans.length > 0)
                    {
                        var span     = spans [spans.length-1];
                        var typeName = span.innerHTML;
                        if (typeName.length > 0)
                        {
                            return typeName;
                        }
                    }
                }
            }
            return '?';
        }


        function getUserNameFromUListFigure (figure)
        {
            var figTexts = figure.getElementsByClassName ('uDesc');
            if (figTexts.length > 0)
            {
                var userSpans = figTexts [0].getElementsByClassName ('block');

                if (userSpans.length > 0)
                {
                    var txt = userSpans [0].innerHTML;
                    var pos = txt.lastIndexOf ('>');
                    if (pos < 0)
                    {
                        return txt;
                    }
                    if (pos < txt.length-1)
                    {
                        return txt.substring (pos+1);
                    }
                }
            }
            return '?';
        }


        function getUserNameFromFigure (figure)
        {
            var figTexts = figure.getElementsByClassName ('figText');
            if (figTexts.length > 0)
            {
                var userSpans = figTexts [0].getElementsByClassName ('user');

                if (userSpans.length > 0)
                {
                    var txt = userSpans [0].innerHTML;
                    var pos = txt.lastIndexOf ('>');
                    if (pos < 0)
                    {
                        return txt;
                    }
                    if (pos < txt.length-1)
                    {
                        return txt.substring (pos+1);
                    }
                }
            }
            return '?';
        }


        function getPhotoLink (figure)
        {
            var photoLinks = figure.getElementsByClassName ('photoLink');
            if (photoLinks.length > 0)
            {
                return photoLinks [0];
            }
            return null;
        }




        //
        // process PN list rows or single PN thread pages
        //
        var urlTokenForPNs    = 'model-kartei.de/pn/';
        var idxUrlTokenForPNs = location.href.indexOf(urlTokenForPNs);
        var isPNListPage = (idxUrlTokenForPNs > -1);

        if (isPNListPage)
        {
            var subToken = location.href.substring (idxUrlTokenForPNs + urlTokenForPNs.length);
            var posSlash = subToken.indexOf ('/');
            if (posSlash > -1)
            {
                subToken = subToken.substring (0, posSlash);
            }
            var isThreadOfPNs = false;
            var isListOfPNs   = (subToken.length == 0);   // empty subToken means mail PNs link: 'http://www.model-kartei.de/pn/'
            if (! isListOfPNs)
            {
                var intValue  = parseInt (subToken, 10);  // subToken cound be either an integer thread ID, or a string: 'unread', 'folders', ..
                if (Number.isNaN (intValue))
                {
                    isListOfPNs = true;
                }
                else
                {
                    isThreadOfPNs = true;
                }
            }

            if (isThreadOfPNs)
            {
                if (settings.BeautifyPNTexts.value && isDarkTheme)
                {
                    var colorForUserName = settings.DarkThemeColorForPNs_UserNames.value;
                    var colorForContent  = settings.DarkThemeColorForPNs_Content.value;

                    var threadIitles = document.getElementsByTagName ('h1');
                    if (threadIitles.length > 0)
                    {
                        var anchors = threadIitles [0].getElementsByTagName ('a');
                        if (anchors.length > 0)
                        {
                            var anchor = anchors [0];
                            anchor.setAttribute ('style', 'font-style: italic;color:'+colorForContent);
                        }
                    }

                    var mailContents = document.getElementsByClassName ('mailContent');

                    for (var i = 0; i < mailContents.length; i++)
                    {
                        var mailContent = mailContents [i];
                        var anchors = mailContent.getElementsByTagName ('a');
                        if (anchors.length > 0)
                        {
                            anchors [0].setAttribute ('style', 'font-size:95%; text-decoration:none; color:'+colorForUserName);
                        }
                        var paras = mailContent.getElementsByTagName ('p');
                        if (paras.length > 0)
                        {
                            paras [0].setAttribute ('style', 'color:'+colorForContent);
                        }
                    }
                }
                processAllMiniUserlistsInDocument (document);
            }
            else if (isListOfPNs)
            {
                var elementsForPN = document.querySelectorAll ('div[class^="lList user sedcard"]');
                processInfolineDependendElements (document,
                                                  elementsForPN,
                                                  getUserIDFromFirstAnchorInElement,
                                                  addDataToElementsInListOfPNs);
            }
        }



        function processAllMiniUserlistsInDocument (theDocument)
        {
            var allLines = new Array ();
            var miniUserlists = theDocument.getElementsByClassName ('miniUserlist');
            for (var i = 0; i < miniUserlists.length; i++)
            {
                var miniUserlist = miniUserlists [i];

                var lines = miniUserlist.getElementsByTagName ('li');
                for (var i2 = 0; i2 < lines.length; i2++)
                {
                    allLines.push (lines [i2]);
                }
            }
            processInfolineDependendElements (theDocument,
                                              allLines,
                                              getUserIDFromFirstAnchorInElement,
                                              addDataToLinesOfMiniUserlists);
        }


        function getUserIDFromFirstAnchorInElement (elementWithAnchors)
        {
            var anchors = elementWithAnchors.getElementsByTagName ('a');
            if (anchors.length > 0)
            {
                return getUserIDFromHRefToSedcard (anchors [0].getAttribute ('href'));
            }
            return '';
        }


        function getUserTypeNameFromFirstAnchorInElement (elementWithAnchors)
        {
            var anchors = elementWithAnchors.getElementsByTagName ('a');
            if (anchors.length > 0)
            {
                return getUserTypeNameFromHRefToSedcard (anchors [0].getAttribute ('href'));
            }
            return 'u'; // that might work kind-of, even if wrong  :))
        }


        function addDataToLinesOfMiniUserlists (waitingDocument, userID)
        {
            if (mapOfWaitingUserElementArrays.has (userID))
            {
                var infoLineObject = new Object ();
                createCompactInfoline (userID, 12, 14, true, infoLineObject, true, true, false, false, false, null);
                var infoLine = infoLineObject.text;

                var arrayOfMiniUserlistLines = mapOfWaitingUserElementArrays.get (userID);
                arrayOfMiniUserlistLines.forEach (function (line, index, array)
                {
                    var anchors = line.getElementsByTagName ('a');
                    if (anchors.length > 0)
                    {
                        var anchor = anchors [0];
                        anchor.innerHTML =
                            '<table border="0" width="100%" cellpadding="0" cellspacing="0"><tr>'+
                                '<td>' + anchor.innerHTML + '</td><td align="right"> ' + infoLine + '</td>'+
                            '</tr></table>';
                    }
                });
            }
        }


        function addDataToElementsInCondensedUserlist (waitingDocument, userID)
        {
            if (mapOfWaitingUserElementArrays.has (userID))
            {
                var maxLenOfName   = 10;
                var infoLineObject = new Object ();
                createCompactInfoline (userID, 12, 14, true, infoLineObject, true, true, false, false, false, null);
                var infoLine       = infoLineObject.text;
                var isSilentIgnore = infoLineObject.hasFlagIgnore;

                var arrayOfCondensedUserlistLines = mapOfWaitingUserElementArrays.get (userID);
                arrayOfCondensedUserlistLines.forEach (function (line, index, array)
                {
                    var userDescSpans = line.getElementsByClassName ('userDesc');
                    if (userDescSpans.length > 0)
                    {
                        var userDescSpan = userDescSpans [0];
                        if (isSilentIgnore)
                        {
                            var nameElements = userDescSpan.getElementsByClassName ('uName');
                            if (nameElements.length > 0)
                            {
                                var nameElement  = nameElements [0];
                                nameElement.innerHTML = '<strike>' + nameElement.innerHTML + '</strike>';
                            }
                        }
                        var infoElement = waitingDocument.createElement("span");
                        infoElement.innerHTML = '<table width=100%><tr><td align=right>'+infoLine+'</td></tr></table>';
                        userDescSpan.appendChild (infoElement);
                    }
                });
            }
        }


        function addDataToElementsInListOfPNs (waitingDocument, userID)
        {
            if (mapOfWaitingUserElementArrays.has (userID))
            {
                var infoLineObject   = new Object ();
                createCompactInfoline (userID, 14, 14, false, infoLineObject, true, true, false, false, false, null);
                var infoLine         = infoLineObject.text;
                var isSilentIgnore   = infoLineObject.hasFlagIgnore;
                var isHighImportance = infoLineObject.hasFlagHappy;
                var highlightTitle   = settings.HighlightPNTitleIfUserHasSmiley.value && isHighImportance;
                var hideTitle        = settings.HidePNTitleIfUserIgnored.value && isSilentIgnore;
                var arrayOfElementsForPN = mapOfWaitingUserElementArrays.get (userID);
                arrayOfElementsForPN.forEach (function (elementForPN, index, array)
                {
                    var beautySpanTitle    = '';
                    var beautySpanClose    = '';
                    if (settings.BeautifyPNTexts.value)
                    {
                        var spanBase = '<span style="';
                        if (! isSilentIgnore)
                        {
                            spanBase = spanBase + 'font-style: italic; ';
                        }
                        var spanEnd  = '">';
                        beautySpanTitle    = spanBase + 'font-weight: normal' + spanEnd;
                        beautySpanClose    = '</span>';
                    }

                    var userStatusElements = elementForPN.getElementsByClassName ('userStatus light');
                    var userStatusCode = '';
                    if (userStatusElements.length > 0)
                    {
                        userStatusCode = userStatusElements [0].outerHTML;
                        userStatusElements [0].outerHTML = '';
                    }

                    var specialBeautyingForDarkTheme = isSilentIgnore || (settings.BeautifyPNTexts.value && isDarkTheme);
                    var darkBackgroundForHighlighting  = '#ffc55e';//'#566e68';
                    var lightBackgroundForHighlighting = '#ffc55e';//'#ffc56d';
                    var colorForIgnored = '#878787';
                    var colorForUserName
                        = isSilentIgnore
                        ? colorForIgnored
                        : settings.DarkThemeColorForPNs_UserNames.value;
                    var colorForTitle
                        = isSilentIgnore
                        ? colorForIgnored
                        : (highlightTitle ? '#000' : settings.DarkThemeColorForPNs_Content.value);

                    var lTitleElements = elementForPN.getElementsByClassName ('lTitle');
                    if (lTitleElements.length > 0)
                    {
                        var lTitleElement = lTitleElements [0];
                        var spanElements = lTitleElement.getElementsByTagName ('span');
                        if (spanElements.length > 0)
                        {
                            var spanElement  = spanElements [0];
                            if (specialBeautyingForDarkTheme)
                            {
                                lTitleElement.setAttribute ('style', 'color:'+colorForTitle+
                                                                    (   highlightTitle
                                                                      ? '; border-radius: 2px; border: 2px solid '+darkBackgroundForHighlighting+'; background-color:' +darkBackgroundForHighlighting
                                                                      : '' ) );
                            }
                            else if (highlightTitle)
                            {
                                lTitleElement.setAttribute ('style', 'color:#000; background-color:'+
                                    (isDarkTheme ? darkBackgroundForHighlighting : lightBackgroundForHighlighting));
                            }
                            if (highlightTitle)
                                {
                                var lCounterElements = elementForPN.getElementsByClassName ('counter');
                                if (lCounterElements.length > 0)
                                {
                                    var lCounterElement = lCounterElements [0];
                                    lCounterElement.setAttribute ('style', 'color:#000; background-color:#b15300');//+
                                        //(isDarkTheme ? darkBackgroundForHighlighting : lightBackgroundForHighlighting));
                                }
                            }

                            if (isSilentIgnore)
                            {
                                spanElement.setAttribute ('title', spanElement.innerHTML);
                            }
                            spanElement.innerHTML = beautySpanTitle
                                + (hideTitle ? '&#x258C;'+trFunc ('Titel ausgeblendet','title hidden')+'&#x2590;&nbsp;': spanElement.innerHTML)
                                + beautySpanClose;
                        }
                    }

                    var userNameElements = elementForPN.getElementsByClassName ('user');
                    if (userNameElements.length > 0)
                    {
                        var userNameElement = userNameElements [0];
                        userNameElement.innerHTML = '<table border="0" width="100%" cellpadding="0" cellspacing="0"><tr><td'
                            + (specialBeautyingForDarkTheme ? (' style="color:'+colorForUserName+'"') : '')
                            + '>'
                            + userStatusCode+' ' + userNameElement.innerHTML + '</td><td align="right"> ' + infoLine + '</td></tr></table>';
                    }
                    /*
                    var delElements = elementForPN.getElementsByClassName ('lDelete inactive');
                    if (delElements.length > 0)
                    {
                        var editElements = elementForPN.getElementsByClassName ('lEdit');
                        if (editElements.length > 0)
                        {
                            var dataID = editElements [0].getAttribute ('data-id');
                            var delElement = delElements [0];
                            delElement.setAttribute ('class', 'lDelete');
                            delElement.setAttribute ('title', 'Löschen');
                            delElement.innerHTML = '<a class="pnDeleteLink tooltip" data-id="'+dataID+'|0" href="javascript:;" title="Löschen"><span></span></a>';
                        }
                    }
                    */
                });
            }
        }


        function getUserIDFromHRefToSedcard (href)
        {
            var userID = '';

            var token = 'model-kartei.de/sedcards/';
            var idx = href.indexOf (token);
            if (idx < 0)
            {
                token = 'model-kartei.de/portfolios/';
                idx = href.indexOf (token);
            }
            if (idx > -1)
            {
                userID = href.substring (idx+token.length+2);
                userID = userID.substring (userID.indexOf ('/')+1);
                userID = userID.substring (0, userID.indexOf ('/'));
            }
            else
            {
                token = 'model-kartei.de/u/';
                idx = href.indexOf (token);
                userID = href.substring (idx+token.length);
                userID = userID.substring (0, userID.indexOf ('/'));
            }

            var intValue = parseInt (userID, 10);
            if ( ! Number.isNaN (intValue))
            {
                return userID;
            }
            return '';
        }


        function getUserTypeNameFromHRefToSedcard (href)
        {
            if (href.indexOf ('model-kartei.de/u/') > -1)
            {
                return 'u';
            }

            var token = 'model-kartei.de/sedcards/';
            var idx = href.indexOf (token);
            if (idx < 0)
            {
                token = 'model-kartei.de/portfolios/';
                idx = href.indexOf (token);
            }

            if (idx > -1)
            {
                var typeName = href.substring (href.indexOf (token) + token.length);
                typeName = typeName.substring (0, typeName.indexOf ('/'));

                return typeName;
            }
            return 'u';
        }


        function createCompactInfoline (userID, fontSizeText, fontSizeFlags, veryCompact, ret_infoLineObject,
                                        flagFavorite, showN, createInfoLineAsTDs, showDaysAsImg, daysCounterFirst,
                                        userStorageObjectOrig)
        {
            var spanBackground = isDarkTheme ? '' : '; background-color:#222';

            var theStyle = 'style="vertical-align:top; font-weight: normal; font-size: '
                            + fontSizeText + 'px; color:'
                            + linkColor + spanBackground + '"';

            var userFlagsObject = new Object ();

            if (userID == ownID)
            {
                getUserFlagsObject (userID, false, false, fontSizeFlags, settings.InfoColor_Near.value, veryCompact,
                                    userFlagsObject, createInfoLineAsTDs, showDaysAsImg, ! showDaysAsImg, daysCounterFirst, theStyle, null);
                ret_infoLineObject.text             = '';
                ret_infoLineObject.hasFlagHappy     = false;
                ret_infoLineObject.hasFlagIgnore    = false;
                ret_infoLineObject.userIsIgnoringMe = false;
                ret_infoLineObject.userFlagsObject  = userFlagsObject;
                return;
            }

            var userStorageObject = (userStorageObjectOrig == null) ? getUserStorageObject (userID) : userStorageObjectOrig;

            var userFavorite = flagFavorite && getUserStorageValue (userID, userStorageToken.FAVORITE, userStorageObject) == '1';
            var userNetwork  =                 getUserStorageValue (userID, userStorageToken.NETWORK , userStorageObject) == '1';
            var userNote     =                 getUserStorageValue (userID, userStorageToken.NOTE    , userStorageObject);
            var userKmOrig   =                 getUserStorageValue (userID, userStorageToken.KM      , userStorageObject);

            getUserFlagsObject (userID, userFavorite, userNetwork, fontSizeFlags, settings.InfoColor_Near.value, veryCompact,
                                userFlagsObject, createInfoLineAsTDs, showDaysAsImg, ! showDaysAsImg, daysCounterFirst, theStyle, userStorageObject);
            var userFlagsText   = userFlagsObject.text;
            var userFlagsFound  = userFlagsObject.found;

            var userIsIgnoringMe   = userFlagsObject.isIgnoringMe;
            var userHasFlagHappy   = userFlagsObject.hasFlagHappy;
            var userInSilentIgnore = userFlagsObject.hasFlagIgnore;
            var userIgnored        = userInSilentIgnore;


            var kmEvaluationObject = new Object ();
            evaluateUserKm (userKmOrig,
                            activeKmFilterIsNear,
                            userFlagsObject,
                            kmEvaluationObject);

            var userKm           = kmEvaluationObject.userKm;
            var hasKm            = kmEvaluationObject.hasKm;
            var intKm            = kmEvaluationObject.intKm;
            var userKmForTooltip = kmEvaluationObject.userKmForTooltip;

            var linkColor = /*userIgnored ? '#505050' : */kmEvaluationObject.linkColor;

            var userHasNote = (userNote != null && userNote != '');

            if (! hasKm && ! userIsIgnoringMe)
            {
                if (userHasNote)
                {
                    userNote = userNote + '\n\n';
                }
                else
                {
                    userNote = '';
                }
                userKm   = makeSpanWithBigI (userID);
                userNote = userNote + makeToolTipHintYouMayEditKm ('', userID);
            }

            if (hasKm)
            {
                userKm = userKm.replace (' ', '&nbsp;');
            }

            if (isDarkTheme || ! userFlagsObject.found)
            {
                spanBackground = '';
            }

            var smallGap = veryCompact ? '' : '&nbsp;&nbsp;&nbsp;';

            var tdOpen   = createInfoLineAsTDs ? '<td '+theStyle+'>' : '';
            var tdClose  = createInfoLineAsTDs ? '</td>' : '';

            var noteMarker = (showN && userHasNote)
                ? tdOpen + '<span style="'+shadowCodeForOutline (settings.InfoColor_Near.value)+' color:#000">' + smallGap + 'N' + smallGap + '</span>' + tdClose
                : '';

            var spanOpen = '<span title="' + userNote + '" '+theStyle+'>';

            var infoLine =
                createInfoLineAsTDs
                ? (tdOpen + '<table cellpadding="0" cellspacing="4"><tr>' + noteMarker + userFlagsText + tdOpen + '&nbsp;&nbsp;'+userKm + tdClose + '</tr></table>' + tdClose)
                : (spanOpen + noteMarker + userFlagsText + (veryCompact ? '&nbsp;' : ' &nbsp; ') + userKm + '</span>');

            ret_infoLineObject.text             = infoLine;
            ret_infoLineObject.hasFlagHappy     = userHasFlagHappy;
            ret_infoLineObject.hasFlagIgnore    = userInSilentIgnore;
            ret_infoLineObject.userIsIgnoringMe = userIsIgnoringMe;
            ret_infoLineObject.userFlagsObject  = userFlagsObject;
        }




        var thDownTag = 'thDown';

        //
        // ignore complete forum threads by moving them to the bottom of the page
        //
        var isForumThreadList = (location.href.indexOf('model-kartei.de/forum/posts') > -1);

        if (isForumThreadList && settings.AddVotingButtonsToThreadList.value)
        {
            var isNewVoteDownAction = (location.href.indexOf('voteDown=') > -1);

            if (isNewVoteDownAction)
            {
                var voteID = location.href.substring (location.href.indexOf ('voteDown=')+9);

                ownStorageSetItem (thDownTag+voteID, '1' + getCurrentBaseTimeOffset ());

                location.href = location.href.substring (0, location.href.indexOf ('voteDown=')-1);
            }

            var isNewVoteNormalAction = (location.href.indexOf('voteNormal=') > -1);

            if (isNewVoteNormalAction)
            {
                var voteID = location.href.substring (location.href.indexOf ('voteNormal=')+11);

                storage.removeItem (thDownTag+voteID);

                location.href = location.href.substring (0, location.href.indexOf ('voteNormal=')-1);
            }

            var forumThreads = document.getElementsByClassName ('fWrapper');
            if (forumThreads.length > 0)
            {
                var threadsVotedDown = [];

                for (var i = 0; i < forumThreads.length; i++)
                {
                    var thread = forumThreads [i];

                    var threadID = getThreadIdFrom_fWrapper (thread);

                    var actions = thread.getElementsByClassName ('listActions');
                    if (actions.length > 0)
                    {
                        var sVoted = ownStorageGetItem (thDownTag+threadID);
                        if (sVoted != null && sVoted.length > 1)
                        {
                            sVoted = sVoted.substring (0,1);
                        }
                        var isVotedDown = sVoted == '1';

                        if (isVotedDown)
                        {
                            actions [0].innerHTML = actions [0].innerHTML +
                            '<li><a href="'+location.href+'?voteNormal='+threadID+
                            '" title="'+
                            trFunc ('Thema nicht mehr nach unten verschieben',
                                    'Do not move thread to the end of the list')+
                            '"><span style="color:#bbb"><big>&nbsp;<br>&#8673;</big></span></a></li>';

                            if (i < forumThreads.length-1)
                            {
                                threadsVotedDown [threadsVotedDown.length] = i;
                            }
                        }
                        else
                        {
                            actions [0].innerHTML = actions [0].innerHTML +
                            '<li><a href="'+location.href+'?voteDown='+threadID+
                            '" title="'+
                            trFunc ('Thema nach unten verschieben',
                                    'Move this thread to the end of the list')+
                            '"><span style="color:#bbb"><big>&nbsp;<br>&#8681;</big></span></a></li>';
                        }
                    }
                }

                forumThreads = document.getElementsByClassName ('fWrapper');

                var lastThread = forumThreads [forumThreads.length-1];

                for (var i2 = threadsVotedDown.length-1; i2 > -1; i2=i2-1)
                {
                    var iPoor = threadsVotedDown [i2];

                    var poorThread = forumThreads [iPoor];

                    var origCode = poorThread.innerHTML;

                    for (var i3 = iPoor; i3 < forumThreads.length-1; i3++)
                    {
                        forumThreads [i3].innerHTML = forumThreads [i3+1].innerHTML;
                    }
                    lastThread.innerHTML = origCode;
                }
            }
        }

        function getThreadIdFrom_fWrapper (thread)
        {
            var threadID = '';
            var anchors = thread.getElementsByTagName ('a');
            if (anchors.length > 0)
            {
                var href = anchors [0].getAttribute ('href');
                threadID = href.substring (href.indexOf ('model-kartei.de/forum/thread/')+29);
                threadID = threadID.substring (0, threadID.lastIndexOf ('/'));
            }
            return threadID;
        }



        //
        // process users' forum posts in single threads:
        //
        var isForumThread = (location.href.indexOf('model-kartei.de/forum/thread/') > -1);

        if (isForumThread)
        {
            for (var i = 0; i < settings.AddToMenu_NeueFotos.value.length; i++)
            {
                beautifyForumPosts (settings.AddToMenu_NeueFotos.value [i][0],
                                    settings.AddToMenu_NeueFotos.value [i][1]);
            }
        }


        function beautifyForumPosts (userType, userTypeInURL)
        {
            var userPosts = document.getElementsByClassName ('comment sedcard'+userType);
            if (userPosts.length > 0)
            {
                for (var i = 0; i < userPosts.length; i++)
                {
                    var post = userPosts [i];

                    var rows = post.getElementsByClassName ('row');
                    if (rows.length > 0)
                    {
                        var commentUser = rows [0].getElementsByClassName ('commentUser');
                        if (commentUser.length > 0)
                        {
                            var anchors = commentUser [0].getElementsByTagName ('a');
                            if (anchors.length > 0)
                            {
                                var href = anchors [0].getAttribute ('href');

                                var userCode = href.substring (href.indexOf ('/'+userTypeInURL+'/')+userTypeInURL.length+2);

                                var userID   = userCode.substring (0, userCode.indexOf ('/'));

                                var infoLineObject = new Object ();
                                createCompactInfoline (userID, 12, 14, false, infoLineObject, true, true, false, false, false, null);
                                var infoLine = infoLineObject.text;
                                var isIgnored = infoLineObject.hasFlagIgnore;

                                if (settings.MinimizePostingsIfUserIgnored.value && isIgnored)
                                {
                                    var userName = userCode.substring (userCode.indexOf ('/')+1);
                                    userName = userName.substring (0, userName.indexOf ('/'));

                                    post.innerHTML = '<span style="color:#777"><small>&nbsp;&nbsp;<a style="text-decoration: none; color:#777" href="'+href+'">'+userName+
                                        '</a>&nbsp;&nbsp;'+infoLine+'</small></span>';
                                }
                                else
                                {
                                    var colC43 = rows [0].getElementsByClassName ('col c-4-3');
                                    if (colC43.length > 0)
                                    {
                                        colC43 [0].innerHTML = colC43 [0].innerHTML + ' &nbsp; ' + infoLine;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }



      cleanUpLocalStorage ();

      // remove 200 old entries when more than 20.200 stored
      function cleanUpLocalStorage ()
      {
          var numItems = storage.length;
          if (numItems > 20200)
          {
              console.log ('Local storage has', storage.length, 'entries.\nCleaning-up:');
              var d = new Date ();
              var startTime = d.getTime ();

              var todayOffset = getCurrentBaseTimeOffsetInt ();

              var count = 0;
              for (var i=0; (i<numItems-1) && (count<200); i++)
              {
                  var key   = ownStorageKey (i);
                  var item  = ownStorageGetItem (key);
                  var isObsolete = false;

                  if (key.substring (0, 1) == 'u')
                  {
                      var object = getUserStorageObjectFromString (item);
                      if (object != null)
                      {
                          if (todayOffset - object.tsUpdate > 14)
                          {
                              if ( ! objectHasSettingsOfMine (object))
                              {
                                  isObsolete = true; // _unspecific_ user entry older than 2 weeks
                              }
                          }
                      }
                  }
                  else if (key.substring (0, thDownTag.length) == thDownTag)
                  {
                      var ts = item.substring (1);
                      var intValue = parseInt (ts, 10);
                      if ( ! Number.isNaN (intValue))
                      {
                          if (todayOffset - intValue > 365)
                          {
                              isObsolete = true; // forum thread down arrows older than a year
                          }
                      }

                  }
                  if (isObsolete)
                  {
                      count++;
                      storage.removeItem (key);
                      storage.removeItem (ownID+':'+key);
                  }
              }

              d = new Date ();
              console.log (count, 'obsolete items removed,', d.getTime () - startTime, ' mSecs spent.');
          }
      }


    }

)();