/* ======================================== *
 * === Vkládání BB značek do <textarea> === *
 * ======================================== */

function insertText(inserted, cursor)
{
	try { // textarea může být neviditelná, to pak hází chybu, ale špatně se to testuje

	if(inserted != null)
	{
		inserted = inserted.toString().replace(/\r\n?/g, "\n");
		if(typeof cursor == "undefined") cursor = inserted.length;
	}

	var textarea = document.forms["postMsg"].elements["poslText"];
	if(textarea.readOnly) return;
	var scrollTop = textarea.scrollTop;
	var scrollHeight = textarea.scrollHeight;
	textarea.focus();
	
	if(typeof textarea.selectionStart != "undefined")
	{
		var sel = [], st = textarea.value.substr(0, textarea.selectionStart).replace(/\r\n?/g, "\n");
		sel[0] = Math.max(st.length + ((typeof cursor != "number") ? cursor[0] : cursor), 0);
		st += (inserted != null) ? inserted + textarea.value.substr(textarea.selectionEnd).replace(/\r\n?/g, "\n") : textarea.value.substr(textarea.selectionStart).replace(/\r\n?/g, "\n");
		sel[1] = Math.min(sel[0] + ((typeof cursor != "number") ? cursor[1] : 0), st.length);

		if(window.opera)
		{
			// Opera převádí \n na \r\n, kurzor by se netrefil.
			for(var i = 0; i < 2; i++)
			{
				var p = st.substr(0, sel[i]);
				sel[i] += p.length - p.replace(/\n/g, "").length;
			}
		}

		if(inserted != null) textarea.value = st;
		textarea.selectionStart = sel[0];
		textarea.selectionEnd = sel[1];
	}
	else if(typeof document.selection != "undefined")
	{
		var range = document.selection.createRange();
		var start = 0, end = 0;
		if(inserted != null)
		{
			start = end = -inserted.length;
			range.text = inserted;
		}
		else
		{
			end = -range.text.replace(/\r\n?/g, "\n").length;
		}
		
		// nastavení kurzoru na spravné místo / vybrání požadovaného textu
		if(typeof cursor != "number")
		{
			range.moveStart("character", start + cursor[0]);
			range.moveEnd("character", end + cursor[0] + cursor[1]);
		}
		else
		{
			if(start + cursor) range.move("character", start + cursor);
		}
		range.select();
	}
	} catch(exc) {};
	if(window.netscape)
	{
		textarea.scrollTop = scrollTop + (textarea.scrollHeight - scrollHeight);
	}
}

function insertBBTag(tag, language)
{
	var parovy = (tag != "hr");

	var startTag = "[" + tag + "]";
	var endTag = ("[/" + tag + "]").replace(/(\[\/(?:pre|font))[^\]]+(\])|\[\/hr\]/gi, "$1$2");

	var selectionType = tag.match(/^pre|hr|mod/i) ? "" : "word";
	var selectionTrim = tag.match(/^pre|hr|mod/i) ? /^\n+|\n+$/g : /^\s+|\s+$/g;

	var tac = getTextareaSelection({ context: true, type: selectionType, trim: selectionTrim });
	var tagText = tac[1];

	if(tag.match(/^([bi]|del|edit|small|pre\w*)$/i))
	{
		var opened = (tac[0].lastIndexOf(startTag) > tac[0].lastIndexOf(endTag));
		var closed = ((tac[2] + endTag).indexOf(endTag) < (tac[2] + startTag).indexOf(startTag));
		tagText = tagText.replace(new RegExp((startTag.replace(/pre\w*/, "pre\\w*") + "|" + endTag).replace(/\[/g, "\\$&"), "gi"), "");

		if(opened && closed)
		{
			var temp;
			temp = startTag;
			startTag = endTag;
			endTag = temp;
		}
		else if(opened)
		{
			// http://djpw.cz/102673#10
			if(!tag.match(/[bi]/)) startTag = "";
		}
		else if(closed)
		{
			endTag = "";
		}
	}
	else if(tag == "img")
	{
		tagtext = tagText.replace(/\[\/?([bi]|del|edit|small|pre[a-z]*|img(left|right)?|hr|mod|url(\=[^\]]+)?)\]/gi, "");
	}

	// vytvoření textu pro vložení		
	var text2insert = startTag + tagText + endTag;

	var cursor = (tagText ? text2insert.length : startTag.length);
	insertText(text2insert, cursor);
}

function insertTag(tag)
{
	var parovy = (tag != "hr");

	var startTag = "<" + tag + ">";
	var endTag = ("</" + tag + ">").replace(/(\[\/(?:pre|font))[^\]]+(\])|\[\/hr\]/gi, "$1$2");

	var selectionType = tag.match(/^pre|hr|mod/i) ? "" : "word";
	var selectionTrim = tag.match(/^pre|hr|mod/i) ? /^\n+|\n+$/g : /^\s+|\s+$/g;

	var tac = getTextareaSelection({ context: true, type: selectionType, trim: selectionTrim });
	var tagText = tac[1];

	if(tag.match(/^([bi]|del|edit|small|pre\w*)$/i))
	{
		var opened = (tac[0].lastIndexOf(startTag) > tac[0].lastIndexOf(endTag));
		var closed = ((tac[2] + endTag).indexOf(endTag) < (tac[2] + startTag).indexOf(startTag));
		tagText = tagText.replace(new RegExp((startTag.replace(/pre\w*/, "pre\\w*") + "|" + endTag).replace(/\[/g, "\\$&"), "gi"), "");

		if(opened && closed)
		{
			var temp;
			temp = startTag;
			startTag = endTag;
			endTag = temp;
		}
		else if(opened)
		{
			// http://djpw.cz/102673#10
			if(!tag.match(/[bi]/)) startTag = "";
		}
		else if(closed)
		{
			endTag = "";
		}
	}
	else if(tag == "img")
	{
		tagtext = tagText.replace(/\[\/?([bi]|del|edit|small|pre[a-z]*|img(left|right)?|hr|mod|url(\=[^\]]+)?)\]/gi, "");
	}

	// vytvoření textu pro vložení		
	var text2insert = startTag + tagText + endTag;

	var cursor = (tagText ? text2insert.length : startTag.length);
	insertText(text2insert, cursor);
}

function insertLink()
{

	var tac = getTextareaSelection({ context: true, type: "url", expand: true, trim: /^\s+|\s+/g });
	var cursor = tac[4];
	var text2insert = tac[1] || getTextareaSelection({ type: "word", trim: /^\s+|\s+/g });

	m = text2insert.match(/^(\[url=[^\]]+\])(.*)\[\/url\]$/i);
	if(m && !m[2].match(/\[url=[^\]]+\]|\[\/url\]/i))
	{
		cursor[0] -= m[1].length;
		if(cursor[0] < 0)
		{
			cursor[1] = Math.max(cursor[0] + cursor[1], 0);
			cursor[0] = 0;
		}
		if(cursor[0] > m[2].length)
		{
			cursor[0] = m[2].length;
			cursor[1] = 0;
		}
		if(cursor[0] + cursor[1] > m[2].length) cursor[1] = m[2].length - cursor[0];
		insertText(m[2], cursor);
		return;
	}
	m = text2insert.match(/^\s*\[img(?:left|right)?\](.*)\[\/img\]\s*$/i);
	if(m && !m[1].match(/\[img(?:left|right)?\]|\[\/img\]/i))
	{
		insertText("[url=" + m[1] + "]Obrázek[/url]", [m[1].length + 6, 7]);
		return;
	}

	var uris = [], unpack = false;
	text2insert = text2insert.replace(/\[url=([^\]]+)\](.*?)\[\/url\]|(\s*https?\:\/\/(?:["‚„“‘\)\.…,:;]*[^\s"‚„“‘\)\.…,:;]+)+\s*)|(\s*www\.(?:["‚„“‘\)\.…,:;]*[^\s"‚„“‘\)\.…,:;]+)+\s*)/gi, function(m, m1, m1t, m2, m3)
	{
		if(m1) unpack = true;
		uris.push((m1 || m2 || "http://" + m3).trim());
		return m1 ? m1t : "";
	});
	if(!uris.length)
	{
		insertText("[url=http://www.example.com]" + (text2insert || "Odkaz") + "[/url]", [5, 22]);
		return;
	}
	if(unpack)
	{
		text2insert = text2insert + " " + uris.join(" ");
		insertText(text2insert, [0, text2insert.length]);
		return;
	}
	if(uris.length == 1)
	{
		if(text2insert)
		{
			insertText("[url=" + uris[0] + "]" + text2insert + "[/url]", 12 + uris[0].length + text2insert.length);
		}
		else
		{
			text2insert = uris[0].replace(/^http\:\/\/www/, "www");
			insertText("[url=" + uris[0] + "]" + text2insert + "[/url]", [6 + uris[0].length, text2insert.length]);
		}
		return;
	}
	uris = uris.reverse();
	text2insert = text2insert.replace(/([-_a-z0-9áäéëěíóöôúůüýčďňŕřšťžĺľ]+|\[[^\]]+\])/gi, function(m)
	{
		var uri = uris.pop();
		return uri ? "[url=" + uri + "]" + m + "[/url]" : m;
	}).trim();
	for(var i = 1, uri; uri = uris.pop(); i++)
	{
		text2insert += (text2insert ? ", " : "") + "[url=" + uri + "]" + i + "[/url]";
	}
	insertText(text2insert, [0, text2insert.length]);
}

function insertQuote(el)
{
	var q = "";
	var cursor;

	var text = getDocumentSelection();
	if(!text && !el.happy) return alert("Označte prosím text, který si přejete citovat.\nNecitujte prosím větší množství textu, než je nezbytné k pochopení vaší reakce.");

	var tac = getTextareaSelection({ context: true });
	if(tac[0] && tac[0].substr(tac[0].length - 2) != "\n\n")
	{
		if(!tac[0].match(/\[b\].*\[\/b\]:?\n$/)) q += "\n";
		if(tac[0].substr(tac[0].length - 1) != "\n") q += "\n";
	}

	try
	{
		// jméno citovaného stvoření
		var jmeno = "[b]" + orezJmeno(el.parentNode.parentNode.parentNode.getElementsByTagName("b")[0].innerText) + "[/b]";

		if(tac[0].indexOf(jmeno) < 0)
		{
			q += jmeno + ":\n";
		}
	} catch(exc) { }

	if(!text)
	{
		var strejdyBratr = el.parentNode.parentNode.getElementsByTagName("div")[2];
		var line = strejdyBratr.innerText.split("\n");
		
		for(var i = 0; i < line.length; i++)
		{
			line[i] = line[i].trim();
			if(line[i] && !line[i].match(/^(„.*“|> .*|rea(guj[ui]|kce) na .*|[^\s]{1,20}\s?:|[^\w]+|.*?[\.\$][a-z].*|<+[\/\?\!]?\w+.*|.*;)$/i))
			{
				q += getLineQuote(line[i]) + "\n\n";
				if(!cursor) cursor = q.length - 2;
			}
		}
	}
	else
	{
		q += getQuote(text);
	}
	if(q.match(/\[b\](.*?)\[\/b\]:\n„\[i\]\1\[\/i\]“\n/))
	{
		alert("Proč se pokoušíte CITOVAT jméno?\n\nChcete-li někomu odpovídat, vložte jeho jméno tučně, tak, jako to dělají ostatní diskutující. Jak na to? Odcituji vám část z nápovědy:\n„Nápověda“");
		alert("Prostě na to jméno klikněte normálně levým tlačítkem.");
		return;
	}
	insertText(q, cursor);
}
function fixBB(text)
{
	return text.replace(/(\[\/?)((?:[bi\!]|hr|del|edit|small|pre[a-z]*|img(?:left|right)?|mod|url(?:\=[^\]]+)?)\])/gi, "$1[!]$2").replace(/\&(\#\d+)/g, "&[!]$1").replace(/www\./g, "w[!]ww.").replace(/ht(tps?\:\/\/)/g, "ht[!]$1");
}

function getQuote(text)
{
	if(!text) return "";
	text = text.replace(/\r\n/g, "\n");
	text = text.replace(/#\d+\s+·\s+Zasláno:\s+\d\d?\.\d\d?\.\d\d\d\d\s+\d\d:\d\d:\d\d(\s+·\s+Změnil\/a:\s+.*)?(\n?Citovat)?(\s*Změnit)?\n*/g, "");
	text = text.replace(/.*\n(Člen|Moderátor)\n*/g, "");
	text = text.trim();
	if(!text) return "";

	if(text.indexOf("\n") > -1)
	{
		return getBlockQuote(text);
	}
	else
	{
		return getLineQuote(text);
	}
}

function getLineQuote(line, notBB)
{
	var q = line;
	q = q.trim();
	q = q.replace(/^(?:„([^“]+)“|‚([^‘]+)‘|"([^"]+)")$/g, "$1$2$3");
	if(!notBB) q = fixBB(q);
	q = q.replace(/[„“‚‘]/g, function(m)
	{
		return {"„": "‚", "“": "‘", "‚": "»", "‘": "«"}[m];
	});
	return (notBB) ? "„" + q + "“" : "„[i]" + q + "[/i]“\n";
}

// tento regulární výraz se využije i jinde
var listRegExp = /^(?:([\(\[\{\/●•· ]*\s*)\d+(\s*[\)\]\}\/\.\:−\-–—…]+\s*|[\s ])(.*)|\s*(?:[●•·\*\+−\-–— ]+\s*)?(.*))$/;

function getBlockQuote(block, numbersAllowed)
{
	var line = block.split("\n");
	var info = false;
	var numbers = [], exclude = [];

	for(var i = 0; i < line.length; i++)
	{
		line[i] = line[i].trim();
		if(numbersAllowed) continue;
		numbers[i] = line[i].replace(listRegExp, "$1$2");
		if(numbers[i] && (numbers[i] == numbers[i - 1]) && (numbers[i] == numbers[i - 2]))
		{
			exclude[i] = exclude[i - 1] = exclude[i - 2] = true;
			info = true;
		}
		if(!line[i] && exclude[i - 1]) exclude[i] = true;
	}

	var bq = [];
	for(var i = 0; i < line.length; i++)
	{
		if(!exclude[i]) bq.push(line[i] ? "> [i]" + fixBB(line[i]) + "[/i]" : ">");
	}

	if(info)
	{
		alert("Reagujete-li na očíslovaný seznam, je zbytečné jej celý citovat. Stačí, když se v odpovědi odkážete na jednotlivé body pomocí jejich čísel.");
		if(bq.length == 1) return "";
	}

	return bq.join("\n") + "\n";
}

function getTextareaSelection(options)
{
	try { // může být neviditelná, to pak hází chybu, ale špatně se to testuje

	var textarea = document.forms["postMsg"].elements["poslText"];
	textarea.focus();

	var complete = options && (options.context || options.type || options.trim);
	var parts = [];

	if(typeof textarea.selectionStart != "undefined")
	{
		var pos = [textarea.selectionStart, textarea.selectionEnd];
		if(complete) pos = [0, pos[0], pos[1], textarea.value.length];
		for(var i = 1; i < pos.length; i++)
		{
			parts.push(textarea.value.substring(pos[i - 1], pos[i]).replace(/\r\n?/g, "\n"));
		}
		if(!complete) return parts[0];
	}
	else if(document.selection)
	{
		var range = [];
		range[2] = document.selection.createRange().duplicate();
		for(var i = (complete ? 0 : 2); i <= 2; i++)
		{
			if(i != 2)
			{
				range[i] = document.body.createTextRange();
				range[i].moveToElementText(textarea);
				range[i].setEndPoint(["EndToStart", "StartToEnd"][i], range[2]);
			}
			var text = range[i].text, lf = "";
			while(range[i].compareEndPoints("StartToEnd", range[i]))
			{
				range[i].moveEnd("character", -1);
				if(text == range[i].text) lf += "\n"; else break;
			}
			parts[{0:0, 1:2, 2:1}[i]] = text.replace(/\r\n?/g, "\n") + lf;
		}
		if(!complete) return parts[1];
	}
	else
	{
		if(!complete) return "";
		parts = ["", "", ""];
	}
	} catch(exc) {};

	if(options.trim)
	{
		var pt0 = "", pt2 = "";
		var pt1 = parts[1].replace(options.trim, function(m, index)
		{
			if(index == 0)
			{
				pt0 = m;
				return "";
			}
			if(index + m.length == parts[1].length)
			{
				pt2 = m;
				return "";
			}
			return m;
		});

		if(pt1 != parts[1])
		{
			changeSelection([pt0.length, pt1.length]);
			parts = [parts[0] + pt0, pt1, pt2 + parts[2]];
		}
	}

	if(options.type && ((!parts[1].length && !options.allowEmpty) || (parts[1].length && options.expand)))
	{
		if(options.type == "word" || options.type == "line")
		{
			var p0, p2;
			if(options.type == "word")
			{
				p0 = (parts[0].match(/[-_a-z0-9áäéëěíóöôúůüýčďňŕřšťžĺľ]+$/i) || [""])[0];
				p2 = p0.length ? (parts[2].match(/^[-_a-z0-9áäéëěíóöôúůüýčďňŕřšťžĺľ]+/i) || [""])[0] : "";
			}
			else
			{
				p0 = parts[0].substr(("\n" + parts[0]).lastIndexOf("\n"));
				p2 = parts[2].substr(0, (parts[2] + "\n").indexOf("\n"));
			}
			if(p0 || p2)
			{
				var p1 = parts[1];
				changeSelection([-p0.length, p0.length + p1.length + p2.length]);
				parts = [parts[0].substr(0, parts[0].length - p0.length), p0 + p1 + p2, parts[2].substr(p2.length)];
			}
		}
		else if(options.type = "url")
		{
			var text = textarea.value.replace(/\r\n?/g, "\n");
			var pos1 = parts[0].length, pos2 = pos1 + parts[1].length, uri = "";
			text.replace(/(?:\r?\n|^)•\s+\[url=([^\]]+)\].*?\[\/url\]|\[url=([^\]]+)\].*?\[\/url\]|\[img(?:left|right)?\](.*?)\[\/img\]|(https?\:\/\/(?:["‚„“‘\)\.…,:;]*[^\s"‚„“‘\)\.…,:;]+)+)|(www\.(?:["‚„“‘\)\.…,:;]*[^\s"‚„“‘\)\.…,:;]+)+)/gi, function(m, m1, m2, m3, m4, m5, index)
			{
				if(uri || index > pos1 || index + m.length < pos2) return m;
				changeSelection([-pos1 + index, m.length]);
				uri = m1 || m2 || m3 || m4 || ("http://" + m5);
				var cursor = [pos1 - index, pos2 - pos1];
				parts = [text.substr(0, index), text.substr(index, m.length), text.substr(index + m.length), uri, cursor];
				return m;
			});
		}
	}

	return (options.context ? parts : (parts[3] || parts[1]));
}


function getDocumentSelection()
{	
	if(document.getSelection) return document.getSelection().toString();
	if(document.selection) return document.selection.createRange().text;
	if(window.getSelection) return window.getSelection().toString();
	return "";
}
function getQuotation()
{
	document.writeln("\
		<a href=\"javascript:;\" onclick=\"reply(this)\">Odpovědět</a>\
		<a href=\"javascript:;\" onclick=\"insertQuote(this)\" onmouseover=\"fondleQuotation(this)\" onmouseout=\"fondleQuotation(this)\">Citovat</a>\
	");
}
function fondleQuotation(el)
{
	el.happiness = (el.happiness || 0) + 1;
	clearTimeout(el.timeout);
	el.timeout = setTimeout(function()
	{
		el.happiness = 0;
	}, 500);
	if(el.happiness >= 20)
	{
		el.happy = true;
		el.innerText = "Rozcitovat";
		el.onmouseover = el.onmouseout = null;
	}
}

function reply(a)
{
	a.parentNode.parentNode.parentNode.getElementsByTagName("td")[0].getElementsByTagName("b")[0].onclick();
}
