/*	Custom Emoticon Inserter, main script
 *	
 *	Runs in default namespace, to provide functions on objects in namespace
 *	Included by userscript, which later passes emoticon collection
 *
 *	Expects the following variables to be defined at runtime:
 *	RKNiner_emoticon_base_url	- the prefix on all filenames in the next var
 *	RKNiner_EmoticonArray	-	An array of strings containing the text emoticon
 *		regex (sans regex delimiters), and its filename.
 *
 */

/* Text replace functions */
function RKNiner_replace_BBCode(sourceText) {
	resultText = sourceText;
	for (var i = 0; i < RKNiner_EmoticonArray.length; ++i) {
		var emoticon_pair = RKNiner_EmoticonArray[i].split(/ /);
		var regexp = new RegExp("(^|[\\s])" + emoticon_pair[0] + "([\\s]|$)", "gm");
		resultText = resultText.replace(regexp, "$1[img]" + RKNiner_emoticon_base_url + emoticon_pair[1] + "[/img]$2");
	}
	return resultText;
}

function RKNiner_replace_HTML(sourceText) {
	resultText = sourceText;
	for (var i = 0; i < RKNiner_EmoticonArray.length; ++i) {
		var emoticon_pair = RKNiner_EmoticonArray[i].split(/ /);
		var regexp = new RegExp("(^|[\\s])" + emoticon_pair[0] + "([\\s]|$)", "gm");
		resultText = resultText.replace(regexp, "$1<img src=\"" + RKNiner_emoticon_base_url + emoticon_pair[1] + "\" alt=\"" + emoticon_pair[1] + "\" />$2");
	}
	return resultText;
}

/* Cookie functions, so this script can remember the selection for next time */
function RKNiner_SetCookie(tag, mode) {
	var expires = new Date();
	expires.setYear(expires.getYear() + 1901);
	var cookieStr = "RKNiner_" + tag + "_mode=" + mode + "; expires=" + expires.toUTCString() + "; path=/";
	document.cookie = cookieStr;
	return mode;
}

function RKNiner_GetCookie(tag) {
	var getString = document.cookie.split(/; /);
	for (var i = 0; i < getString.length; ++i) {
		var cookiePair = getString[i].split(/=/);
		if (cookiePair[0] == "RKNiner_" + tag + "_mode") {
			return cookiePair[1];
		}
	}
	return '';
}

/* Now, the serious code ;) */
var RKNiner_TextArea_Mode = new Array();		/* The settings */

/* modifies the text appropriately on submit */
function RKNiner_submit(e) {
	var textareas = document.getElementsByTagName("textarea");
	for (var i = 0; i < textareas.length; ++i) {
		switch(RKNiner_TextArea_Mode[textareas[i].tag]) {
			case 'HTML':
			textareas[i].value = RKNiner_replace_HTML(textareas[i].value);
			break;
			
			case 'BBCode':
			textareas[i].value = RKNiner_replace_BBCode(textareas[i].value);
			break;
		}
	}
}

/* changes the replacement mode */
function RKNiner_SetMode(e) {
	var affected = e.currentTarget.tag.substr(1);
	RKNiner_TextArea_Mode[affected] = e.currentTarget.value;
	RKNiner_SetCookie(affected, e.currentTarget.value);
}

function RKNiner_EmoticonDefinitionList(e, base_url, emotarray) {
	var helpdl = document.createElement("dl");
	for (var i = 0; i < emotarray.length; ++i) {
		var emoticon_pair = emotarray[i].split(/ /);
		var dt = document.createElement("dt");
		var img = document.createElement("img");
		img.src = base_url + emoticon_pair[1];
		img.alt = emoticon_pair[1];
		dt.appendChild(img);
		if (e) {
			dt.onclick = function(e) {
				var ta = e.currentTarget.parentNode.parentNode.parentNode.previousSibling;
				ta.value = ta.value.substr(0, ta.selectionStart) + e.currentTarget.nextSibling.textContent + ta.value.substr(ta.selectionEnd);
			}
			dt.style.cursor = "pointer";
		}
		helpdl.appendChild(dt);
		var dd = document.createElement("dd");
		dd.appendChild(document.createTextNode(emoticon_pair[0].replace(/(\\\\)*([^\\])\\([[\^$.|?*+()\]])/g, "$1$2$3").replace(/^\\/, "").replace(/\\\\/g, "\\")));
		helpdl.appendChild(dd);
	}
	return helpdl;
}

/* Displays the emoticon theme */
function RKNiner_DisplayHelp(e) {
	var helpdiv1 = document.createElement("div");
	var helpclose = document.createElement("a");
	helpclose.appendChild(document.createTextNode("X"));
	helpclose.onclick = function(e) {
		var parent = e.currentTarget.parentNode;
		var gparent = parent.parentNode;
		gparent.removeChild(parent);
	}
	helpclose.style.display = "block";
	helpclose.style.cssFloat = "right";
	helpclose.style.cursor = "pointer";
	helpclose.style.border = "1px solid black";
	helpclose.style.width = "20px";
	helpclose.style.height = "16px";
	helpclose.style.textAlign = "center";
	helpclose.style.fontSize = "12px";
	helpdiv1.appendChild(helpclose);
	var helptitlebar = document.createElement("div");
	helptitlebar.appendChild(document.createTextNode("Emoticons"));
	helptitlebar.id = "RKNiner_helptitlebar";
	helptitlebar.movelistener = function(e) {
		var target = document.getElementById("RKNiner_helptitlebar");
		if (target == undefined || target == null) return;
		if (target.mode == "move") {
			target.parentNode.style.left = (target.startLeft - target.startX + e.screenX) + "px";
			target.parentNode.style.top = (target.startTop - target.startY + e.screenY) + "px";
		}
	};
	helptitlebar.onmousedown = function(e) {
		e.currentTarget.mode = "move";
		e.currentTarget.startX = e.screenX;
		e.currentTarget.startY = e.screenY;
		e.currentTarget.startLeft = parseInt(e.currentTarget.parentNode.style.left);
		e.currentTarget.startTop = parseInt(e.currentTarget.parentNode.style.top);
		e.preventDefault();
		window.addEventListener("mousemove", e.currentTarget.movelistener, false);
	};
	helptitlebar.onmouseup = function(e) {
		e.currentTarget.mode = "";
		window.removeEventListener("mousemove",
			e.currentTarget.movelistener, false);
	};
	helptitlebar.style.background = "#efe069";
	helptitlebar.style.width = "376px";
	helptitlebar.style.height = "16px";
	helptitlebar.style.border = "1px solid black";
	helpdiv1.appendChild(helptitlebar);
	var helpdiv = document.createElement("div");
	helpdiv.id = "RKNiner_helpdivdefault";
	helpdiv.appendChild(RKNiner_EmoticonDefinitionList(
			e, RKNiner_emoticon_base_url, RKNiner_EmoticonArray));
	helpdiv.style.MozColumnCount = 5;
	helpdiv.style.overflow = "auto";
	helpdiv.style.width = "400px";
	helpdiv.style.height = "282px";
	helpdiv1.appendChild(helpdiv);
	helpdiv1.style.width = "400px";
	helpdiv1.style.height = "300px";
	helpdiv1.style.opacity = 0.9;
	if (e) {
		helpdiv1.style.position = "absolute";
		helpdiv1.style.top = e.layerY + "px";
		helpdiv1.style.left = e.layerX + "px";
	} else {
		helpdiv1.style.position = "fixed";
		helpdiv1.style.top = "5px";
		helpdiv1.style.left = "5px";
	}
	helpdiv1.style.border = "1px solid #a0a0ff";
	helpdiv1.style.backgroundColor = "white";
	helpdiv1.style.color = "black";
	if (e != null && e != undefined) {
		var parent = e.currentTarget.parentNode;
		parent.insertBefore(helpdiv1, e.currentTarget.nextSibling.nextSibling.nextSibling);
		e.preventDefault();
	} else {
		document.body.appendChild(helpdiv1);
	}
};

/* Document load actions */
function RKNiner_document_load() {
	var textareas = document.getElementsByTagName("textarea");
	if (textareas.length < 1) return;
	for (var i = 0; i < textareas.length; ++i) {
		var select = document.createElement("select");
		textareas[i].tag = 'textarea' + '_' +
			(textareas[i].id != '' ? textareas[i].id : textareas[i].name + '_' + i );
		select.tag = 'm' + textareas[i].tag;
		var selectedOption = RKNiner_GetCookie(textareas[i].tag);
		var option1 = document.createElement("option");
		option1.value = 'HTML';
		option1.appendChild(document.createTextNode("Replace emoticons with HTML"));
		option1.selected = (selectedOption == option1.value);
		var option2 = document.createElement("option");
		option2.value = 'BBCode';
		option2.appendChild(document.createTextNode("Replace emoticons with BBCode"));
		option2.selected = (selectedOption == option2.value);
		var option3 = document.createElement("option");
		option3.value = 'none';
		option3.selected = !(option1.selected || option2.selected);
		option3.appendChild(document.createTextNode("Disable emoticons"));
		select.appendChild(option1);
		select.appendChild(option2);
		select.appendChild(option3);
		select.onchange = RKNiner_SetMode;
		var parent = textareas[i].parentNode;
		parent.insertBefore(select, textareas[i]);
		var helpbutton = document.createElement("button");
		helpbutton.appendChild(document.createTextNode("Show"));
		helpbutton.onclick = RKNiner_DisplayHelp;
		parent.insertBefore(helpbutton, textareas[i]);
		parent.insertBefore(document.createElement("br"), textareas[i]);
		textareas[i].form.addEventListener("submit", RKNiner_submit, false);
		RKNiner_TextArea_Mode[textareas[i].tag] = selectedOption;
	}
}

window.onload = RKNiner_document_load;

