Gesichterparty – GM – Save Textarea Fields

Zwischenspeichern des Inhaltes von Text-Feldern bis zum Senden des Formulars.
Sämtliche Eingaben in Textarea Felder, wie z.Bsp. das Eingabefeld für einen Gästebuch-Eintrag oder beim Schreiben von persönlichen Nachrichten, werden mit diesem Script bis zum Ausführen des Submit-Befehls zwischengespeichert werden. Sollte durch ein versehentliches Klicken auf einen anderen Link, oder durch ein beabsichtigtes Wechseln zu einer anderen Seite das Formular noch nicht versendet worden sein, geht man einfach auf die Seite mit der Textarea zurück. Der gespeicherte Text wird automatisch wieder eingefügt.

// ==UserScript==
// @name          Gesichterparty Textarea Backup
// @namespace     http://ngeorg.com/
// @author        Norman Georg
// @version       1.0
// @description   Retains text entered into Gesichterparty textareas.
// @include       http://gesichterparty.de/*
// @include       http://*.gesichterparty.de/*
// ==/UserScript==

function SaveTextArea(txta) {
  this.ta = typeof txta == 'string'
          ? document.getElementById(txta)
          : txta;
  this.initial_txt = this.ta.textContent;
  this.committed   = '';
  this.listen();
  this.restore();
}

SaveTextArea.prototype = {
  listen: function() {
    var self = this;
    this.ta.addEventListener('keypress', function(e) {
      self.commit(self.ta.value);
    }, true);
    this.ta.addEventListener('blur', function(e) {
      self.commit();
    }, true);
    this._stay_tuned();
    var onsubmit = function(e) {
      self.committed = '';
      GM_setValue( self.key(), self.committed )
    };
    var theform = this.ta.form;
    theform.addEventListener('submit', onsubmit, true);
    theform.the_actual_submit_method = theform.submit;
    theform.submit = function() {
      onsubmit();
      self.ta.form.the_actual_submit_method();
    };
  },

  _stay_tuned: function() {
    var self = this;
    setTimeout(function() {
      self.commit();
      self._stay_tuned();
    }, 1000);
  },

  restore: function() {
    if(!this.is_significant( GM_getValue(this.key()) ))
      return;
    var buff = GM_getValue(this.key(), this.ta.textContent);
    if(!this.is_significant(buff))
      return;
    if(buff != this.ta.textContent && this.is_significant(this.ta.textContent))
      this._confirm_restore(buff);
    else
        this.ta.value = buff;
    this.previous_backup = this.ta.value;
    var self = this;
    GM_registerMenuCommand(
      'Wiederherstellung der letzten Sicherung '+this.ref(),
      function() { self.ta.value = self.previous_backup }
    );
  },

  _confirm_restore: function(buff) {
    var to_restore = GM_getValue(this.key());
    this.old_border = this.ta.style.border;
    var msg = "Text existiert bereits in '" + this.ref()
            + "', mit dieser Sicherung ueberschreiben?nn";
    msg += to_restore.length > 750
         ? to_restore.substring(0, 500) + "n..."
         : to_restore;
    this.confirming = true;
    this.ta.scrollIntoView();
    this._highlight_textarea(this.old_border);
    this.ta.value = this.ta.textContent;
    if(window.confirm(msg))
      this.ta.value = buff;
    this.confirming = false;
    this.ta.style.border = this.old_border;
  },

  _highlight_textarea: function(border, toggle) {
    var self = this;
    setTimeout(function(ta_border, toggle) {
      if(self.confirming) {
        self.ta.style.border = ( toggle ? '3px red solid' : ta_border );
        self._highlight_textarea(ta_border, toggle);
      } else
        self.ta.style.border = this.old_border;
    }, 1000, border, !toggle);
    return this.ta.style.border;
  },

  commit: function() {
    this.committed = this.ta.value;
    if(this.is_significant(this.committed)
    && this.initial_txt != this.committed)
      GM_setValue( this.key(), this.committed );
  },

  is_significant: function(str) {
    return typeof str == 'string'
        && str.replace(/s+/g, '').length > 0;
  },

  key: function() {
    return this.ta.baseURI + ';' + this.ref();
  },

  ref: function() {
    return this.ta.id || this.ta.name || '';
  }
};

var textareas = document.getElementsByTagName('textarea');
for(var i = 0; i < textareas.length; i++)
  new SaveTextArea(textareas[i]);

Download-Link: Greasemonkey Gesichterparty Save Textarea v.1.0


About this entry