From eb1f15bc8b7b7a284b25b2c9b9942714b6848ebc Mon Sep 17 00:00:00 2001
From: Joas Schilling <nickvergessen@gmx.de>
Date: Sat, 12 Nov 2011 14:59:11 +0100
Subject: [ticket/8996] Also fix the BBCode bug in subsilver2 and acp

---
 phpBB/adm/style/editor.js | 68 ++++++++++++++++++++++++++---------------------
 1 file changed, 37 insertions(+), 31 deletions(-)

(limited to 'phpBB/adm/style')

diff --git a/phpBB/adm/style/editor.js b/phpBB/adm/style/editor.js
index 217aa699e2..600fa254cf 100644
--- a/phpBB/adm/style/editor.js
+++ b/phpBB/adm/style/editor.js
@@ -28,8 +28,8 @@ function helpline(help)
 /**
 * Fix a bug involving the TextRange object. From
 * http://www.frostjedi.com/terra/scripts/demo/caretBug.html
-*/ 
-function initInsertions() 
+*/
+function initInsertions()
 {
 	var doc;
 	if(document.forms[form_name])
@@ -66,7 +66,7 @@ function bbstyle(bbnumber)
 	else
 	{
 		insert_text('[*]');
-		document.forms[form_name].elements[text_name].focus();		
+		document.forms[form_name].elements[text_name].focus();
 	}
 }
 
@@ -76,7 +76,7 @@ function bbstyle(bbnumber)
 function bbfontstyle(bbopen, bbclose)
 {
 	theSelection = false;
-		
+
 	var textarea = document.forms[form_name].elements[text_name];
 
 	textarea.focus();
@@ -84,14 +84,10 @@ function bbfontstyle(bbopen, bbclose)
 	if ((clientVer >= 4) && is_ie && is_win)
 	{
 		// Get text selection
-		theSelection = document.selection.createRange().text;
-
-		if (theSelection)
+		if (textarea.createTextRange && textarea.caretPos)
 		{
-			// Add tags around selection
-			document.selection.createRange().text = bbopen + theSelection + bbclose;
-			document.forms[form_name].elements[text_name].focus();
-			theSelection = '';
+			textarea.caretPos.text = bbopen + textarea.caretPos.text + bbclose;
+			textarea.focus();
 			return;
 		}
 	}
@@ -102,10 +98,10 @@ function bbfontstyle(bbopen, bbclose)
 		theSelection = '';
 		return;
 	}
-	
+
 	//The new position for the cursor after adding the bbcode
 	var caret_pos = getCaretPosition(textarea).start;
-	var new_pos = caret_pos + bbopen.length;		
+	var new_pos = caret_pos + bbopen.length;
 
 	// Open tag
 	insert_text(bbopen + bbclose);
@@ -116,12 +112,12 @@ function bbfontstyle(bbopen, bbclose)
 	{
 		textarea.selectionStart = new_pos;
 		textarea.selectionEnd = new_pos;
-	}	
+	}
 	// IE
 	else if (document.selection)
 	{
-		var range = textarea.createTextRange(); 
-		range.move("character", new_pos); 
+		var range = textarea.createTextRange();
+		range.move("character", bbopen.length);
 		range.select();
 		storeCaret(textarea);
 	}
@@ -136,7 +132,7 @@ function bbfontstyle(bbopen, bbclose)
 function insert_text(text, spaces, popup)
 {
 	var textarea;
-	
+
 	if (!popup)
 	{
 		textarea = document.forms[form_name].elements[text_name];
@@ -159,18 +155,18 @@ function insert_text(text, spaces, popup)
 		mozWrap(textarea, text, '');
 		textarea.selectionStart = sel_start + text.length;
 		textarea.selectionEnd = sel_end + text.length;
-	}	
-	
+	}
+
 	else if (textarea.createTextRange && textarea.caretPos)
 	{
-		if (baseHeight != textarea.caretPos.boundingHeight) 
+		if (baseHeight != textarea.caretPos.boundingHeight)
 		{
 			textarea.focus();
 			storeCaret(textarea);
 		}
 		var caret_pos = textarea.caretPos;
 		caret_pos.text = caret_pos.text.charAt(caret_pos.text.length - 1) == ' ' ? caret_pos.text + text + ' ' : caret_pos.text + text;
-		
+
 	}
 	else
 	{
@@ -233,7 +229,7 @@ function addquote(post_id, username)
 			theSelection = theSelection.replace(/<br\/>/ig, '\n');
 			theSelection = theSelection.replace(/&lt\;/ig, '<');
 			theSelection = theSelection.replace(/&gt\;/ig, '>');
-			theSelection = theSelection.replace(/&amp\;/ig, '&');			
+			theSelection = theSelection.replace(/&amp\;/ig, '&');
 			theSelection = theSelection.replace(/&nbsp\;/ig, ' ');
 		}
 		else if (document.all)
@@ -268,7 +264,7 @@ function mozWrap(txtarea, open, close)
 	var selEnd = txtarea.selectionEnd;
 	var scrollTop = txtarea.scrollTop;
 
-	if (selEnd == 1 || selEnd == 2) 
+	if (selEnd == 1 || selEnd == 2)
 	{
 		selEnd = selLength;
 	}
@@ -292,7 +288,17 @@ function mozWrap(txtarea, open, close)
 */
 function storeCaret(textEl)
 {
-	if (textEl.createTextRange)
+	var keyCode = false;
+	if (is_ie)
+	{
+		keyCode = (event.keyCode) ? event.keyCode : event.charCode;
+	}
+
+	// Did the user press Shift (16), Ctrl (17) or Alt (18)?
+	// If so, we do not update the caretPos, so BBCodes can still be applied correctly.
+	var is_control_key = (keyCode == 16 || keyCode == 17 || keyCode == 18);
+
+	if ((!is_ie || !is_control_key) && (textEl.createTextRange))
 	{
 		textEl.caretPos = document.selection.createRange().duplicate();
 	}
@@ -328,7 +334,7 @@ function colorPalette(dir, width, height)
 			{
 				document.writeln('<tr>');
 			}
-			
+
 			for (b = 0; b < 5; b++)
 			{
 				color = String(numberList[r]) + String(numberList[g]) + String(numberList[b]);
@@ -368,9 +374,9 @@ function caretPosition()
 function getCaretPosition(txtarea)
 {
 	var caretPos = new caretPosition();
-	
+
 	// simple Gecko/Opera way
-	if (txtarea.selectionStart || txtarea.selectionStart == 0)
+	if (!is_ie && (txtarea.selectionStart || txtarea.selectionStart == 0))
 	{
 		caretPos.start = txtarea.selectionStart;
 		caretPos.end = txtarea.selectionEnd;
@@ -384,19 +390,19 @@ function getCaretPosition(txtarea)
 		// a new selection of the whole textarea
 		var range_all = document.body.createTextRange();
 		range_all.moveToElementText(txtarea);
-		
+
 		// calculate selection start point by moving beginning of range_all to beginning of range
 		var sel_start;
 		for (sel_start = 0; range_all.compareEndPoints('StartToStart', range) < 0; sel_start++)
 		{
 			range_all.moveStart('character', 1);
 		}
-	
+
 		txtarea.sel_start = sel_start;
-	
+
 		// we ignore the end value for IE, this is already dirty enough and we don't need it
 		caretPos.start = txtarea.sel_start;
-		caretPos.end = txtarea.sel_start;			
+		caretPos.end = txtarea.sel_start;
 	}
 
 	return caretPos;
-- 
cgit v1.2.1