// ==UserScript==
// @name         vBulletin - Show Postnumber
// @namespace    http://userscripts.org/people/5587
// @description  Shows [post=n]title[/post] near # postnumber, so internal links to single posts in vBulletin-forums could be done easy. Works in linear and hybrid mode only! Zeigt [post=n]Titel[/post] neben # Beitragnummer - erleichtert somit das Verlinken auf einzelne Beitraege in vBulletin-Foren. Funktioniert nur in Linear- und Hybriddarstellung!
// @source       http://userscripts.org/scripts/show/3670
// @identifier   http://userscripts.org/scripts/source/3670.user.js
// @version      0.88
// @date         2007-11-11
// @creator      Arne Dieckmann (aka "Mithrandir")
// @include      */showthread.php*
// @include      http://www.vbseo.com/f*
// @include      http://www.apfeltalk.de/forum/*
// ==/UserScript==

(function () {
// Anfang der moeglichen Anpassungen - Stil der anzuzeigenden Strings:
// Fuer Postlinks:
var p_postcolor = '#f9f9f9';           // moeglich waere auch 'inherit' - dann wird die Standardfarbe eingesetzt
var p_postbackground = 'transparent';  // Hintergrundfarbe/art - fuer rot: '#f00'
var p_postfontsize = '0.8em';          // Schriftgroesse (mit 0.8em wird sie kleiner)
// Hover-Text des anzuzeigenden Strings (title-Attribut):
var p_posthover = 'Kopieren Sie die Zeichenfolge, um auf diesen Beitrag verweisen zu k&ouml;nnen';
// Fuer Threadlink:
var p_threadlink = 1;                  // 1= auch [thread=n]Titel[/thread] in Navbar anzeigen
var p_threadfontsize = '0.7em';        // Schriftgroesse
var p_threadhover = 'Kopieren Sie die Zeichenfolge, um auf dieses Thema verweisen zu k&ouml;nnen';
// Maximale Laenge fuer Titel (0 fuer keine Aenderung):
var p_titlelen = 55;
// Ende der moeglichen Anpassungen


// Ab hier nichts mehr aendern!
// Konstanten
// String des Skriptes, welches nachher im Kopf der Seite eingefuegt wird:
var c_selectscript = '\n<!--\n';
c_selectscript += 'function selectLinkHelp(sId){\n';
c_selectscript += '  var myElement = document.getElementById(sId);\n';
c_selectscript += '  if (window.getSelection) {\n';
c_selectscript += '    var selection = window.getSelection();\n';
c_selectscript += '    if (selection.setBaseAndExtent) { /* for Safari */\n';
c_selectscript += '      selection.setBaseAndExtent(myElement, 0, myElement, 1);\n';
c_selectscript += '    } else { /* for FF, Opera */\n';
c_selectscript += '      var range = document.createRange();\n';
c_selectscript += '      range.selectNodeContents(myElement);\n';
c_selectscript += '      selection.removeAllRanges();\n';
c_selectscript += '      selection.addRange(range);\n';
c_selectscript += '    }\n';
c_selectscript += '  } else { /* for IE */\n';
c_selectscript += '    var range = document.body.createTextRange();\n';
c_selectscript += '    range.moveToElementText(myElement);\n';
c_selectscript += '    range.select();\n';
c_selectscript += '  }\n';
c_selectscript += '}\n';
c_selectscript += '\n// -->\n';

//Fuer Erkennung der Postlinks
var c_seekanchor = '#<a href=';        // erster Suchstring
var c_seekpostid ='id=\"postcount';    // zweiter Suchstring
var c_seekname = '\" name=\"';         // dritter Suchstring
var c_seekanchorie = '#<a';            // erster Suchstring im IE
var c_seekpostidie = 'postcount';      // zweiter Suchstring im IE
var c_seeknameie = ' name=';           // dritter Suchstring im IE

//Fuer Erkennung des Threadlinks
var c_tlinkseek = 'sendmessage.php?do=sendtofriend';
var c_tlinkextr = 'sendmessage.php?do=sendtofriend&amp;t=';
var c_tlinkrepl = 'sendmessage.php?do=sendtofriend&t=';
// Ende Konstanten


//Variablen, die im weiteren Verlauf benoetigt werden
var v_markscript;                      // Fuer Markierscript
var v_title='';                        // Fuer Titel
var v_IH;                              // nimmt innerHTML auf
var v_allTDs, v_thisTD;                // Fuer Durchlauf der TD
var v_xTD, v_nTD=0;                    // speichert den Index der TDs
// Speichern die Fundstellen der Suchbegriffe:
var v_foundanchor,v_foundid, v_foundname, v_foundthreadanchor;
var v_postnr, v_threadnr = '';         // nehmen Post- und Thread-Nummer auf
var v_browser='';
// Ende Variablen


// Hilfsfunktionen
function fctbrowsercheck () {
  // einfacher Browsertest
  if (window.opera)
  {
    return 'opera';
  }
  else if (navigator.appName.indexOf("Explorer") != -1)
  {
    return 'ie';
  }
  else
  {
    return 'moz';
  }
}

function fcttrim(a_str) {
  // entfernt Leerzeichen an Anfang und Ende eines Textes
  return a_str.replace(/ +/g, ' ').replace(/^\s+/g, '').replace(/\s+$/g, '');
}

function fctihtrim(a_str) {
  // aehnlich wie fcttrim, allerdings auf HTML bezogen
  return a_str.replace(/\n/g, '').replace(/\r/g, '').replace(/>\t+/, '>').replace(/>\s+/, '>');
}

function fcttitle(a_str){
  // kuerzt den Titel auf x Zeichen - s. p_titlelen (es wird nicht im Wort gekuerzt)
  a_str = fcttrim(a_str);
  if(a_str.length > p_titlelen && p_titlelen > 0) {
    WordWrap = a_str.slice(0,a_str.lastIndexOf(' ',p_titlelen));
    if (WordWrap.length<a_str.length){WordWrap += '&nbsp;&#133';}
    }
  else {
    WordWrap = a_str;
  }
return WordWrap.replace(/</g,'&lt;').replace(/'/g,'&apos;').replace(/"/g,'&quot;');
}

function fctIH(ih,a_start,a_number,a_title,a_type) {
  // veraendert innerHTML: ergaenzt um Post- oder Threadlink.
  if (a_type == 'p') {
    return ih.slice(0,a_start)+"<span id=p"+a_number+" style='background:"+p_postbackground+";color:"+p_postcolor+";cursor:help;font-size:"+p_postfontsize+";' title='"+p_posthover+"' onclick='selectLinkHelp(this.id)'>[post="+a_number+"]"+a_title+"[/post]</span> "+ih.slice(a_start);
    }
  else {
    return ih.slice(0,a_start+4)+" <span id=t"+a_number+" style='cursor:help;' title='"+p_threadhover+"' onclick='selectLinkHelp(this.id)'><span style='font-size:"+p_threadfontsize+"'>[thread="+a_number+"]</span><strong>"+a_title+"</strong><span style='font-size:"+p_threadfontsize+";'>[/thread]</span></span>";
  }
}

function fctgivenumber(ih,a_type) {
  // extrahiert die Post- bzw. Threadnummer mittels doppelt ausgefuehrter reg. Expressions
  var b_return='';
  if (a_type == 'p') {
    // alle Zahlen ab '...postcount':
    b_return=ih.match(/postcount\d+/)[0].match(/\d+/);
    }
  else {
    // einige Browser (z.B. IE) veraendern leider innerHTML, deshalb innerHTML auf einen Stand bringen:
    ih=ih.replace(c_tlinkrepl,c_tlinkextr);
    // alle Zahlen ab '...sendmessage.php?do=sendtofriend&amp;t=' (? wurde maskiert!):
    b_return=ih.match(/sendmessage.php\?do=sendtofriend&amp;t=\d+/)[0].match(/\d+/);
  }
  return b_return;
}
// Ende Hilfsfunktionen


// Das eigentliche Skript
// Die weiter oben befuellte String-Variable als Script-Element im Head einfuegen
// Dieses Skript wird beim onclick-Event auf z.B. [post=n]Titel[/post] ausgeloest
// - damit ist der Post- und/oder Threadlink mit einem einfachen Klick komplett markiert.
v_markscript = document.createElement('script');
v_markscript.type = 'text/javascript';
document.getElementsByTagName('head')[0].appendChild(v_markscript);
v_markscript.text = c_selectscript;
// Kontrolle auf Browser
v_browser = fctbrowsercheck();
if (v_browser == 'ie') {
  // Suchbegriffe im IE veraendern:
  c_seekanchor=c_seekanchorie;
  c_seekpostid=c_seekpostidie;
  c_seekname=c_seeknameie;
}
// alle Tabellenzellen durchlaufen und ggf. veaendern
v_allTDs = document.getElementsByTagName('td');
for (v_xTD = 0; v_xTD < v_allTDs.length; v_xTD++) {
  v_thisTD = v_allTDs[v_xTD];
  v_IH = v_thisTD.innerHTML.toLowerCase();
  if (v_thisTD.className == 'navbar') {
    v_nTD = v_xTD;
    v_foundthreadanchor = v_IH.indexOf('</a>');
    if (v_browser != 'moz') {
      v_title = fcttitle(v_thisTD.innerText);
      } else {
      v_title = fcttitle(v_thisTD.textContent);
    }
  }
  if (p_threadlink == 1) {
    if (v_IH.indexOf(c_tlinkseek) > 0) {
      v_threadnr = fctgivenumber(v_IH,'t');
    }
  }
  if (v_thisTD.className == 'thead') {
    // Falls vorher TD mit Klasse 'navbar' nicht gefunden wurde, Titel des Dokuments verwenden:
    if (v_title.length == 0) {
      v_title = fcttitle(document.title);
    }
    v_foundanchor = v_IH.indexOf(c_seekanchor);
    v_foundid = v_IH.indexOf(c_seekpostid);
    v_foundname = v_IH.indexOf(c_seekname,v_foundid);
    if (v_foundanchor != -1 && v_foundid != -1 && v_foundname != -1) {
      v_postnr=fctgivenumber(v_IH,'p');
      v_thisTD.innerHTML = fctIH(v_thisTD.innerHTML,v_foundanchor,v_postnr,v_title,'p');
    }
  }
  if (v_nTD > 0 && p_threadlink == 1 && v_threadnr.length > 0) {
    v_allTDs[v_nTD].innerHTML=fctIH(v_allTDs[v_nTD].innerHTML,v_foundthreadanchor,v_threadnr,v_title,'t');
    v_nTD=0;
  }
}
})();