var preview_cache = [];

function preview(sourceId, targetId, force)
{
	function countSumbols(string, ch)
	{
		var count = 0;

		for(var i = 0; i < string.length; i++)
			if(string.charAt(i) == ch)
				count++;

		return count;
	}

	function isWhitespace(ch)
	{
		switch(ch)
		{
			case " ":
			case "\t":
			case "\n":
			case "\r":
				return true;
		}

		return false;
	}

	function getCaretEnd(obj)
	{
		if(typeof obj.selectionEnd != "undefined")
		{
			return obj.selectionEnd;
		}
		else if(document.selection && document.selection.createRange)
		{
			var M = document.selection.createRange(), Lp;

			try
			{
				Lp = M.duplicate();
				Lp.moveToElementText(obj);
			}
			catch(e)
			{
				Lp = obj.createTextRange();
			}

			Lp.setEndPoint("EndToEnd", M);
			var rb = Lp.text.length;

			if(rb > obj.value.length)
				return -1;
		
			return rb;
		}

		return -1;
	}
	if(!force) force = false;

	var source = document.getElementById(sourceId);
	var target = document.getElementById(targetId);

	var string = source.value, sl = string.length;
	var caret = getCaretEnd(source);

	// search for URLs:
	var url_pattern = /((ht|f)tp(s?)):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/i;
	var urls = [];

	var s = sl - 1, start = 0, startOriginal = 0;

	while(start < s)
	{
		var subst = string.substr(start);
		var match = subst.search(url_pattern);

		if(match != -1)
		{
			var url = subst.substr(match).match(url_pattern)[0];
			var prelength = url.length;

			// make sure URL doesn't end with dot:
			while(url.charAt(url.length - 1) == ".")
				url = url.substr(0, url.length - 1);

			var next  = subst.charAt(match + url.length);
			var next2 = subst.charAt(match + url.length + 1);

			var isEditing = false;
			if((caret > (startOriginal + match)) && (caret <= (startOriginal + match + prelength)))
				isEditing = true;

			if(((!isEditing || preview_cache[url]) && (isWhitespace(next) || ((next == ".") && isWhitespace(next2)))) || force)
			{
				if(!preview_cache[url])
				{
					urls[urls.length] = [url, start + match];
				}
				else
				{
					string = string.substr(0, start + match) + string.substr(start + match).replace(url, preview_cache[url]);
				}

				start += match + (preview_cache[url] ? preview_cache[url].length : url.length);
				startOriginal += match + url.length;
			}
			else
			{
				start += match + prelength;
				startOriginal += match + prelength;
			}
		}
		else break;
	}

	target.innerHTML = string.replace(/[(\n\r)\n\r]/g, "<br />");
	count(sourceId), count(targetId);

	// By this moment, we have the list of URLs to process.

	for(i = urls.length - 1; i >= 0; i--)
	{
		var element = urls[i];

		if(countSumbols(element[0], ".") >= 1)
		{
			jQuery.get("../index.php", {format: "txt", url: element[0]}, function(result)
			{
				if(result.indexOf("http://i.cx") == 0)
				{
					preview_cache[element[0]] = result;
					string = string.substr(0, element[1]) + string.substr(element[1]).replace(element[0], result);

					target.innerHTML = string.replace(/[(\n\r)\n\r]/g, "<br />");
					count(targetId);
				}
			});
		}
	}
}

function count(what)
{
	var src = document.getElementById(what);
	document.getElementById(what + "_counter").innerHTML = (src.tagName.toLowerCase() == "div") ? (src.innerText || src.textContent).length : src.value.length;
}