Orlando: BB-Codes & Opera & Cursorposition

Werte Gemeinde,

ich poste regelmäßig in einem Board, das hinsichtlich der BB-Codes furchtbar antiquierten JS-Rotz nutzt. Im Grunde müsste man alles neu schreiben oder das System upgraden, das spielt's aber nicht.

Mir geht's nur um die Nutzung mit Opera. Alle BB-Codes werden nämlich am Ende der textarea eingefügt und nicht wie gewünscht an der aktuellen Position des Cursors. Irgendwie muss also die Funktionalität der BBCodes angeflanscht werden, ich Antiscripter krieg's nicht hin.

Über den Rest (navigator.userAgent :-)) will ich explizit nicht diskutieren, da offensichtlich und dennoch sinnlos. Bin nämlich kein Admin, sondern als Nutzer auf der Suche nach einem möglichst kleinen "Patch". Wo muss man schrauben?

Hier kommt die ungekürzte Wurst:

var bbtags   = new Array();  
  
// browser detection  
var myAgent   = navigator.userAgent.toLowerCase();  
var myVersion = parseInt(navigator.appVersion);  
var is_ie   = ((myAgent.indexOf("msie") != -1)  && (myAgent.indexOf("opera") == -1));  
var is_win   =  ((myAgent.indexOf("win")!=-1) || (myAgent.indexOf("16bit")!=-1));  
  
function setmode(modeValue) {  
 	document.cookie = "bbcodemode="+modeValue+"; path=/; expires=Wed, 1 Jan 2020 00:00:00 GMT;";  
}  
  
function normalMode(theForm) {  
	if (theForm.mode[0].checked) {  
		return true;  
	}  
	else {  
		return false;  
	}  
}  
  
function getArraySize(theArray) {  
 	for (i = 0; i < theArray.length; i++) {  
  		if ((theArray[i] == "undefined") || (theArray[i] == "") || (theArray[i] == null)) return i;  
	}  
 	  
 	return theArray.length;  
}  
  
function pushArray(theArray, value) {  
 	theArraySize = getArraySize(theArray);  
 	theArray[theArraySize] = value;  
}  
  
function popArray(theArray) {  
	theArraySize = getArraySize(theArray);  
 	retVal = theArray[theArraySize - 1];  
 	delete theArray[theArraySize - 1];  
 	return retVal;  
}  
  
  
function smilie(theSmilie) {  
	addText(" " + theSmilie, "", false, document.bbform);  
}  
  
function closetag(theForm) {  
 	if (!normalMode(theForm)) {  
  		if (bbtags[0]) addText("[/"+ popArray(bbtags) +"]", "", false, theForm);  
  	}  
 	  
 	setFocus(theForm);  
}  
  
function closeall(theForm) {  
 	if (!normalMode(theForm)) {  
  		if (bbtags[0]) {  
   			while (bbtags[0]) {  
    				addText("[/"+ popArray(bbtags) +"]", "", false, theForm);  
   			}  
   		}  
 	}  
 	  
 	setFocus(theForm);  
}  
  
  
function fontformat(theForm,theValue,theType) {  
 	setFocus(theForm);  
  
 	if (normalMode(theForm)) {  
  		if (theValue != 0) {  
  
   			var selectedText = getSelectedText(theForm);  
   			var insertText = prompt(font_formatter_prompt+" "+theType, selectedText);  
   			if ((insertText != null) && (insertText != "")) {  
    				addText("["+theType+"="+theValue+"]"+insertText+"[/"+theType+"]", "", false, theForm);  
    			}  
  		}  
 	}  
 	else {  
		if(addText("["+theType+"="+theValue+"]", "[/"+theType+"]", true, theForm)) {  
			pushArray(bbtags, theType);	  
		}  
	}  
  
 	theForm.sizeselect.selectedIndex = 0;  
 	theForm.fontselect.selectedIndex = 0;  
 	theForm.colorselect.selectedIndex = 0;  
 	  
 	setFocus(theForm);  
}  
  
  
function bbcode(theForm, theTag, promptText) {  
	if ( normalMode(theForm) || (theTag=="IMG")) {  
		var selectedText = getSelectedText(theForm);  
		if (promptText == '' || selectedText != '') promptText = selectedText;  
		  
		inserttext = prompt(((theTag == "IMG") ? (img_prompt) : (tag_prompt)) + "\n[" + theTag + "]xxx[/" + theTag + "]", promptText);  
		if ( (inserttext != null) && (inserttext != "") ) {  
			addText("[" + theTag + "]" + inserttext + "[/" + theTag + "]", "", false, theForm);  
		}  
	}  
	else {  
		var donotinsert = false;  
  		for (i = 0; i < bbtags.length; i++) {  
   			if (bbtags[i] == theTag) donotinsert = true;  
  		}  
  		  
  		if (!donotinsert) {  
   			if(addText("[" + theTag + "]", "[/" + theTag + "]", true, theForm)){  
				pushArray(bbtags, theTag);  
			}  
  		}  
		else {  
			var lastindex = 0;  
			  
			for (i = 0 ; i < bbtags.length; i++ ) {  
				if ( bbtags[i] == theTag ) {  
					lastindex = i;  
				}  
			}  
			  
			while (bbtags[lastindex]) {  
				tagRemove = popArray(bbtags);  
				addText("[/" + tagRemove + "]", "", false, theForm);  
			}  
		}  
	}  
}  
  
function namedlink(theForm,theType) {  
	var selected = getSelectedText(theForm);  
  
	var linkText = prompt(link_text_prompt,selected);  
	var prompttext;  
  
	if (theType == "URL") {  
 		prompt_text = link_url_prompt;  
 		prompt_contents = "http://";  
	}  
	else {  
		prompt_text = link_email_prompt;  
		prompt_contents = "";  
		}  
  
	linkURL = prompt(prompt_text,prompt_contents);  
  
  
	if ((linkURL != null) && (linkURL != "")) {  
		var theText = '';  
		  
		if ((linkText != null) && (linkText != "")) {  
   			theText = "["+theType+"="+linkURL+"]"+linkText+"[/"+theType+"]";  
   		}  
		else {  
			theText = "["+theType+"]"+linkURL+"[/"+theType+"]";  
		}  
  		  
  		addText(theText, "", false, theForm);  
 	}  
}  
  
  
function dolist(theForm) {  
 	listType = prompt(list_type_prompt, "");  
 	if ((listType == "a") || (listType == "1")) {  
  		theList = "[list="+listType+"]\n";  
  		listEend = "[/list="+listType+"] ";  
 	}  
 	else {  
  		theList = "[list]\n";  
  		listEend = "[/list] ";  
 	}  
 	  
 	listEntry = "initial";  
 	while ((listEntry != "") && (listEntry != null)) {  
  		listEntry = prompt(list_item_prompt, "");  
  		if ((listEntry != "") && (listEntry != null)) theList = theList+"[*]"+listEntry+"\n";  
 	}  
 	  
 	addText(theList + listEend, "", false, theForm);  
}  
  
  
function addText(theTag, theClsTag, isSingle, theForm)  
{  
	var isClose = false;  
	var message = theForm.message;  
	var set=false;  
  	var old=false;  
  	var selected="";  
  	  
  	if(navigator.appName=="Netscape" &&  message.textLength>=0 ) { // mozilla, firebird, netscape  
  		if(theClsTag!="" && message.selectionStart!=message.selectionEnd) {  
  			selected=message.value.substring(message.selectionStart,message.selectionEnd);  
  			str=theTag + selected+ theClsTag;  
  			old=true;  
  			isClose = true;  
  		}  
		else {  
			str=theTag;  
		}  
		  
		message.focus();  
		start=message.selectionStart;  
		end=message.textLength;  
		endtext=message.value.substring(message.selectionEnd,end);  
		starttext=message.value.substring(0,start);  
		message.value=starttext + str + endtext;  
		message.selectionStart=start;  
		message.selectionEnd=start;  
		  
		message.selectionStart = message.selectionStart + str.length;  
		  
		if(old) { return false; }  
		  
		set=true;  
		  
		if(isSingle) {  
			isClose = false;  
		}  
	}  
	if ( (myVersion >= 4) && is_ie && is_win) {  // Internet Explorer  
		if(message.isTextEdit) {  
			message.focus();  
			var sel = document.selection;  
			var rng = sel.createRange();  
			rng.colapse;  
			if((sel.type == "Text" || sel.type == "None") && rng != null){  
				if(theClsTag != "" && rng.text.length > 0)  
					theTag += rng.text + theClsTag;  
				else if(isSingle)  
					isClose = true;  
	  
				rng.text = theTag;  
			}  
		}  
		else{  
			if(isSingle) isClose = true;  
	  
			if(!set) {  
      				message.value += theTag;  
      			}  
		}  
	}  
	else  
	{  
		if(isSingle) isClose = true;  
  
		if(!set) {  
      			message.value += theTag;  
      		}  
	}  
  
	message.focus();  
	  
	return isClose;  
}	  
  
  
function getSelectedText(theForm) {  
	var message = theForm.message;  
	var selected = '';  
	  
	if(navigator.appName=="Netscape" &&  message.textLength>=0 && message.selectionStart!=message.selectionEnd )  
  		selected=message.value.substring(message.selectionStart,message.selectionEnd);	  
  	  
	else if( (myVersion >= 4) && is_ie && is_win ) {  
		if(message.isTextEdit){  
			message.focus();  
			var sel = document.selection;  
			var rng = sel.createRange();  
			rng.colapse;  
			  
			if((sel.type == "Text" || sel.type == "None") && rng != null){  
				if(rng.text.length > 0) selected = rng.text;  
			}  
		}	  
	}  
		  
  	return selected;  
}  
  
function setFocus(theForm) {  
 	theForm.message.focus();  
}

Merci.

Roland

  1. Moin allerseits,

    Über den Rest (navigator.userAgent :-)) will ich explizit nicht diskutieren, da offensichtlich und dennoch sinnlos. Bin nämlich kein Admin, sondern als Nutzer auf der Suche nach einem möglichst kleinen "Patch". Wo muss man schrauben?

    Entschuldige, ich verstehe nicht ganz: Was nützt dir der Patch? Kannst du ihn in die Seite einbauen, oder handelt es sich um deine Seite?

    Grüße, JN

    --
    ie:{ fl:( br:^ va:| ls:[ fo:| rl:? n4:? ss:| de:] js:| ch:? sh:( mo:| zu:)
    http://www.johny7.de
    1. Entschuldige, ich verstehe nicht ganz: Was nützt dir der Patch? Kannst du ihn in die Seite einbauen, oder handelt es sich um deine Seite?

      Ist nicht meine, aber ich würde den Admins das korrigierte Script zukommen lassen. Nachdem ich den Fehler angesprochen habe, hat's ein Initiativstrafe gesetzt.

      Roland

  2. Hi,

    Wo muss man schrauben?

    Wenn das einfügen von Codes grundsätzlich funktioniert, und nur die Position falsch ist - dann sind vermutlich erst mal die Funktionen

    function addText(theTag, theClsTag, isSingle, theForm)

    und

    function getSelectedText(theForm) {

    interessant.

    MfG ChrisB

    --
    Light travels faster than sound - that's why most people appear bright until you hear them speak.
    1. Wenn das einfügen von Codes grundsätzlich funktioniert, und nur die Position falsch ist - dann sind vermutlich erst mal die Funktionen

      function addText(theTag, theClsTag, isSingle, theForm)
      und
      function getSelectedText(theForm) {
      interessant.

      Sowie fontformat(theForm,theValue,theType), smilie(theSmilie) usw. Der Murks zieht sich ja durch alle Funktionen.

      Roland

      1. Hi,

        Der Murks zieht sich ja durch alle Funktionen.

        Also zumindest das (überschaubarere) Scripte aus dem Artikel Formulare: Text an Cursorposition einfügen funktioniert im Opera 10 erst mal wie versprochen.

        Vielleicht lässt sich ja, wenn man dem Umgang mit der Selection dort und im anderen Script vergleicht, etwas schneller auf die Fehlerursache schliessen.

        MfG ChrisB

        --
        Light travels faster than sound - that's why most people appear bright until you hear them speak.
        1. Funzt™.

          Nur dieses Fragment ist mir rätselhaft, was tut's?

          if(isSingle) {  
            isClose = false;  
          }
          

          Roland

          1. Hi,

            Nur dieses Fragment ist mir rätselhaft, was tut's?

            if(isSingle) {

            isClose = false;
            }

              
            isClose wird am Ende von attText zurückgegeben;  
            es gibt nur zwei Stellen, an denen die Rückgabe von attText ausgewertet wird - wenn diese true ist, wird der aktuelle Tag in das Array bbtags eingefügt.  
            Und das wiederum wird dann u.a. in den Funktionen closetag/closeall ausgewertet, um noch offene Tags zu schliessen.  
              
            Weiter schaue ich auch noch nicht durch.  
              
            MfG ChrisB  
              
            
            -- 
            Light travels faster than sound - that's why most people appear bright until you hear them speak.
            
            1. isClose wird am Ende von attText zurückgegeben;
              es gibt nur zwei Stellen, an denen die Rückgabe von attText ausgewertet wird - wenn diese true ist, wird der aktuelle Tag in das Array bbtags eingefügt.
              Und das wiederum wird dann u.a. in den Funktionen closetag/closeall ausgewertet, um noch offene Tags zu schliessen.

              Was mir nicht klar ist, sind die unterschiedlichen Werte je nach Browserversion im alten Script.

              Die Browserweiche ist rausgeflogen und addText() funktioniert so weit, closetag/closeall sind kaputt. :-(

              Roland