DS Notes Manager

By C1B1 Last update Apr 22, 2010 — Installed 2,742 times.

There are 4 previous versions of this script.

// ==UserScript==
// @name          DS Notes Manager
// @description   Notizen können in Teil-Notizblöcke aufgeteilt werden
// @version       1.2
// @author        Samuel Essig (http://c1b1.de)
// @namespace     c1b1.de
// @homepage      http://c1b1.de
// @copyright     2009-2010, Samuel Essig (http://c1b1.de)
// @license       No distribution!
// @include       http://*.die-staemme.de/game.php?*screen=memo*
// @exclude       http://forum.die-staemme.de/*
// ==/UserScript==

/*
ds.NotesManager.user.js


DS Duke & Forum Assistant

(c) by C1B1SE
         info@c1b1.de
         http://c1b1.de

Do not republish, use in other scripts, change or reproduce this code nor a part of this code without permission from C1B1SE.
You may change string values if it's necessary for your language area.

This script may be forbidden in some language areas.
Please look in the respective forum for further information!
I won't take responsibility.
*/


var dom = new html();

if(dom.class('menu nowrap quickbar')[0])
  var subtrahend = 2;
else
  var subtrahend = 1;

var notes_td = dom.id('show_row').getElementsByTagName('td')[0];

var headings = new Array();
var edit_mode = false;

secedeReadElement(notes_td);

secedeWriteElement(dom.id('message'));
addAdvancedEditLink('Erweitertes Bearbeiten - aus');

function saveAdvanced()
  {
  var texts = new Array();
  var first = true;
  for(var i = 0, elist = document.getElementsByClassName('secededWriteTextArea'), len = elist.length; i < len; i++)
    {
    var text = elist[i].value;

    if(!first)
      text = '[secede]' + text;
    else
      first = false;

    texts.push(text);
    }

  var text = texts.join('\n');

  dom.id('message').innerHTML = '';
  dom.id('message').value = text;

  dom.id('submit_row').getElementsByTagName('td')[0].getElementsByTagName('input')[0].click();
  }

function addAdvancedEditLink(text)
  {
  var a = dom.n('a');
  a.setAttribute('href','#');
  a.addEventListener('click',function() {
    if(dom.id("edit_row").style.display == '')
      {
      alert('Nach dem Öffnen des normalen Bearbeitens funktioniert diese Funktion nicht mehr.');
      return true;
      }

    if(edit_mode)
      {
      this.style.color = '#804000';
      this.innerHTML = this.innerHTML.split('-')[this.innerHTML.split('-').length-2] + ' - aus';

      dom.id("show_row").style.display = '';
      dom.id("edit_link").style.display = '';
      dom.id("edit_row").style.display = 'none';
      dom.id("submit_row").style.display = 'none';
      dom.id("bbcodes").style.display = 'none';
      dom.id('save_advanced_button').style.display = 'none';
      dom.id('submit_row').getElementsByTagName('td')[0].getElementsByTagName('input')[0].style.display = '';

      for(var i = 0, elist = document.getElementsByClassName('notes_section'), len = elist.length; i < len; i++)
        elist[i].style.display = 'none';
      for(var i = 0, elist = document.getElementsByClassName('secededWriteTextArea'), len = elist.length; i < len; i++)
        elist[i].style.display = 'none';
      for(var i = 0, elist = document.getElementsByClassName('sectionLink'), len = elist.length; i < len; i++)
        elist[i].parentNode.style.backgroundColor = '#F7EED3';

      edit_mode = false;
      }
    else
      {
      this.style.color = 'red';
      this.innerHTML = this.innerHTML.split('-')[this.innerHTML.split('-').length-2] + ' - an';

      dom.id("show_row").style.display = 'none';
      dom.id("edit_link").style.display = 'none';
      dom.id("edit_row").style.display = 'none';
      dom.id("submit_row").style.display = '';
      dom.id("bbcodes").style.display = 'none';
      dom.id('submit_row').getElementsByTagName('td')[0].getElementsByTagName('input')[0].style.display = 'none';

      edit_mode = true;

      for(var i = 0, elist = document.getElementsByClassName('sectionLink'), len = elist.length; i < len; i++)
        {
        elist[i].addEventListener('mouseover',function()
          {
          if(edit_mode)
            this.parentNode.style.border = 'rgb(170,255,220) 2px solid';
          },false)
        elist[i].addEventListener('mouseout',function()
          {
          if(edit_mode)
            this.parentNode.style.border = 'transparent 2px solid';
          },false)
        }

      if(!dom.id('save_advanced_button'))
        {

        var input = dom.n('input');
        input.setAttribute('type','button');
        input.setAttribute('id','save_advanced_button');
        input.setAttribute('value','Erweitertes Speichern');
        input.addEventListener('click',saveAdvanced,false);

        dom.id('submit_row').getElementsByTagName('td')[0].appendChild(dom.text(' '));
        dom.id('submit_row').getElementsByTagName('td')[0].appendChild(input);
        }

      }

  },false);
  a.appendChild(dom.text(text));
  dom.id("edit_link").parentNode.insertBefore(a, dom.id("edit_link").nextSibling );
  dom.id("edit_link").parentNode.insertBefore(dom.text(' -> '), a );
  }


function secedeReadElement(notes_td)
  {
  // First Heading
  var after = notes_td.innerHTML;
  headings.push( after.split('<br>').shift() );
  after = after.split('<br>');
  after[0] = '<h3>' + after[0] + '</h3>';
  after = after.join('<br>');
  notes_td.innerHTML = after;

  notes_td.innerHTML = '<div class="notes_section" style="display:none; ">'+notes_td.innerHTML;
  var primaryKey_sections = 0;

  var text = notes_td.innerHTML;
  var positions = getCodesPositions(text);
  while(positions[0] != false)
    {
    var first = positions[0];
    var last = positions[1];

    var match = positions[2];

    var text = text.substr(first,last);
    var tmp_element = dom.n('div');
    tmp_element.innerHTML = text;

    var table = dom.n('table');

    var tr = dom.n('tr');
    var th = dom.n('th');
    th.appendChild(dom.text(' - Parted here - '));
    th.setAttribute('colspan','3');
    th.setAttribute('style','text-align:center; ');

    tr.appendChild(th);
    table.appendChild(tr);

    var before = notes_td.innerHTML.substr(0,first);
    var after = notes_td.innerHTML.substr(last);

    // Heading:
    if(match[1])
      {
      headings.push( match[1] );
      after = '<h3>' + match[1] + '</h3>' + after;
      }
    else
      {
      headings.push( after.split('<br>').shift() );
      after = after.split('<br>');
      after[0] = '<h3>' + after[0] + '</h3>';
      after = after.join('<br>');
      }

    notes_td.innerHTML = before + '</div><div class="notes_section" style="display:none; ">' + after + '</div>';

    var text = notes_td.innerHTML;
    var positions = getCodesPositions(text);
    primaryKey_sections++;
    }
  notes_td.innerHTML = notes_td.innerHTML + '</div>';

  var section_links = dom.n('tr');
  for(var i = 0; i <= primaryKey_sections;)
    {
    var td = dom.n('td');
    td.setAttribute('style','border:transparent 2px solid; ');
    var a = dom.n('a');
    a.setAttribute('href','#');
    a.setAttribute('title',i);
    a.setAttribute('class','sectionLink');

    if(headings[i].indexOf('<') == -1 && dom.trim(headings[i]) != '')
      a.appendChild(dom.text(headings[i++]));
    else
      a.appendChild(dom.text(' ' + (++i) ));

    var onclick_fct = function()
      {
      if(dom.id('show_row').style.display != 'none')
        {
        // Read Mode
        if(!edit_mode)
          {
          for(var i = 0, elist = document.getElementsByClassName('notes_section'), len = elist.length; i < len; i++)
            elist[i].style.display = 'none';

          document.getElementsByClassName('notes_section')[this.title].style.display = 'block';
          return false;
          }
        return true;
        }
      else
        {
        if(edit_mode)
          {
          for(var i = 0, elist = document.getElementsByClassName('notes_section'), len = elist.length; i < len; i++)
            elist[i].style.display = 'none';
          for(var i = 0, elist = document.getElementsByClassName('secededWriteTextArea'), len = elist.length; i < len; i++)
            elist[i].style.display = 'none';
          for(var i = 0, elist = document.getElementsByClassName('sectionLink'), len = elist.length; i < len; i++)
            elist[i].parentNode.style.backgroundColor = '#F7EED3';
          for(var i = 0, elist = document.getElementsByClassName('secededBBCodesBar'), len = elist.length; i < len; i++)
            elist[i].style.display = 'none';

          this.parentNode.style.backgroundColor = 'rgb(230,255,200)';

          dom.id('secededWriteTextArea_'+this.title).style.display = 'block';
          dom.id('secededBBCodesBar_'+this.title).style.display = 'block';

          // Insert Heading, if it was defined by regular expression
          var text = dom.id('secededWriteTextArea_'+this.title).innerHTML;
          var heading = this.firstChild.nodeValue;
          if(text.split('\n').shift().indexOf(heading) == -1)
            {
            dom.id('secededWriteTextArea_'+this.title).innerHTML = heading + '\n' + dom.id('secededWriteTextArea_'+this.title).innerHTML;
            }

          return false;
          }
        return true;
        }

      };

    a.addEventListener('click',onclick_fct,false);
    td.appendChild(a);
    section_links.appendChild(td);
    }
  dom.id('show_row').parentNode.insertBefore(section_links,dom.id('show_row'));

  onclick_fct.apply(td);

  // Add colspans:
  var elist = dom.id('show_row').parentNode.getElementsByTagName('tr');
  for(var i = 1, len = elist.length; i < len; i++)
    {
    elist[i].getElementsByTagName('td')[0].setAttribute('colspan',primaryKey_sections+1);
    }
  dom.id('serverDate').replaceChild(dom.text(' - Du benutzt ein Script von c1b1.de'),dom.id('serverDate').firstChild);

  }

function secedeWriteElement(notes_td)
  {
  var result = '';

  result += '<textarea cols="90" rows="25" style="display:none; " class="secededWriteTextArea" id="secededWriteTextArea_0">'+notes_td.innerHTML;
  var primaryKey_sections = 0;

  var text = result;
  var positions = getCodesPositions(text);
  while(positions[0] != false)
    {
    primaryKey_sections++;
    var first = positions[0];
    var last = positions[1];

    var match = positions[2];

    var text = text.substr(first,last);
    var tmp_element = dom.n('div');
    tmp_element.innerHTML = text;


    var table = dom.n('table');

    var tr = dom.n('tr');
    var th = dom.n('th');
    th.appendChild(dom.text(' - Parted here - '));
    th.setAttribute('colspan','3');
    th.setAttribute('style','text-align:center; ');

    tr.appendChild(th);
    table.appendChild(tr);

    var before = result.substr(0,first);
    var after = result.substr(last);

    result = before + '</textarea><textarea cols="90" rows="25" style="display:none; " class="secededWriteTextArea" id="secededWriteTextArea_'+primaryKey_sections+'">' + after + '</textarea>';

    var text = result;
    var positions = getCodesPositions(text);


    // BBCodes:

    var div = dom.n('div');
    div.setAttribute('class','secededBBCodesBar');
    div.setAttribute('id','secededBBCodesBar_'+primaryKey_sections);
    div.setAttribute('style','display:none;');

    var code = dom.id('bbcodes').cloneNode(true).innerHTML;
    while(code.indexOf('message') != -1)
    code = code.replace('message','secededWriteTextArea_'+primaryKey_sections);
    div.innerHTML = code;
    dom.id('bbcodes').parentNode.insertBefore(div,dom.id('bbcodes'));

    }

  var tr = dom.n('tr');
  var td = dom.n('td');
  td.setAttribute('colspan',primaryKey_sections+1);
  td.innerHTML = result;
  tr.appendChild(td);

  dom.id('submit_row').parentNode.insertBefore(tr,dom.id('submit_row'));
  }


function getCodesPositions(text)
  {
  var text = text;
  var patterns = new Array(/\[secede=(.+)\]/,/\[secede\]/,'[secede/]','[secede /]');

  for(var i = 0, len = patterns.length, pattern; i < len; i++)
    {
    var pattern = patterns[i];
    if(typeof(pattern) != 'object')
      {
      var first = text.indexOf(pattern);
      }
    else
      {
      var first = text.search(pattern);
      }

    if(first != -1)
      {
      if(typeof(pattern) != 'object')
        {
        last = first + pattern.length;
        return new Array(first,last,false);
        }
      else
        {
        var matched = text.match(pattern)
        last = first + matched[0].length;
        return new Array(first,last,matched);
        }

      }
    };
  return new Array(false);
  }



function html()
  {
  this.n = function(type) // Returns a new element of the type [type]
    {
    return document.createElement(type);
    }

  this.text = function(c) // Returns a new textnode with the content [c]
    {
    return document.createTextNode(c);
    }

  this.img = function(c) // Returns a new textnode with the content [c]
    {
    if(c)
      {
      var img = new Image();
      img.src = c;
      return img;
      }
    return new Image();
    }

  // Search functions

  this.id = function(type)  // Returns the element with the id [type]
    {
    return document.getElementById(type);
    }

  this.tag = function(type) // Returns the list ob elements with the tag given in [type]
    {
    return document.getElementsByTagName(type);
    }

  this.name = function(type) // Returns the list ob elements with the tag name given in [type]
    {
    return document.getElementsByName(type);
    }

  this.class = function(type) // Returns the list ob elements with the class given in [type]
    {
    return document.getElementsByClassName(type);
    }

  this.findByAttr = function(obj,attr,value) // Returns a list ob elements that have an attribute [attr] with the value [value]
    {
    var len = obj.getElementsByTagName('*').length;
    var list = new Object();
    var  a = 0;
    for(var i = 0; i < len; i++)
      {
      if(obj.getElementsByTagName('*')[i][attr] == value)
        {
        list[a] = obj.getElementsByTagName('*')[i];
        a++;
        }
      }
    list['length'] = a;
    return list;
    }

  this.findByInner = function(obj,value) // Returns a list ob elements that contain the value [value]
    {
    var len = obj.getElementsByTagName('*').length;
    var list = new Object();
    var  a = 0;
    for(var i = 0; i < len; i++)
      {
      if(obj.getElementsByTagName('*')[i].firstChild)
        {
        if(obj.getElementsByTagName('*')[i].firstChild.data)
          {
          if(obj.getElementsByTagName('*')[i].firstChild.data.indexOf(value) != -1)
            {
            list[a] = obj.getElementsByTagName('*')[i];
            a++;
            }
          }
        }
      }
    list['length'] = a;
    return list;
    }

  this.appendChilds = function(obj)
    {
    for(var i = 1; i < arguments.length; i++)
      arguments[0].appendChild(arguments[i]);
    }

  this.removeChilds = function(obj)
    {
    while(obj.firstChild)
      {
      obj.removeChild(obj.firstChild);
      }
    }

  this.dumpObj = function(e,html,count)
    {
    if(!count)
      count = 0;
    var spaces = '  ';
    for(var i = 0; i < count; i++)
      spaces += '  ';
    if(html)
      n = '<br />\n';
    else
      n = '\n';
    var o = '( '+typeof(e)+' )'+n;
    for(var p in e)
      o+= spaces+p+' = '+'( '+typeof(e[p])+' ) '+(typeof(e[p]) == 'object'?(this.dumpObj(e[p],html,(count+2))):e[p])+n;
    return o;
    }

  this.trim = function(str)
    {
    return str.replace(/^\s+/, '').replace(/\s+$/, '');
    }


  // Gets the element (target) of a DOM Mouse Event Object
  // Returns false if there's no element
  this.mouseEventTarget = function(e)
    {
    if(e.target) // Mozilla, Opera, Safari
      return e.target;
    else if (e.srcElement) // IE
      return e.srcElement;
    else // No Target
      return false;
    }



  // Flexible Javascript Events by John Resig (ejohn.org)
  // http://ejohn.org/projects/flexible-javascript-events/
  this.addEvent = function( obj, type, fn )
    {
    if(obj.attachEvent)
      {
      obj['e'+type+fn] = fn;
      obj[type+fn] = function(){obj['e'+type+fn](window.event);}
      obj.attachEvent( 'on'+type, obj[type+fn] );
      }
    else
      obj.addEventListener( type, fn, false );
    }

  this.removeEvent = function( obj, type, fn )
    {
    if(obj.detachEvent)
      {
      obj.detachEvent( 'on'+type, obj[type+fn] );
      obj[type+fn] = null;
      }
    else
      obj.removeEventListener( type, fn, false );
    }



  return true;
  }