Beiträge von DAUFahnder

Du benötigst Hilfe bezüglich Firefox? Bitte stelle deine Frage im öffentlichen Bereich des Forums und nicht per Konversation an wahllos ausgesuchte Benutzer. Wähle dazu einen passenden Forenbereich, zum Beispiel „Probleme auf Websites“ oder „Erweiterungen und Themes“ und klicke dann rechts oben auf die Schaltfläche „Neues Thema“.

    Suchwort für die Suchmaschine deiner Wahl wäre jjencode. Einen Decoder findest Du z.B. hier:
    https://github.com/jacobsoo/Decoder-JJEncode


    Das von dir gepostete Beispiel wird also zu:


    Dabei ist der base64-Code diese URL: //meextffcon.com/1c70c2612b656eb3da.js
    Die Script-Datei wiederum lädt scheinbar vor allem Werbung von cdnpps.us nach, aber ich habe mir die jetzt nicht intensiver angeschaut. Sprich: Das AddOn produziert zusätzliche Werbung auf den besuchten Seiten, womit der böse Bube also "nur" hinter Werbeeinnahmen her ist.


    Hi DAUFahnder,


    hab dir eben ein PN zukommen lassen mit der benötigten HTML.


    Frage: Hättest du Lust mal zu schauen wie es realisierbar währe das beim jeden Start nicht jedes Mal "KEIN ANGABE" sondern > DHL sofort erscheinen soll.



    Ich habe das Script gerade getestet (per zusätzlich eingebundenem Script-File) und es funktioniert FAST so wie Du es wolltest:
    - DHL wird ausgewählt und das Feld für den Tracking-Code schaltet scharf (die drei ersten Zeilen in der Funktion)
    - die Mail-Adresse wird zum mailto-Link, es öffnet sich also beim Klick darauf dein Mailprogramm


    Etwas umständlicher wird die Integration des Artikels in den Betreff. Rakuten benutzt leider an den entscheidenden Stellen keine HTML-IDs, daher auch die umständliche Art aus der Mailadresse einen mailto-Link zu bauen. Ich muss mal schauen wie man filtern muss, damit wirklich nur eine Atikelbezeichnung "gefunden" wird und nicht die diversen internen Links von Rakuten. Machbar müsste das auch sein, aber nicht mehr Heute, Sorry, bin erledigt.


    Es ist genau das was ich gesucht habe bzw. ein sehr guter Anhaltspunkt wie es zu realisieren ist.
    Leister funtkioniert Greasemoney irgendwie nicht > die Schaltfläche "neues Benutzerscript" kann nicht geklickt werden.
    Bin jedoch auf ein fast Identisches PlugIn gestoßen das Tampermoney heist und das gleiche ist, sofern ich das beurteilen kann.


    Das macht im Grunde dasselbe, jedenfalls ausgehend von der Beschreibung, ja.


    Zitat


    Jetzt bedarf es nur eines Scripts das ich dort einfügen muss und es starten.


    Da ich nicht Coden kann > kann ich nur nachvollziehen wie der Coder das wohl schreiben müsste.


    Das einfachste ist, aus dem Feld mit der Mailadresse einen klassischen Link zu machen, also z.B. so:


    Code
    document.getElementById("MAILFELD").innerHTML = "<a href='mailto:"+document.getElementById(\"MAILFELD\").innerHTML+"?subject=....'>"+document.getElementById(\"MAILFELD\").innerHTML+"</a>"


    Ich bräuchte den Quellcode einer dieser Bestellübersichten um dir das Script komplett schreiben. Geh mal dorthin, speichere die Seite in Firefox ab, verpacke sie als zip-Datei und schick sie mir hier als Private Nachricht. Du kannst vor dem Packen die persönlichen Daten aus der HTML-Datei ändern, aber die HTML-Felder selbst müssen erhalten bleiben.


    Aber vorab: Ich baue das Script möglichst simpel, also wird bei einer Bestellung übere mehrere unterschiedliche Artikel nur eins in der Betreffzeile auftauchen. Mehrere wären auch nicht sinnvoll, da das die entsprechenden Felder praktisch jedes Mailprogramms ohnehin sprengen würde.

    Bin Nutzer des Firefox und verkaufen auf Rakuten.de


    Dort sind die e-Mail Adressen des Kunden als Klartext ausgeschrieben (nicht klickbar) sodass sich wie in meinem Fall Thunderbird sich nicht öffnen kann.


    Würde gern realisieren das die e-Mail Adressen erkannt werden und sich direkt Thunderbird öffnet.
    Des weiteren Sollte dann auch direkt immer der Betreff automaisch im Thunderbird Fenster automatisch eingefügt werden.


    Man bräuchte ein passendes AddOn für UserScripte (Greasemonkey z.B.), die HTML-IDs der betreffenden Felder und halt etwas JavaScript. Man kann auch nur für diesen Zweck ein AddOn bauen, am Besten eins bei dem man die IDs der Felder bei Bedarf über Optionen ändern könnte. Mit allen notwendigen Infos dauert das nicht lange. Aber Testen kann man das nur, wenn man dort selbst als Verkäufer agiert.


    Und der Aufwand lohnt sich wohl nur, wenn es mehr als nur einige wenige Mails am Tag wären.


    Bietet rakuten.de keine entsprechenden automatisierten Dienste für Verkäufer an? Bei eBay gibt es solche Automatismen.


    Ich habe vor kurzen begonnnen, mein erstes AddOn für Firefox zu programmieren.


    Ich möchte ein AddOn haben, dass in einem Tab automatisch nach einiger Zeit eine neue Webseite ansurft.
    Nach einem Aufruf von "window.location.href = " scheint das "setTimeout" nicht mehr zu funktionieren.
    Es scheint, als ob beim Neuladen einer Seite das gesamte Content-Objekt verworfen wird, so dass der Timeout-Prozess verloren geht.


    Setz "setTimeout" in die background.js. Und dann von dort eine Nachricht an das Content-Script schicken, es soll eine andere Adresse laden. Oder aber von background.js aus einfach einen neuen Tab mit der neuen Adresse öffnen lassen. Das hätte auch den Vorteil, das man die Ergebnisse direkt nebeneinander hätte.


    Eine funktionierende Grundversion wäre natürlich auch mal nicht schlecht, denn momentan wird lediglich ein Passwort generiert. Wobei ich aus dem wenigen, was man dieser Extension bisher entnehmen kann (und ich meine nicht den Code - den ackere ich nicht durch :P ), nicht wirklich schlau werde. Es wäre vielleicht nicht verkehrt, wenn du auch mal genau beschreibst, was dieses AddOn eigentlich machen soll. Offensichtlich wird ein Passwort generiert. Okay. Dabei sind aber für mich viele Dinge unklar:
    - Was habe ich unter "Masterpasswort" und "Nutzer" zu verstehen? Bezieht sich das auf die Website, die ich gerade besuche? Oder ist das auf die Extension bezogen?


    Masterpasswort ist am Ende dasselbe Prinzip wie ein Masterpasswort für das Firefox-Profil: Damit werden die verschlüsselten Daten gesichert und es wird verhindert, dass ein zweiter Nutzer am selben Fuchs (Besucher z.B.) sich einfach so irgendwo mit den Daten des Gastgebers anmelden kann.
    "Nutzer" meint den Benutzernamen einer beliebigen Webseite. Ich melde mich hier als "DAUFahnder" an, also wäre auf http://www.camp-firefox.de mein Nutzername "DAUFahnder". Allerdings wird es die Möglichkeit geben, für Seiten mehrere Identitäten anzugeben. PWGen fragt dann nach welche genutzt werden soll wenn für die betreffende Adresse mehrere hinterlegt sind. So könnte ich also für http://www.camp-firefox.de also einerseits ein PW für den Nutzer "DAUFahnder" generieren lassen, als auch z.B. für "Westfale". Das AddOn selbst könnte ich theoretisch mit mehreren Nutzern versehen, aber eigentlich ist das durch das Masterpasswort überflüssig. Wenn man mehrere Nutzer will, speichert man das MasterPW nicht permanent ab sondern lässt jedes Mal nachfragen. Da es sowohl zur Verschlüsselung der Daten dient als auch in den Passwort-Hash selbst mit einfliesst (s.u.) könnte man sich so beliebig viele vollständig getrennte Identitäten anlegen.


    Zitat


    - Was ist das mit dieser "laufenden Nummer"? Wozu ist das gut? Muss ich da als User irgendetwas einstellen?


    PWGen erzeugt ein Passwort für eine Seite als Hash. Dabei fliessen diverse Dinge in den Ursprungsstring ein, darunter neben der Hostadresse, dem Nutzernamen und dem Masterpasswort auch diese laufende Nummer. Gedacht ist das, um bei Bedarf mal das Passwort zu wechseln. Wird die Nummer einfach um 1 erhöht, ändert sich der Hash und damit natürlich das Passwort. Man kann also auf dem Formular zum Ändern des Passworts leicht das alte eingeben, erhöht die Nummer um 1 und bekommt sofort das neue Passwort für beide Felder (im Regelfall muss man das neue PW ja noch wiederholen). Und ja, PWGen wird sich merken, wenn man für Nutzernamen X auf Webseite Y die Nummer um 1 erhöht hat und wird das dann in Zukunft automatisch machen. Diese Anforderung "neues Passwort" wird später im Kontextmenu des Markers auftauchen und bei Auswahl wird die Nummer um 1 erhöht, das PW generiert und ins Passwortfeld verfrachtet. Klickt man dann im Feld für Passwortwiederholung auf Passwort einfügen, weiss PWGen noch, dass die Nummer erhöht wurde und fügt automatisch das neue Passwort ein.


    Letztlich dient die Nummer als Lösung für zwei Probleme: Man kann schnell und einfach neue Passwörter generieren, bekommt aber trotzdem schnell und einfach das alte Passwort jederzeit wieder wenn man es braucht. Wie geschrieben vor allem, um bei einer Passwortänderung das alte trotzdem eingeben zu können, wie es viele Webseiten verlangen.


    Das Schöne am Grundsystem ist: Man muss sich nur noch ein Passwort merken (das MasterPW) und hat trotzdem für jede Webseite ein anderes Passwort das man schnell und leicht heraus finden kann wenn man es denn doch mal braucht. Wieviele Menschen vergessen wohl ihre Passwörter weil sie den Passwortspeicher ihres Browsers benutzen? Und wieviele davon haben keine Ahnung, dass sie im Notfall durchaus an ihre Passwörter kämen weil der Fuchs sie auf expliziten Wunsch anzeigen kann?


    Zitat


    - Was ist mit dem erzeugten Passwort? In welcher Form merkt sich die Extension das? Merkt (sich) die Extension, wenn ich den Wert der Ausgabe manuell ändere?


    Die Passwörter selbst müssen nicht gespeichert werden. Ein Hash erzeugt aus denselben Vorgaben immer dasselbe Ergebnis. Zumal Firefox selbst einen Passwortspeicher enthält und wozu das Rad neu erfinden.


    Die Extension merkt sich in der Grundeinstellung jede Änderung der Vorgaben pro Domain. Gibt man einen anderen Benutzernamen an und lässt ein Passwort generieren, speichert PWGen auch diese Vorgaben und fragt beim nächsten Besuch der Seite, welcher Nutzer es denn sein soll. Theoretisch kann man sich mit zig Identitäten auf derselben Seite anmelden und PWGen fragt immer brav an, welchen Namen davon man denn Heute benutzen will und dank Masterpasswort kann Ehefrau nicht die Anmeldungen von Ehemann sehen und umgekehrt. Löschen von Daten ist natürlich vorgesehen.


    Das einzige was mich derzeit noch dran hindert, die Optionen wirklich effektiv einzubauen und PWGen zu veröffentlichen, ist der Datenex- und import. Es muss eine Möglichkeit geben, sich sämtliche gespeicherten Daten ausgeben zu lassen. Denn merken kann man sich die nicht und man will ja vielleicht mal den Browser wechseln oder seinen Rechner neu aufsetzen. Vermutlich wird es da die Möglichkeit geben, statt der gespeicherten Daten "nur" die Passwörter ausgeben zu lassen. Da ein ReImport angedacht ist, brauche ich zwei Export-Formate: Einmal als einfache HTML-Datei die man sich ausdrucken kann (relativ einfach) und einmal im json-Format, damit ein Import für einen neuen Firefox möglich ist. Das json-Format braucht dann aber nicht die Passwörter selbst sondern "nur" die hinterlegten Daten.


    Ein Frustpunkt war das Speichersystem: Ich brauchte eine Lösung, um vollkommen variabel Daten pro Domain zu speichern ohne vorher zu wissen welche Domains es sind. Und dann auch noch die Lösung, um pro Domain mehrere Nutzer zu ermöglichen, ebenfalls ohne vorher zu wissen wie die Namen lauten werden. Ich habs nicht so mit Programmierung (weshalb Hash- und Verschlüsselungsfunktionen auch nicht von mir sind), musste mich also durchtesten. Das klappt aber inzwischen problemlos.


    Wie kann ich die Feedliste leeren, bevor ich "Brief" erneut teste?


    Innerhalb deines Firefox-Profils findet sich ein Unterverzeichnis "browser-extension-data". Darin findet sich ein Unterverzeichnis "brief@mozdev.org". Wenn Du das löscht während Firefox geschlossen ist (oder vielleicht besser erst mal nur umbenennen, z.b. ein "old" dran hängen), verliert Brief sämtliche Einstellungen, inclusive der Feedliste. Du musst es danach also komplett neu einrichten.


    Ich habe gerade nicht geschaut, ob Brief selbst eine Möglichkeit bietet die Feeds zu löschen :).


    Das kann jeden passieren auch mit neuster Soft
    https://haveibeenpwned.com/ kommt aber immer dann ins Spiel wenn das Kind im Brunnen gefallen ist.
    Sprich wenn Datenlecks offiziell sind


    Ehrlich gesagt: Dann ist es meistens zu spät. Wenn sie offiziell sind, wurden die Daten bereits abgegraben. Und jedes ScriptKiddie und böser Junge der was auf sich hält wird die entwendeten Daten direkt für die nächste Aktion nutzen. Also z.B. ergaunerte Passwörter direkt auf der nächsten Seite versuchen. Oder ein Wahlkampf wurde längst entschieden... ein deutscher Trump z.B. wäre der SuperGAU.


    Verständlich. Ich will hier auch nicht gerade den kompletten Code veröffentlichen, das wäre Overkill. Und der derzeitige Stand auf Github ist rettungslos veraltet - müsste ich mal aktuallisieren.


    So, ich habe gebastelt:
    [attachment=0]PWGen.zip[/attachment]


    Bitte beachten: Bis auf die Marker-Farbe sind sämtliche Optionen faktisch funktionslos. Sie werden gespeichert, haben aber keinerlei Auswirkungen. Das einzige was tatsächlich funktioniert ist das Popup über den Button. Und wie ich gerade gesehen habe, funktioniert da das Häkchen für die Sonderzeichen nicht. Vermutlich weil ich inzwischen an den Variablen gedreht habe oder die Abfrage schlicht noch fehlt :).


    Auch der gesetzte Marker macht nichts, was man als Nutzer bemerkt. Er spuckt lediglich in der Browser-Konsole die ID des betreffenden HTML-Elements aus. Das ist nur für mich zum Testen. Mit anderen Worten: Das Paket soll nur zeigen was ich geplant habe. Selbst die Variablen, IDs etc sind derzeit noch Overkill. Die Bezeichner dienen mir derzeit noch als Hilfe um zu sehen was falsch läuft, die werden in der finalen Fassung noch zusammen gekürzt und den Konventionen angepasst.


    Falls also jemand Tipps hat, was man machen könnte... :lol::lol::lol:


    Gute Nacht!

    Dateien

    • PWGen.zip

      (101,61 kB, 31 Mal heruntergeladen, zuletzt: )


    "sicher" ist sehr relativ zu sehen. Und Seiten die einmal geknackt wurden, sei es weil das verwendete CMS unsicher war oder weil der Admin schlicht geschlafen hat, sind nun einmal als nicht sicher gebrandmarkt.


    Das Problem bei solchen Ideen ist aber sowieso, dass viele Nutzer sowas schlicht ignorieren. Siehe die Leute mit veralteten Firefox-Versionen. Oder die Leute die noch mit XP durchs Netz geistern.

    Nachtrag, weil mir gerade ein Licht aufgegangen ist :idea: :


    Ich hatte ein riesen Verständnis-Problem was browser.storage.local.get() betrifft. Der Fehler lag in meinem System der Abfrage, welches noch von localStorage.getItem() kommt, welches zwingend einen Bezeichner für das Datum braucht welches man haben will. Immerhin, so lernt man auch :oops: .


    EffPeh, vielen Dank nochmal, so eine Diskussion ist hilfreich wenn man den Baum vor lauter Wald nicht erkennt :klasse: .


    Sorry, aber das kann ich ja nicht wissen. Das geht nicht aus deinem Post bzw. dem Code hervor. :wink:


    Ja, da hast Du wohl recht. Andererseits ist der Dateninhalt für das eigentliche Problem (Content-Scripte arbeiten in einem anderen Scope oder ich bin blind und sehe den Fehler nicht) auch vollkommen egal.


    Zitat

    Äähm, hier... :P


    Da definiere ich Standard-Werte in einem zur Storage-Abfrage benutzten Array. Aber ich hätte es zugegeben dazu schreiben müssen. Wenn ich das nämlich nicht mache, und die Storage-Abfrage läuft ins Leere, erscheint nur der übliche img-Platzhalter da der Fuchs versucht ein svg zu laden welches nicht existiert: "marker_undefined.svg" gibts halt nicht ;). "value" nutze ich im obigen Schnippsel nur, weil es kürzer ist als die tatsächliche Nutzung.


    Zitat


    Wie gesagt, ich kann anhand einiger Schnipsel nicht die Struktur deines Scripts erfassen und kann also höchstens Vermutungen anstellen. :)


    Verständlich. Ich will hier auch nicht gerade den kompletten Code veröffentlichen, das wäre Overkill. Und der derzeitige Stand auf Github ist rettungslos veraltet - müsste ich mal aktuallisieren.

    Zitat

    Wie auch immer: Ich habe dir mal auf die Schnelle eine Extension erstellt, die zeigt, wie man storage-Werte live aus einem Content-Script heraus nutzen kann. Vielleicht hilft dir das weiter.
    Das Script basiert auf dem borderify-Beispiel, welches nicht weiter macht, als dem body-Tag einer Website einen Rahmen zu verpassen. Ich habe allerdings nun Optionen hinzugefügt, mit denen man die Farbe ändern kann. Ändert man die Farbe in den Optionen, wird auch die Rahmenfarbe auf Webseiten live übernommen. :wink:
    optionTest.zip


    Danke. Aber beim Installationsversuch über about:debugging -> Zitat vom Fuchs:

    Zitat

    There was an error during installation: Component returned failure code: 0x80520015 (NS_ERROR_FILE_ACCESS_DENIED) [nsIFile.directoryEntries]


    Aber: Ich glaub' Dir, dass es eigentlich funktioniert. Also gehe ich davon aus, dass ich in meiner Variante irgendwo einen Fehler hatte. Da ich den aber nicht finde und eine Sicherung meiner Tests auch nicht existiert, bleib ich mal bei meiner Lösung. Die tuts ja problemlos. Und sollte bei den geringen Datenmengen auch kein Leistungsproblem sein.


    Falls du tatsächlich in deinen Optionen für die Farbe "schwarz" verwendest, musst du dich nicht wundern, denn diesen Schlüsselwert gibt es gar nicht. (Es gibt nur "black".) Also wird die Farbangabe ignoriert.


    Es gibt im Grunde jede beliebige Farbe weil ich die Zuweisung nicht als CSS-Code vornehme. Ich füge jeder Seite per Content-Script ein zusätzliches Element hinzu. Genauer ein "img". Das wird pauschal erstmal mit "display: none" eingebaut, ist also im Normalfall nicht sichtbar. Erst wenn ein Input mit dem Type "password" gehovert wird oder selbiges den Focus bekommt, wird das img-Element mit einigen Tricks am Ende des Input-Feldes aufgepappt:
    [attachment=0]1.png[/attachment]
    Das AddOn "InFormEnter+" macht es ebenso, wenn auch auf andere Art (imho deutlich umständlicher, aber ich bin ja auch kein Programmierer). Daher kam ja meine Idee dazu.


    Die "Farbe" wird im Attribut "src" benutzt. Je nach User-Einstellung gibt es also ein pinkes img, ein rotes, ein gelbes... . Daher sind nicht die CSS-Farbcodes von Bedeutung sondern die Benennung meiner Marker-SVGs. Und da gibt es derzeit sehr wohl ein "schwarz".


    Zitat


    Ansonsten kann ich zu den Code-Snippets nicht wirklich viel sagen, weil mir der Kontext fehlt. Falls du aber in deinem Content-Script den Code so wie er da steht verwendest, ist es - aus meiner Sicht, eben ohne Kontext - klar, das bei jedem Aufruf die Farbe wieder auf "pink" gesetzt wird. Egal, was du in deinen Optionen festlegst.


    Wie gesagt, siehe oben. Zumal es aus dem background-Script heraus ja auch funktioniert. Läge es tatsächlich an der Bezeichnung, dürfte auch das nicht klappen.


    Zitat


    Ich verstehe auch nicht, warum überhaupt in einem Content-Script Optionen gesetzt werden. Das erschliesst sich mir hier nicht. Nach meinem Verständnis werden Optionen eben in einer option.js definiert und dann - bei Bedarf - in anderen Scripten abgerufen. :)


    Wo definiere ich in Content-Scripten eine Option? Ich gebe Standards vor, nutze dieses Array zur Abfrage im Storage und wenn sich im Storage ein anderer Wert findet wird natürlich der benutzt. Das machst Du übrigens nicht anders, nur dass bei dir die Standard-Vorgaben direkt in der Funktion definiert sind, ich habe das bloss als Konstante ausgelagert. Das dient der Sicherstellung, dass abgefragte Werte immer existieren, auch wenn sie in den Optionen nicht explizit gesetzt wurden. Denn das Content-Script soll ja arbeiten auch ohne dass man irgendwelche Optionen jemals gesehen hat.


    Wie gesagt: Läge es an irgendwelchen Bezeichnungen, dürfte es nie funktionieren. Es funktioniert aber nur im Content-Script nicht korrekt. Ist aber am Ende auch egal. Die Variante mit dem Senden der Optionen aus dem Hintergrundscript heraus hat durchaus Vorteile.

    Bilder

    • 1.png

    Es würde die Zahl der Verrückten aber reduzieren ;). Nachts um halb zwölf würde ich schon gerne mal schlafen. Am WE geht das ja noch, aber in der Frühschicht-Woche wirds halt nervig. Und als "Nicht-Fussball-Durchngeknallter" hält sich auch mein Verständnis in Grenzen. Wenns jetzt Gehupe zur Snooker-WM gäbe, das könnt' ich verstehen :).


    Es geht doch auch gar nicht darum, wo ich die storage-API nutze, sondern wie. Und was diese API angeht, besteht hier keinerlei Einschränkung für Content scripts.


    Es ist also, nach meinem Verständnis, völlig überflüssig, den Umweg über die background.js zu gehen. :wink:


    Mir hat das jetzt keine Ruhe gelassen, also habe ich die letzten Tage weiter getestet. Es mag ja sein, dass Content-Scripte Zugriff auf dieses API haben, aber für mich scheint es mindestens so, dass sie nicht im selben "Raum" arbeiten.


    Wenn ich im Content-Script folgendes mache:


    Code
    const defaultSettings = {
    farbe: "pink",
    };
    function restoreOptions() {
    browser.storage.local.get(defaultSettings)
    .then(settings => {
    document.getElementById("test").value = settings.farbe;
    }, error => setStatus(`Error: ${error}`));


    Wird der Inhalt natürlich zu "pink" geändert. Ändere ich dann aber innerhalb der Optionen eben diesen Wert:

    Code
    function saveOptions(e) {
    var settings = {
    farbe: "schwarz"
    };
    browser.storage.local.set(settings)
    .then(() => setStatus("Optionen gespeichert."));
    e.preventDefault();
    }


    bleibt es bei pink. Schicke ich den Wert für Farbe aber von der background.js ins Content-Script:


    Kommt der korrekte (zuvor in den Optionen geänderte) Wert im Content-Script an. Obwohl der Storage-Zugriff beide Male derselbe ist (imho..).


    Also entweder mache ich im Content-Script einen Fehler der die korrekte Verarbeitung vermasselt (durchaus möglich!) oder Content-Script und die anderen AddOn-Scripte haben getrennte Storage-Scopes.


    Ich habe ab Mitte Juli Urlaub, dann sollte ich das AddOn zumindest soweit funktionstüchtig bekommen, dass ich es anderen zum Testen zumuten kann. Eventuell findet dann ja jemand den Fehler den ich unbemerkt produziere und der die korrekte Verarbeitung im Content-Script vermasselt.


    Anm.: Ich habe in obigen Schnippseln jetzt nicht jede genutzte Funkton ausgeschrieben. setStatus z.B. ist eine separate Funktion, die in den Optionen ein entsprechendes span-Element mit Inhalt füttert. Das Prinzip sollte aber klar sein.