Seite 1 von 1

Mozillafix für BBCode und Smilies beim Posten

Verfasst: 18.09.2006 11:28
von cYbercOsmOnauT
Dieses Snippet behebt das Problem, dass die Cursorposition bei Browsern, die die Geckoengine verwenden (z.B. Mozilla, Netscape, Firefox) beim Anklicken von Buttons und Smilies (Postfenster) verloren geht.

Das Snippet wurde aus dem "BBCodes & smilies enhancement" Mod von GolfExpert entnommen. Die Codeteile sind zumeist gecodet von markus_petrux und TerraFrost.

Code: Alles auswählen

#
#-----[ OPEN ]------------------------------------------
#
templates/subSilver/posting_body.tpl

#
#-----[ FIND ]------------------------------------------
#
// Shows the help messages in the helpline window

#
#-----[ BEFORE, ADD ]------------------------------------------
#
// Start add - BBCodes & smilies enhancement MOD
var baseHeight;
function initInsertions() {
   if (is_ie && typeof(baseHeight) != 'number') baseHeight = document.selection.createRange().duplicate().boundingHeight;
}
// End add - BBCodes & smilies enhancement MOD

#
#-----[ FIND ]------------------------------------------
#
# in der function emoticon(text)
#
      var caretPos = txtarea.caretPos;
      caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == ' ' ? text + ' ' : text;
      txtarea.focus();

#
#-----[ REPLACE WITH ]------------------------------------------
#
// Start add - BBCodes & smilies enhancement MOD
      if (baseHeight != txtarea.caretPos.boundingHeight) {
         txtarea.focus();
         storeCaret(txtarea);
      }
// End add - BBCodes & smilies enhancement MOD
      var caretPos = txtarea.caretPos;
      caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == ' ' ? text + ' ' : text;
      txtarea.focus();
// Start add - BBCodes & smilies enhancement MOD
   } else
   if ((txtarea.selectionEnd | txtarea.selectionEnd == 0) && (txtarea.selectionStart | txtarea.selectionStart == 0))
   {
      mozInsert(txtarea, text, "");
      return;
// End add - BBCodes & smilies enhancement MOD

#
#-----[ FIND ]------------------------------------------
#
      if (!theSelection) {
      
#
#-----[ AFTER, ADD ]------------------------------------------
#
// Start add - BBCodes & smilies enhancement MOD
         if (txtarea.createTextRange && txtarea.caretPos) {
            if (baseHeight != txtarea.caretPos.boundingHeight) {
               txtarea.focus();
               storeCaret(txtarea);
            }
            var caretPos = txtarea.caretPos;
            var text = bbopen + bbclose;
            caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == ' ' ? caretPos.text + text + ' ' : caretPos.text + text;
         } else
// End add - BBCodes & smilies enhancement MOD

#
#-----[ FIND ]------------------------------------------
#
   else if (txtarea.selectionEnd && (txtarea.selectionEnd - txtarea.selectionStart > 0))
   {
      mozWrap(txtarea, bbopen, bbclose);
      
#
#-----[ REPLACE WITH ]------------------------------------------
#
// Start replacement - BBCodes & smilies enhancement MOD
   else if ((txtarea.selectionEnd | txtarea.selectionEnd == 0) && (txtarea.selectionStart | txtarea.selectionStart == 0))
   {
      mozInsert(txtarea, bbopen, bbclose);
// End replacement - BBCodes & smilies enhancement MOD

#
#-----[ FIND ]------------------------------------------
#
      while (bbcode[0]) {
         butnumber = arraypop(bbcode) - 1;
         
#
#-----[ AFTER, ADD ]------------------------------------------
#
// Start add - BBCodes & smilies enhancement MOD
         if (txtarea.createTextRange && txtarea.caretPos) {
            if (baseHeight != txtarea.caretPos.boundingHeight) {
               txtarea.focus();
               storeCaret(txtarea);
            }
            var caretPos = txtarea.caretPos;
            var text = bbtags[butnumber + 1];
            caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == ' ' ? caretPos.text + text + ' ' : caretPos.text + text;
         } else
         if ((txtarea.selectionEnd | txtarea.selectionEnd == 0) && (txtarea.selectionStart | txtarea.selectionStart == 0))
         {
            mozInsert(txtarea, bbtags[butnumber + 1], "");
         } else
// End add - BBCodes & smilies enhancement MOD

#
#-----[ FIND ]------------------------------------------
#
      mozWrap(txtarea, bbtags[bbnumber], bbtags[bbnumber+1]);
      
#
#-----[ REPLACE WITH ]------------------------------------------
#
      mozInsert(txtarea, bbtags[bbnumber], bbtags[bbnumber+1]);
      
#
#-----[ FIND ]------------------------------------------
#
      while (bbcode[bblast]) {
            butnumber = arraypop(bbcode) - 1;
            
#
#-----[ AFTER, ADD ]------------------------------------------
#
// Start add - BBCodes & smilies enhancement MOD
            if (txtarea.createTextRange && txtarea.caretPos) {
               if (baseHeight != txtarea.caretPos.boundingHeight) {
                  txtarea.focus();
                  storeCaret(txtarea);
               }
               var caretPos = txtarea.caretPos;
               var text = bbtags[butnumber + 1];
               caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == ' ' ? caretPos.text + text + ' ' : caretPos.text + text;
            } else
            if ((txtarea.selectionEnd | txtarea.selectionEnd == 0) && (txtarea.selectionStart | txtarea.selectionStart == 0))
            {
               mozInsert(txtarea, bbtags[butnumber + 1], "");
            } else
// End add - BBCodes & smilies enhancement MOD

#
#-----[ FIND ]------------------------------------------
#
      if (imageTag && (bbnumber != 14)) {      // Close image tag before adding another
      
#
#-----[ AFTER, ADD ]------------------------------------------
#
// Start add - BBCodes & smilies enhancement MOD
         if (txtarea.createTextRange && txtarea.caretPos) {
            if (baseHeight != txtarea.caretPos.boundingHeight) {
               txtarea.focus();
               storeCaret(txtarea);
            }
            var caretPos = txtarea.caretPos;
            var text = bbtags[15];
            caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == ' ' ? caretPos.text + text + ' ' : caretPos.text + text;
         } else
         if ((txtarea.selectionEnd | txtarea.selectionEnd == 0) && (txtarea.selectionStart | txtarea.selectionStart == 0))
         {
            mozInsert(txtarea, bbtags[15], "");
         } else
// End add - BBCodes & smilies enhancement MOD

#
#-----[ FIND ]------------------------------------------
#
      // Open tag
      
#
#-----[ AFTER, ADD ]------------------------------------------
#
// Start add - BBCodes & smilies enhancement MOD
      if (bbnumber == 16) {
         var url = prompt("{L_BBCODE_URL}", "http://");

         if (url == null) {
            return;
         } else if (!url) {
            alert("{L_BBCODE_URL_ERRORS}" + "\n" + "\n" + "{L_BBCODE_URL_EMPTY}");
            return;
         } else {
            var title = prompt("{L_BBCODE_URL_TITLE}", "");

            if (title == null) {
               return;
            } else if (!title) {
               var text = "[url]" + url + "[/url]";
            } else {
               var text = "[url=" + url + "]" + title + "[/url]";
            }
         }

         if (txtarea.createTextRange && txtarea.caretPos) {
            if (baseHeight != txtarea.caretPos.boundingHeight) {
               txtarea.focus();
               storeCaret(txtarea);
            }
            var caretPos = txtarea.caretPos;
            caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == ' ' ? caretPos.text + text + ' ' : caretPos.text + text;
         } else
         if ((txtarea.selectionEnd | txtarea.selectionEnd == 0) && (txtarea.selectionStart | txtarea.selectionStart == 0))
         {
            mozInsert(txtarea, text, "");
         } else txtarea.value += text;
      } else {
         var text = bbtags[bbnumber];
         if (txtarea.createTextRange && txtarea.caretPos) {
            if (baseHeight != txtarea.caretPos.boundingHeight) {
               txtarea.focus();
               storeCaret(txtarea);
            }
            var caretPos = txtarea.caretPos;
            caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == ' ' ? caretPos.text + text + ' ' : caretPos.text + text;
         } else
         if ((txtarea.selectionEnd | txtarea.selectionEnd == 0) && (txtarea.selectionStart | txtarea.selectionStart == 0))
         {
            mozInsert(txtarea, bbtags[bbnumber], "");
         } else
// End add - BBCodes & smilies enhancement MOD

#
#-----[ FIND ]------------------------------------------
#
      eval('document.post.addbbcode'+bbnumber+'.value += "*"');
      
#
#-----[ AFTER, ADD ]------------------------------------------
#
// Start add - BBCodes & smilies enhancement MOD
      }
// End add - BBCodes & smilies enhancement MOD

#
#-----[ FIND ]------------------------------------------
#
//-->
</script>

#
#-----[ BEFORE, ADD ]------------------------------------------
#
// Start add - BBCodes & smilies enhancement MOD
function mozInsert(txtarea, openTag, closeTag)
{
        var scrollTop = ( typeof(txtarea.scrollTop) == 'number' ? txtarea.scrollTop : -1 );

        if (txtarea.selectionEnd > txtarea.value.length) { txtarea.selectionEnd = txtarea.value.length; }

        var startPos = txtarea.selectionStart;
        var endPos = txtarea.selectionEnd+openTag.length;

        txtarea.value=txtarea.value.slice(0,startPos)+openTag+txtarea.value.slice(startPos);
        txtarea.value=txtarea.value.slice(0,endPos)+closeTag+txtarea.value.slice(endPos);

        txtarea.selectionStart = startPos+openTag.length;
        txtarea.selectionEnd = endPos;
        txtarea.focus();

        if( scrollTop >= 0 ) { txtarea.scrollTop = scrollTop; }
}
// End add - BBCodes & smilies enhancement MOD

#
#-----[ FIND ]------------------------------------------
#
           <textarea name="message" rows="20" cols="35" wrap="virtual" style="width:600px" tabindex="3" class="post" onselect="storeCaret(this);" onclick="storeCaret(this);" onkeyup="storeCaret(this);" onfocus="initInsertions();">{MESSAGE}</textarea><br />
          
#
#-----[ REPLACE WITH ]------------------------------------------
#
           <textarea name="message" rows="20" cols="35" wrap="virtual" style="width:600px" tabindex="3" class="post" onselect="storeCaret(this);" onclick="storeCaret(this);" onkeyup="storeCaret(this);">{MESSAGE}</textarea><br />

#
#-----[ SAVE/CLOSE ALL FILES ]------------------------------------------
#
# EoM