IP.Board - Plaintext BBCode

Adds BBCode button support to Plaintext editor mode.

// ==UserScript==
// @name	IP.Board - Plaintext BBCode
// @namespace	Makaze
// @include	*
// @grant	none
// @version	5.0.2
// @description Adds BBCode button support to Plaintext editor mode.
// ==/UserScript==

var MakazeScriptStyles,
styleElem;

function fade(elem, type, speed) {
	function defaultStyle(tag) {
		var defaultStyles = {},
		testElem = document.createElement(tag),
		getStyle = 'getComputedStyle' in window,
		styles;

		document.body.appendChild(testElem);

		styles = (getStyle) ? window.getComputedStyle(testElem) : testElem.currentStyle;

		for (var prop in styles) {
			defaultStyles[prop] = styles[prop];
		}

		document.body.removeChild(testElem);

		return defaultStyles;
	}

	var defaults = defaultStyle(elem.tagName),
	defaultOpacity,
	defaultDisplay,
	currentDisplay = (elem.style.display.length) ? elem.style.display : window.getComputedStyle(elem).display;

	if (elem.style.display.length) {
		elem.style.display = '';
	}

	defaultDisplay = (window.getComputedStyle(elem).display === 'none') ? defaults.display : window.getComputedStyle(elem).display;

	elem.style.display = currentDisplay;

	if (elem.style.display.length) {
		elem.style.opacity = '';
	}

	defaultOpacity = (window.getComputedStyle(elem).opacity === '0') ? defaults.opacity : window.getComputedStyle(elem).opacity;

	elem.style.opacity = 0;

	// Default values:

	switch (arguments.length) {
		case 1:
			type = 'toggle';
		case 2:
			speed = 300;
		break;
	}

	switch (type) {
		case 'in':
			elem.style.display = defaultDisplay;
			setTimeout(function() {
				elem.style.transition = 'all ' + speed + 'ms ease-in-out';
				elem.style.opacity = defaultOpacity;
				setTimeout(function() {
					elem.style.transition = '';
				}, speed + 10);
			}, 0);
		break;
		case 'out':
			elem.style.transition = 'none';
			elem.style.opacity = defaultOpacity;
			elem.style.transition = 'all ' + speed + 'ms ease-in-out';
			elem.style.opacity = 0;
			setTimeout(function() {
				elem.style.display = 'none';
				elem.style.transition = '';
				elem.style.opacity = '';
			}, speed + 10);
		break;
		case 'toggle':
		default:
			if (currentDisplay === 'none') {
				elem.style.display = defaultDisplay;
				setTimeout(function() {
					elem.style.transition = 'all ' + speed + 'ms ease-in-out';
					elem.style.opacity = defaultOpacity;
					setTimeout(function() {
						elem.style.transition = '';
					}, speed + 10);
				}, 0);
			} else {
				elem.style.transition = 'none';
				elem.style.opacity = defaultOpacity;
				elem.style.transition = 'all ' + speed + 'ms ease-in-out';
				elem.style.opacity = 0;
				setTimeout(function() {
					elem.style.display = 'none';
					elem.style.transition = '';
					elem.style.opacity = '';
				}, speed + 10);
			}
	}
}

function empty(elem) {
	while (elem.hasChildNodes()) {
		elem.removeChild(elem.lastChild);
	}
}

function createElement(type, callback) {
	var element = document.createElement(type);

	callback(element);

	return element;
}

function getPosition(element) {
	var xPosition = 0,
	yPosition = 0;

	while (element) {
		xPosition += (element.offsetLeft
			+ element.clientLeft);
		yPosition += (element.offsetTop
			+ element.clientTop);
		element = element.offsetParent;
	}
	return {x: xPosition, y: yPosition};
}

function runInGlobal(code) {
	var scripts = document.createElement('script');
	scripts.type = 'text/javascript';
	scripts.id = 'runInGlobal';
	scripts.appendChild(document.createTextNode(
		'(function() { ' + code + '})();' +
		'\n\n' +
		'document.getElementById(\'runInGlobal\').remove();'
	));

	(document.head || document.body || document.documentElement).appendChild(scripts);
}

// Classes constructor

function ClassHandler() {
	var self = this;

	this.classList = function(elem) {
		return elem.className.trim().split(/[\b\s]/);
	};

	this.hasClass = function(elem, className) {
		var classes = self.classList(elem),
		has = false,
		i = 0;

		for (i = 0; i < classes.length; i++) {
			if (classes[i] === className) {
				has = true;
				break;
			}
		}

		return (has);
	};

	this.addClass = function(elem, className) {
		var classes;

		if (!self.hasClass(elem, className)) {
			classes = self.classList(elem);
			classes.push(className);
			elem.className = classes.join(' ').trim();
		}

		return self;
	};

	this.removeClass = function(elem, className) {
		var classes = self.classList(elem),
		i = 0;

		for (i = 0; i < classes.length; i++) {
			if (classes[i] === className) {
				classes.splice(i, 1);
			}
		}

		elem.className = classes.join(' ').trim();

		return self;
	};

	this.toggleClass = function(elem, className) {
		var classes;

		if (self.hasClass(elem, className)) {
			self.removeClass(elem, className);
		} else {
			classes = self.classList(elem);
			classes.push(className);
			elem.className = classes.join(' ').trim();
		}

		return self;
	};
}

// Initilize

var Classes = new ClassHandler();

// End Classes constructor

// Event handler constructor

function EventHandler() {
	var events = [],
	matchedEvents = [],
	selector = document,
	self = this;

	this.selector = function(toSelect) {
		selector = toSelect;
		return self;
	};

	this.add = function(types, namespace, listener, useCapture) {
		var type,
		event,
		i = 0;

		types = types.split(/[\b\s]/);

		events.push({'selector': selector, 'namespace': namespace, 'types': types, 'listener': listener, 'useCapture': useCapture});
		event = events[events.length - 1];

		for (i = 0; i < event.types.length; i++) {
			type = event.types[i];
			selector.addEventListener(type, listener, useCapture);
		}

		return self;
	};

	this.remove = function(types, namespace, listener, useCapture) {
		var event,
		eventType,
		eventTypes,
		type,
		i = 0,
		j = 0,
		k = 0;

		if (!arguments.length) {
			if (matchedEvents.length) {
				for (i = 0; i < matchedEvents.length; i++) {
					event = matchedEvents[i];
					for (j = 0; j < event.types.length; j++) {
						type = event.types[j];
						event.selector.removeEventListener(type, event.listener, event.useCapture);
					}
				}
			} else {
				self.getEventsBySelector(selector).remove();
			}
		} else {
			types = types.split(/[\b\s]/);

			for (i = 0; i < events.length; i++) {
				event = events[i];
				if (event.selector == selector && event.namespace === namespace && event.useCapture === useCapture && event.listener === listener) {
					eventTypes = event.types;
					for (j = 0; j < eventTypes.length; j++) {
						eventType = eventTypes[j];
						for (k = 0; k < event.types.length; k++) {
							type = types[k];
							if (type === eventType) {
								selector.removeEventListener(type, event.listener, event.useCapture);
							}
						}
					}
					break;
				}
			}
		}

		matchedEvents = [];

		return self;
	};

	this.output = function() {
		if (!matchedEvents.length) {
			self.getAllEvents().output();
		} else {
			var output = matchedEvents;
			matchedEvents = [];
			return output;
		}
	};

	this.getAllEvents = function() {
		matchedEvents = events;
		return self;
	};

	this.getEventsBySelector = function(getSelector) {
		var event,
		i = 0;

		if (matchedEvents.length) {
			for (i = 0; i < matchedEvents.length; i++) {
				event = matchedEvents[i];
				if (event.selector != getSelector) {
					matchedEvents.splice(i, 1);
				}
			}
		} else {
			for (i = 0; i < events.length; i++) {
				event = events[i];
				if (event.selector == getSelector) {
					matchedEvents.push(event);
				}
			}
		}

		return self;
	};

	this.getEventsByType = function(types) {
		var eventTypes,
		eventType,
		event,
		type,
		hasType = false,
		i = 0,
		j = 0,
		k = 0;

		types = types.split(/[\b\s]/);

		if (matchedEvents.length) {
			for (i = 0; i < matchedEvents.length; i++) {
				event = matchedEvents[i];
				for (j = 0; j < eventTypes.length; j++) {
					eventType = eventTypes[j];
					for (k = 0; k < event.types.length; k++) {
						type = types[k];
						if (type === eventType) {
							hasType = true;
							break;
						}
					}
					if (hasType) {
						break;
					}
				}
				if (hasType) {
					matchedEvents.splice(i, 1);
				}
			}
		} else {
			for (i = 0; i < events.length; i++) {
				event = events[i];
				for (j = 0; j < eventTypes.length; j++) {
					eventType = eventTypes[j];
					for (k = 0; k < event.types.length; k++) {
						type = types[k];
						if (type === eventType) {
							hasType = true;
							break;
						}
					}
					if (hasType) {
						break;
					}
				}
				if (hasType) {
					matchedEvents.push(event);
				}
			}
		}
		
		return self;
	};

	this.getEventsByName = function(namespace) {
		var event,
		i = 0;

		if (matchedEvents.length) {
			for (i = 0; i < matchedEvents.length; i++) {
				event = matchedEvents[i];
				if (event.namespace !== namespace) {
					matchedEvents.splice(i, 1);
				}
			}
		} else {
			for (i = 0; i < events.length; i++) {
				event = events[i];
				if (event.namespace === namespace) {
					matchedEvents.push(event);
				}
			}
		}

		return self;
	};

	this.getEventsByListener = function(listener) {
		var event,
		i = 0;

		if (matchedEvents.length) {
			for (i = 0; i < matchedEvents.length; i++) {
				event = matchedEvents[i];
				if (event.listener !== listener) {
					matchedEvents.splice(i, 1);
				}
			}
		} else {
			for (i = 0; i < events.length; i++) {
				event = events[i];
				if (event.listener === listener) {
					matchedEvents.push(event);
				}
			}
		}

		return self;
	};
}

// Initialize

var Events = new EventHandler();

// End Event handler constructor

function isChildOf(selector, element) {
	switch (selector.charAt(0)) {
		case '.':
			if (document.getElementsByClassName(selector.slice(1))[0] == null) {
				return false;
			}

			while (element.getElementsByClassName(selector.slice(1))[0] == null && element.parentNode) {
				if (Classes.hasClass(element, selector.slice(1))) {
					return true;
				}
				element = element.parentNode;
			}
		break;
		case '#':
			if (document.getElementById(selector.slice(1)) == null) {
				return false;
			}

			while (element.parentNode) {
				if (element.id === selector.slice(1)) {
					return true;
				}
				element = element.parentNode;
			}
		break;
		default:
			if (document.getElementsByTagName(selector)[0] == null) {
				return false;
			}

			while (element.getElementsByTagName(selector) == null && element.parentNode) {
				if (element.tagName === selector.toUpperCase()) {
					return true;
				}
				element = element.parentNode;
			}
	}
	return false;
}

function getParent(selector, element) {
	switch (selector.charAt(0)) {
		case '.':
			if (document.getElementsByClassName(selector.slice(1))[0] == null) {
				return false;
			}

			while (element.getElementsByClassName(selector.slice(1))[0] == null && element.parentNode) {
				if (Classes.hasClass(element, selector.slice(1))) {
					return element;
				}
				element = element.parentNode;
			}
		break;
		case '#':
			if (document.getElementById(selector.slice(1)) == null) {
				return false;
			}

			while (element.parentNode) {
				if (element.id === selector.slice(1)) {
					return element;
				}
				element = element.parentNode;
			}
		break;
		default:
			if (document.getElementsByTagName(selector)[0] == null) {
				return false;
			}

			while (element.getElementsByTagName(selector) == null && element.parentNode) {
				if (element.tagName === selector.toUpperCase()) {
					return element;
				}
				element = element.parentNode;
			}
	}
}

function getSubmit(request) {
	var i,
	select;
	for (i = 0; i < request.getElementsByClassName('cke_dialog_ui_button').length; i++) {
		select = request.getElementsByClassName('cke_dialog_ui_button')[i];
		if (select.title === 'OK') {
			return select;
		}
	}
}

function getCancel(request) {
	var i,
	select;
	for (i = 0; i < request.getElementsByClassName('cke_dialog_ui_button').length; i++) {
		select = request.getElementsByClassName('cke_dialog_ui_button')[i];
		if (select.title === 'Cancel') {
			return select;
		}
	}
}

function getClose(request) {
	return request.getElementsByClassName('cke_dialog_close_button')[0];
}

function getSelection(elem) {
	var start = elem.selectionStart,
	end = elem.selectionEnd,
	selectedText = elem.value.substring(start, end);

	return selectedText;
}

function selectRange(elem, start, end) {
	var range;

	if (elem.setSelectionRange) {
		elem.focus();
		elem.setSelectionRange(start, end);
	} else if (elem.createTextRange) {
		range = elem.createTextRange();
		range.collapse(true);
		range.moveEnd('character', end);
		range.moveStart('character', start);
		range.select();
	}
}

function wrapText(elementSelector, openTag, closeTag, contentField) {
	var textArea = elementSelector,
	len = textArea.value.length,
	start = textArea.selectionStart,
	end = textArea.selectionEnd,
	selectedText = textArea.value.substring(start, end),
	replacement,
	paste = document.createEvent('TextEvent');
	if (contentField != null) {
		replacement = openTag + contentField.value + closeTag;
	} else {
		replacement = openTag + selectedText + closeTag;
	}
	if (paste.initTextEvent) {
		paste.initTextEvent('textInput', true, true, null, replacement);
		textArea.dispatchEvent(paste);
	} else {
		textArea.value = textArea.value.substring(0, start) + replacement + textArea.value.substring(end, len);
	}
	selectRange(textArea, start + openTag.length, start + replacement.length - closeTag.length);
}

function removeListeners(element, callback, deleteElement) {
	var elementClone = element.cloneNode(true),
	elementParent = element.parentNode,
	fullValue = element.value,
	start = element.selectionStart,
	end = element.selectionEnd,
	newElement,
	thisChild,
	i = 0;

	callback(element, elementClone);

	elementClone.setAttribute('data-listenersRemoved', '');
	elementParent.insertBefore(elementClone, element);
	element.style.display = 'none';
	if (deleteElement) {
		elementParent.replaceChild(elementClone, element);
	}
	for (i = 0; i < elementParent.childNodes.length; i++) {
		thisChild = elementParent.childNodes[i];
		if (thisChild.hasAttribute('data-listenersRemoved')) {
			newElement = thisChild;
			thisChild.removeAttribute('data-listenersRemoved');
			break;
		}
	}
	newElement.focus();
	newElement.value = fullValue;
	selectRange(newElement, start, end);
}

Events.selector(document).add('keydown', 'plaintext_shortcuts', function(event) {
	var element = event.target;

	if (!element.className || !Classes.hasClass(element, 'cke_source')) {
		return false;
	}

	if (!element.hasAttribute('data-shortcutsenabled')) {
		removeListeners(element, function(element, removed) {
			var postFormParent = element.parentNode,
			inputs,
			thisInput,
			i = 0;

			removed.setAttribute('data-shortcutsenabled', '');

			Events.selector(removed).add('input propertychange', 'edit', function() {
				element.value = removed.value;
			}, false);

			while (postFormParent.getElementsByClassName('input_submit')[0] == null && postFormParent.parentNode) {
				postFormParent = postFormParent.parentNode;
			}

			inputs = postFormParent.getElementsByClassName('input_submit');

			// On submits

			var deleteCloneListener = function() {
				var texts = postFormParent.getElementsByTagName('textarea'),
				thisOne,
				i = 0;

				for (i = 0; i < texts.length; i++) {
					thisOne = texts[i];
					if (thisOne.hasAttribute('data-shortcutsenabled')) {
						thisOne.remove();
						break;
					}
				}

				element.style.display = '';

				Events.selector(this).remove('click', 'deleteClone', deleteCloneListener, false);
			};

			for (i = 0; i < inputs.length; i++) {
				thisInput = inputs[i];
				Events.selector(thisInput).add('click', 'deleteClone', deleteCloneListener, false);
			}
		}, false);
	}

	if (event.ctrlKey || event.metaKey) {
		switch (event.keyCode) {
			case 66:
				event.preventDefault();
				wrapText(element, '[b]', '[/b]');
			break;
			case 73:
				event.preventDefault();
				wrapText(element, '[i]', '[/i]');
			break;
			case 85:
				event.preventDefault();
				wrapText(element, '[u]', '[/u]');
			break;
		}
	}
}, false);

// Styling

if (document.getElementById('MakazeScriptStyles') == null) {
	MakazeScriptStyles = createElement('style', function(style) {
		style.id = 'MakazeScriptStyles';
		style.type = 'text/css';
	});
	document.head.appendChild(MakazeScriptStyles);
}

styleElem = document.getElementById('MakazeScriptStyles');

if (styleElem.hasChildNodes()) {
	styleElem.childNodes[0].nodeValue += '\n\n';
} else {
	styleElem.appendChild(document.createTextNode(''));
}

styleElem.childNodes[0].nodeValue +=
	'#request-background {\n' +
		'position: fixed;\n' +
		'z-index: 9999998;\n' +
		'top: 0px;\n' +
		'left: 0px;\n' +
		'opacity: 0.5;\n' +
		'width: 100%;\n' +
		'height: 100%;\n' +
		'display: none;\n' +
	'}\n\n' +

	'.plaintextBBCodeRequest {\n' +
		'z-index: 9999999;\n' +
	'}\n\n' +

	'.sp_BBCode_desc {\n' +
		'color: #666 ! important;\n' +
		'white-space: normal ! important;\n' +
		'word-wrap: break-word;\n' +
	'}\n\n' +

	'.plaintextBBCode-dropdown {\n' +
		'position: absolute;\n' +
		'z-index: 9999;\n' +
		'overflow-y: auto;\n' +
		'background-color: #fff;\n' +
		'border-top-left-radius: 0px;\n' +
		'border-top-right-radius: 3px;\n' +
		'border-bottom-right-radius: 3px;\n' +
		'border-bottom-left-radius: 3px;\n' +
		'border: 1px solid #aaa;\n' +
		'color: #222;\n' +
		'font-family: \'Helvetica Neue\', Arial, Verdana, sans-serif;\n' +
		'display: none;\n' +
	'}\n\n' +

	'#font-dropdown {\n' +
		'width: 300px;\n' +
		'height: 170px;\n' +
	'}\n\n' +

	'#size-dropdown {\n' +
		'width: 120px;\n' +
		'height: 170px;\n' +
	'}\n\n' +

	'#color-dropdown {\n' +
		'width: 154px;\n' +
		'height: 134px;\n' +
	'}\n\n' +

	'.dropdown-link {\n' +
		'padding: 2px;\n' +
		'display: block;\n' +
		'border: 1px solid #fff;\n' +
		'color: inherit !important;\n' +
		'text-decoration: none;\n' +
		'overflow: hidden;\n' +
		'text-overflow: ellipsis;\n' +
	'}';

function getBackgroundColor(elem) {
	var bg;

	function hex(x) {
		return ("0" + parseInt(x).toString(16)).slice(-2);
	}

	if (elem.currentStyle) {
		bg = elem.currentStyle.backgroundColor;
	} else if (window.getComputedStyle) {
		bg = document.defaultView.getComputedStyle(elem, null).getPropertyValue("background-color");
		if (bg.search("rgb") == -1) {
			return bg;
		} else {
			bg = bg.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
			return "#" + hex(bg[1]) + hex(bg[2]) + hex(bg[3]);
		}
	}
}

function createDialogCSS() {
	var dialogcss = false,
	dialogStyle,
	links = document.getElementsByTagName('link'),
	i = 0;

	for (i = 0; i < links.length; i++) {
		if (links[i].href.match(/dialog\.css/)) {
			dialogcss = true;
			break;
		}
	}

	if (!dialogcss) {
		dialogStyle = createElement('link', function(css) {
			css.setAttribute('rel', 'stylesheet');
			css.setAttribute('media', 'screen,print');
			css.type = 'text/css';
			css.href = 'public/js/3rd_party/ckeditor/skins/ips/dialog.css';
		});
		
		document.head.appendChild(dialogStyle);
	}
}

function createRequestBackground() {
	if (document.getElementById('request-background') == null) {
		var requestbackground = createElement('div', function(bg) {
			bg.id = 'request-background';
			bg.className = 'cke_dialog_background_cover';
		});
		document.body.appendChild(requestbackground);
	}
}

function createRequest() {
	createDialogCSS();

	var requestDialog = createElement('div', function(request) {
		request.className = 'cke_skin_ips plaintextBBCodeRequest';
		request.id = 'plaintext-request';
		request.style.display = 'none';
		request.style.position = 'fixed';
		request.style.top = '0px'; 
		request.style.left = '0px'; 
		request.style.width = '400px';
		request.style.backgroundColor = '#fff';

		request.appendChild(createElement('div', function(body) {
			body.className = 'cke_dialog_body';

			body.appendChild(createElement('div', function(handle) {
				handle.className = 'request-type cke_dialog_title';
				handle.appendChild(document.createTextNode('Link'));
			}));

			body.appendChild(createElement('a', function(close) {
				close.className = 'cke_dialog_close_button';
				close.href = 'javascript:void(0)';
				close.title = 'Close';

				close.appendChild(createElement('span', function(label) {
					label.className = 'cke_label';
					label.appendChild(document.createTextNode('X'));
				}));
			}));

			body.appendChild(createElement('div', function(contents) {
				contents.className = 'cke_dialog_contents';

				contents.appendChild(createElement('div', function(spec) {
					spec.className = 'spec';
					spec.style.marginTop = '5px';
					spec.appendChild(document.createTextNode('URL'));
				}));

				contents.appendChild(createElement('div', function(fields) {
					fields.className = 'fields';
					fields.style.lineHeight = '14px';
					fields.style.verticalAlign = 'middle';

					fields.appendChild(createElement('div', function(cont) {
						cont.className = 'cke_dialog_ui_input_text';
						cont.appendChild(createElement('input', function(input) {
							input.className = 'cke_dialog_ui_input_text';
							input.type = 'text';
						}));
					}));
				}));

				contents.appendChild(createElement('div', function(footer) {
					footer.className = 'cke_dialog_footer cke_dialog_footer_buttons';
					footer.style.float = 'right';
					footer.style.marginRight = '0px';
					footer.style.marginTop = '10px';

					footer.appendChild(createElement('a', function(okay) {
						okay.className = 'cke_dialog_ui_button';
						okay.setAttribute('hidefocus', 'true');
						okay.title = 'OK';
						okay.href = 'javascript:void(0)';

						okay.appendChild(createElement('span', function(span) {
							span.className = 'cke_dialog_ui_button';
							span.style.marginBottom = '5px';
							span.appendChild(document.createTextNode('OK'));
						}));
					}));

					footer.appendChild(createElement('a', function(cancel) {
						cancel.className = 'cke_dialog_ui_button';
						cancel.setAttribute('hidefocus', 'true');
						cancel.title = 'Cancel';
						cancel.href = 'javascript:void(0)';
						cancel.style.marginLeft = '10px';

						cancel.appendChild(createElement('span', function(span) {
							span.className = 'cke_dialog_ui_button';
							span.style.marginBottom = '5px';
							span.appendChild(document.createTextNode('Cancel'));
						}));
					}));
				}));
			}));
		}));
	});

	document.body.appendChild(requestDialog);

	runInGlobal('requestDrag = new Draggable(\'plaintext-request\', { handle: \'request-type\', starteffect: null, endeffect: null });');

	createRequestBackground();

	var requestClickHandler = function() {
			fade(document.getElementById('plaintext-request'), 'out');
			fade(document.getElementById('request-background'), 'out');
	};

	Events.selector(document.getElementById('plaintext-request').getElementsByClassName('cke_dialog_close_button')[0]).add('click', 'plaintextRequest_fade', requestClickHandler, false);
	Events.selector(document.getElementById('plaintext-request').getElementsByClassName('cke_dialog_footer')[0].getElementsByTagName('a')[0]).add('click', 'plaintextRequest_fade', requestClickHandler, false);
	Events.selector(document.getElementById('plaintext-request').getElementsByClassName('cke_dialog_footer')[0].getElementsByTagName('a')[1]).add('click', 'plaintextRequest_fade', requestClickHandler, false);
}

function createFontDropdown() {
	function createFont(name, family) {
		return createElement('li', function(font) {
			font.className = 'cke_panel_listItem';

			font.appendChild(createElement('a', function(link) {
				link.className = 'dropdown-link';
				link.href = 'javascript:void(\'' + name + '\')';
				link.title = name;
				link.appendChild(createElement('span', function(span) {
					span.style.fontSize = '14px';
					span.style.fontFamily = family;
					span.appendChild(document.createTextNode(name));
				}));
			}));
		});
	}

	var fontDropdown = createElement('div', function(dropdown) {
		dropdown.id = 'font-dropdown';
		dropdown.className = 'cke_panel cke_ltr cke_rcombopanel font-dropdown plaintextBBCode-dropdown';

		dropdown.appendChild(createElement('div', function(block) {
			block.className = 'cke_panel_block';

			block.appendChild(createElement('h1', function(title) {
				title.className = 'cke_panel_grouptitle';
				title.appendChild(document.createTextNode('Font Name'));
			}));

			block.appendChild(createElement('ul', function(list) {
				list.className = 'cke_panel_list';

				list.appendChild(createFont('Arial', 'arial,helvetica,sans-serif'));
				list.appendChild(createFont('Comic Sans MS', 'comic sans ms,cursive'));
				list.appendChild(createFont('Courier New', 'courier new,courier,monospace'));
				list.appendChild(createFont('Georgia', 'georgia,serif'));
				list.appendChild(createFont('Lucida Sans Unicode', 'lucida sans unicode,lucida grande,sans-serif'));
				list.appendChild(createFont('Tahoma', 'tahoma,geneva,sans-serif'));
				list.appendChild(createFont('Times New Roman', 'times new roman,times,serif'));
				list.appendChild(createFont('Trebuchet MS', 'trebuchet ms,helvetica,sans-serif'));
				list.appendChild(createFont('Verdana', 'verdana,geneva,sans-serif'));
			}));
		}));
	});

	document.body.appendChild(fontDropdown);
}

function createSizeDropdown() {
	function createSize(size, id) {
		return createElement('li', function(font) {
			font.className = 'cke_panel_listItem';

			font.appendChild(createElement('a', function(link) {
				link.className = 'dropdown-link';
				link.href = 'javascript:void(\'' + size.toString() + '\')';
				link.title = size.toString();
				link.id = 'Size_' + id;
				link.appendChild(createElement('span', function(span) {
					span.style.fontSize = size + 'px';
					span.appendChild(document.createTextNode(size.toString()));
				}));
			}));
		});
	}

	var sizeDropdown = createElement('div', function(dropdown) {
		dropdown.id = 'size-dropdown';
		dropdown.className = 'cke_panel cke_ltr cke_rcombopanel size-dropdown plaintextBBCode-dropdown';

		dropdown.appendChild(createElement('div', function(block) {
			block.className = 'cke_panel_block';

			block.appendChild(createElement('h1', function(title) {
				title.className = 'cke_panel_grouptitle';
				title.appendChild(document.createTextNode('Font Size'));
			}));

			block.appendChild(createElement('ul', function(list) {
				list.className = 'cke_panel_list';

				list.appendChild(createSize(8, 1));
				list.appendChild(createSize(10, 2));
				list.appendChild(createSize(12, 3));
				list.appendChild(createSize(14, 4));
				list.appendChild(createSize(18, 5));
				list.appendChild(createSize(24, 6));
				list.appendChild(createSize(36, 7));
				list.appendChild(createSize(48, 8));
			}));
		}));
	});

	document.body.appendChild(sizeDropdown);
}

function createColorDropdown() {
	function createColor(name, color) {
		return createElement('td', function(cell) {
			cell.style.padding = '0px';
			cell.appendChild(createElement('a', function(link) {
				link.className = 'cke_colorbox';
				link.title = name;
				link.href = 'javascript:void(\'' + name + '\')';
				link.appendChild(createElement('span', function(value) {
					value.className = 'cke_colorbox';
					value.style.backgroundColor = color;
				}));
			}));
		});
	}

	var colors = [ { 'title': 'Black', 'color': '#000000' }, { 'title': 'Maroon', 'color': '#800000' }, { 'title': 'Saddle Brown', 'color': '#8b4513' }, { 'title': 'Dark Slate Gray', 'color': '#2f4f4f' }, { 'title': 'Teal', 'color': '#008080' }, { 'title': 'Navy', 'color': '#000080' }, { 'title': 'Indigo', 'color': '#4b0082' }, { 'title': 'Dark Gray', 'color': '#696969' }, { 'title': 'Fire Brick', 'color': '#b22222' }, { 'title': 'Brown', 'color': '#a52a2a' }, { 'title': 'Golden Rod', 'color': '#daa520' }, { 'title': 'Dark Green', 'color': '#006400' }, { 'title': 'Turquoise', 'color': '#40e0d0' }, { 'title': 'Medium Blue', 'color': '#0000cd' }, { 'title': 'Purple', 'color': '#800080' }, { 'title': 'Gray', 'color': '#808080' }, { 'title': 'Red', 'color': '#ff0000' }, { 'title': 'Dark Orange', 'color': '#ff8c00' }, { 'title': 'Gold', 'color': '#ffd700' }, { 'title': 'Green', 'color': '#008000' }, { 'title': 'Cyan', 'color': '#00ffff' }, { 'title': 'Blue', 'color': '#0000ff' }, { 'title': 'Violet', 'color': '#ee82ee' }, { 'title': 'Dim Gray', 'color': '#a9a9a9' }, { 'title': 'Light Salmon', 'color': '#ffa07a' }, { 'title': 'Orange', 'color': '#ffa500' }, { 'title': 'Yellow', 'color': '#ffff00' }, { 'title': 'Lime', 'color': '#00ff00' }, { 'title': 'Pale Turquoise', 'color': '#afeeee' }, { 'title': 'Light Blue', 'color': '#add8e6' }, { 'title': 'Plum', 'color': '#dda0dd' }, { 'title': 'Light Gray', 'color': '#d3d3d3' }, { 'title': 'Lavender Blush', 'color': '#fff0f5' }, { 'title': 'Antique White', 'color': '#faebd7' }, { 'title': 'Light Yellow', 'color': '#ffffe0' }, { 'title': 'Honeydew', 'color': '#f0fff0' }, { 'title': 'Azure', 'color': '#f0ffff' }, { 'title': 'Alice Blue', 'color': '#f0f8ff' }, { 'title': 'Lavender', 'color': '#e6e6fa' }, { 'title': 'White', 'color': '#ffffff' } ],
	buffer = [0, 8],
	i = 0;

	var colorDropdown = createElement('div', function(dropdown) {
		dropdown.id = 'color-dropdown';
		dropdown.className = 'cke_panel cke_ltr color-dropdown plaintextBBCode-dropdown';

		dropdown.appendChild(createElement('div', function(block) {
			block.className = 'cke_panel_block cke_colorblock cke_frameLoaded';

			block.appendChild(createElement('a', function(auto) {
				auto.className = 'cke_colorauto';
				auto.title = 'Automatic';
				auto.href = 'javascript:void(\'Automatic\')';

				auto.appendChild(createElement('table', function(table) {
					table.setAttribute('cellspacing', 0);
					table.setAttribute('cellpadding', 0);
					table.width = '100%';

					table.appendChild(createElement('tbody', function(tbody) {
						tbody.appendChild(createElement('tr', function(row) {
							row.appendChild(createElement('td', function(color) {
								color.style.padding = '0px';

								color.appendChild(createElement('span', function(span) {
									span.className = 'cke_colorbox';
									span.style.backgroundColor = '#222222';
								}));
							}));

							row.appendChild(createElement('td', function(name) {
								name.style.padding = '0px';
								name.setAttribute('colspan', 7);
								name.align = 'center';
								name.appendChild(document.createTextNode('Automatic'));
							}));
						}));
					}));
				}));
			}));

			block.appendChild(createElement('table', function(colorstable) {
				colorstable.setAttribute('cellspacing', 0);
				colorstable.setAttribute('cellpadding', 0);
				colorstable.width = '100%';

				colorstable.appendChild(createElement('tbody', function(body) {
					body.appendChild(createElement('tr', function(row) {
						for (i = buffer[0]; i < buffer[1]; i++) {
							row.appendChild(createColor(colors[i].title, colors[i].color));
						}
					}));

					buffer[0] += 8;
					buffer[1] += 8;

					body.appendChild(createElement('tr', function(row) {
						for (i = buffer[0]; i < buffer[1]; i++) {
							row.appendChild(createColor(colors[i].title, colors[i].color));
						}
					}));

					buffer[0] += 8;
					buffer[1] += 8;

					body.appendChild(createElement('tr', function(row) {
						for (i = buffer[0]; i < buffer[1]; i++) {
							row.appendChild(createColor(colors[i].title, colors[i].color));
						}
					}));

					buffer[0] += 8;
					buffer[1] += 8;

					body.appendChild(createElement('tr', function(row) {
						for (i = buffer[0]; i < buffer[1]; i++) {
							row.appendChild(createColor(colors[i].title, colors[i].color));
						}
					}));

					buffer[0] += 8;
					buffer[1] += 8;

					body.appendChild(createElement('tr', function(row) {
						for (i = buffer[0]; i < buffer[1]; i++) {
							row.appendChild(createColor(colors[i].title, colors[i].color));
						}
					}));

					body.appendChild(createElement('tr', function(row) {
						row.appendChild(createElement('td', function(colormore) {
							colormore.style.padding = '0px';
							colormore.setAttribute('colspan', 8);
							colormore.align = 'center';

							colormore.appendChild(createElement('a', function(link) {
								link.className = 'cke_colormore';
								link.title = 'More Colors...';
								link.href = 'javascript:void(\'More Colors...\')';
								link.appendChild(document.createTextNode('More Colors...'));
							}));
						}));
					}));
				}));
			}));
		}));
	});

	document.body.appendChild(colorDropdown);
}

function createColorMoreRequest() {
	function createColorMore(color) {
		return createElement('td', function(colorMore) {
			colorMore.className = 'ColorCell';
			colorMore.style.backgroundColor = color;
			colorMore.style.border = '1px solid ' + color;
			colorMore.style.width = '14px';
			colorMore.style.height = '14px';
			colorMore.appendChild(createElement('span', function(value) {
				value.className = 'cke_voice_label';
				value.appendChild(document.createTextNode(color));
			}));
		});
	}

	createDialogCSS();
	
	var colors = [ { 'color': '#000000' }, { 'color': '#003300' }, { 'color': '#006600' }, { 'color': '#009900' }, { 'color': '#00cc00' }, { 'color': '#00ff00' }, { 'color': '#330000' }, { 'color': '#333300' }, { 'color': '#336600' }, { 'color': '#339900' }, { 'color': '#33cc00' }, { 'color': '#33ff00' }, { 'color': '#660000' }, { 'color': '#663300' }, { 'color': '#666600' }, { 'color': '#669900' }, { 'color': '#66cc00' }, { 'color': '#66ff00' }, { 'color': '#000033' }, { 'color': '#003333' }, { 'color': '#006633' }, { 'color': '#009933' }, { 'color': '#00cc33' }, { 'color': '#00ff33' }, { 'color': '#330033' }, { 'color': '#333333' }, { 'color': '#336633' }, { 'color': '#339933' }, { 'color': '#33cc33' }, { 'color': '#33ff33' }, { 'color': '#660033' }, { 'color': '#663333' }, { 'color': '#666633' }, { 'color': '#669933' }, { 'color': '#66cc33' }, { 'color': '#66ff33' }, { 'color': '#000066' }, { 'color': '#003366' }, { 'color': '#006666' }, { 'color': '#009966' }, { 'color': '#00cc66' }, { 'color': '#00ff66' }, { 'color': '#330066' }, { 'color': '#333366' }, { 'color': '#336666' }, { 'color': '#339966' }, { 'color': '#33cc66' }, { 'color': '#33ff66' }, { 'color': '#660066' }, { 'color': '#663366' }, { 'color': '#666666' }, { 'color': '#669966' }, { 'color': '#66cc66' }, { 'color': '#66ff66' }, { 'color': '#000099' }, { 'color': '#003399' }, { 'color': '#006699' }, { 'color': '#009999' }, { 'color': '#00cc99' }, { 'color': '#00ff99' }, { 'color': '#330099' }, { 'color': '#333399' }, { 'color': '#336699' }, { 'color': '#339999' }, { 'color': '#33cc99' }, { 'color': '#33ff99' }, { 'color': '#660099' }, { 'color': '#663399' }, { 'color': '#666699' }, { 'color': '#669999' }, { 'color': '#66cc99' }, { 'color': '#66ff99' }, { 'color': '#0000cc' }, { 'color': '#0033cc' }, { 'color': '#0066cc' }, { 'color': '#0099cc' }, { 'color': '#00cccc' }, { 'color': '#00ffcc' }, { 'color': '#3300cc' }, { 'color': '#3333cc' }, { 'color': '#3366cc' }, { 'color': '#3399cc' }, { 'color': '#33cccc' }, { 'color': '#33ffcc' }, { 'color': '#6600cc' }, { 'color': '#6633cc' }, { 'color': '#6666cc' }, { 'color': '#6699cc' }, { 'color': '#66cccc' }, { 'color': '#66ffcc' }, { 'color': '#0000ff' }, { 'color': '#0033ff' }, { 'color': '#0066ff' }, { 'color': '#0099ff' }, { 'color': '#00ccff' }, { 'color': '#00ffff' }, { 'color': '#3300ff' }, { 'color': '#3333ff' }, { 'color': '#3366ff' }, { 'color': '#3399ff' }, { 'color': '#33ccff' }, { 'color': '#33ffff' }, { 'color': '#6600ff' }, { 'color': '#6633ff' }, { 'color': '#6666ff' }, { 'color': '#6699ff' }, { 'color': '#66ccff' }, { 'color': '#66ffff' }, { 'color': '#990000' }, { 'color': '#993300' }, { 'color': '#996600' }, { 'color': '#999900' }, { 'color': '#99cc00' }, { 'color': '#99ff00' }, { 'color': '#cc0000' }, { 'color': '#cc3300' }, { 'color': '#cc6600' }, { 'color': '#cc9900' }, { 'color': '#cccc00' }, { 'color': '#ccff00' }, { 'color': '#ff0000' }, { 'color': '#ff3300' }, { 'color': '#ff6600' }, { 'color': '#ff9900' }, { 'color': '#ffcc00' }, { 'color': '#ffff00' }, { 'color': '#990033' }, { 'color': '#993333' }, { 'color': '#996633' }, { 'color': '#999933' }, { 'color': '#99cc33' }, { 'color': '#99ff33' }, { 'color': '#cc0033' }, { 'color': '#cc3333' }, { 'color': '#cc6633' }, { 'color': '#cc9933' }, { 'color': '#cccc33' }, { 'color': '#ccff33' }, { 'color': '#ff0033' }, { 'color': '#ff3333' }, { 'color': '#ff6633' }, { 'color': '#ff9933' }, { 'color': '#ffcc33' }, { 'color': '#ffff33' }, { 'color': '#990066' }, { 'color': '#993366' }, { 'color': '#996666' }, { 'color': '#999966' }, { 'color': '#99cc66' }, { 'color': '#99ff66' }, { 'color': '#cc0066' }, { 'color': '#cc3366' }, { 'color': '#cc6666' }, { 'color': '#cc9966' }, { 'color': '#cccc66' }, { 'color': '#ccff66' }, { 'color': '#ff0066' }, { 'color': '#ff3366' }, { 'color': '#ff6666' }, { 'color': '#ff9966' }, { 'color': '#ffcc66' }, { 'color': '#ffff66' }, { 'color': '#990099' }, { 'color': '#993399' }, { 'color': '#996699' }, { 'color': '#999999' }, { 'color': '#99cc99' }, { 'color': '#99ff99' }, { 'color': '#cc0099' }, { 'color': '#cc3399' }, { 'color': '#cc6699' }, { 'color': '#cc9999' }, { 'color': '#cccc99' }, { 'color': '#ccff99' }, { 'color': '#ff0099' }, { 'color': '#ff3399' }, { 'color': '#ff6699' }, { 'color': '#ff9999' }, { 'color': '#ffcc99' }, { 'color': '#ffff99' }, { 'color': '#9900cc' }, { 'color': '#9933cc' }, { 'color': '#9966cc' }, { 'color': '#9999cc' }, { 'color': '#99cccc' }, { 'color': '#99ffcc' }, { 'color': '#cc00cc' }, { 'color': '#cc33cc' }, { 'color': '#cc66cc' }, { 'color': '#cc99cc' }, { 'color': '#cccccc' }, { 'color': '#ccffcc' }, { 'color': '#ff00cc' }, { 'color': '#ff33cc' }, { 'color': '#ff66cc' }, { 'color': '#ff99cc' }, { 'color': '#ffcccc' }, { 'color': '#ffffcc' }, { 'color': '#9900ff' }, { 'color': '#9933ff' }, { 'color': '#9966ff' }, { 'color': '#9999ff' }, { 'color': '#99ccff' }, { 'color': '#99ffff' }, { 'color': '#cc00ff' }, { 'color': '#cc33ff' }, { 'color': '#cc66ff' }, { 'color': '#cc99ff' }, { 'color': '#ccccff' }, { 'color': '#ccffff' }, { 'color': '#ff00ff' }, { 'color': '#ff33ff' }, { 'color': '#ff66ff' }, { 'color': '#ff99ff' }, { 'color': '#ffccff' }, { 'color': '#ffffff' }, { 'color': '#000000' }, { 'color': '#333333' }, { 'color': '#666666' }, { 'color': '#999999' }, { 'color': '#cccccc' }, { 'color': '#ffffff' }, { 'color': '#000000' }, { 'color': '#000000' }, { 'color': '#000000' }, { 'color': '#000000' }, { 'color': '#000000' }, { 'color': '#000000' }, { 'color': '#000000' }, { 'color': '#000000' }, { 'color': '#000000' }, { 'color': '#000000' }, { 'color': '#000000' }, { 'color': '#000000' } ],
	buffer = [0, 18],
	i = 0;

	var colorMoreRequest = createElement('div', function(request) {
		request.className = 'cke_skin_ips plaintextBBCodeRequest';
		request.id = 'colorMore-request';
		request.style.display = 'none';
		request.style.position = 'fixed';
		request.style.top = '0px'; 
		request.style.left = '0px'; 
		request.style.width = '400px';
		request.style.backgroundColor = '#fff';

		request.appendChild(createElement('div', function(body) {
			body.className = 'cke_dialog_body';

			body.appendChild(createElement('div', function(handle) {
				handle.className = 'request-type cke_dialog_title';
				handle.appendChild(document.createTextNode('Select color'));
			}));

			body.appendChild(createElement('a', function(close) {
				close.className = 'cke_dialog_close_button';
				close.href = 'javascript:void(0)';
				close.title = 'Close';
				close.appendChild(createElement('span', function(span) {
					span.className = 'cke_label';
					span.appendChild(document.createTextNode('X'));
				}));
			}));

			body.appendChild(createElement('div', function(content_table) {
				content_table.className = 'cke_dialog_contents';
				content_table.appendChild(createElement('tbody', function(content_tbody) {
					content_tbody.appendChild(createElement('tr', function(content_row) {
						content_row.appendChild(createElement('td', function(content_cell) {
							content_cell.className = 'cke_dialog_contents';
							content_cell.style.width = '360px';
							content_cell.style.height = '220px';
							content_cell.appendChild(createElement('div', function(content_page) {
								content_page.className = 'cke_dialog_ui_vbox cke_dialog_page_contents';
								content_page.style.width = '100%';
								content_page.style.height = '100%';
								content_page.appendChild(createElement('table', function(content_page_table) {
									content_page_table.align = 'left';
									content_page_table.border = '0';
									content_page_table.setAttribute('cellspacing', '0');
									content_page_table.style.width = '100%';
									content_page_table.appendChild(createElement('tbody', function(content_page_tbody) {
										content_page_tbody.appendChild(createElement('tr', function(content_page_row) {
											content_page_row.appendChild(createElement('td', function(content_page_cell) {
												content_page_cell.className = 'cke_dialog_ui_vbox_child';
												content_page_cell.appendChild(createElement('table', function(content_page_cell_table) {
													content_page_cell_table.className = 'cke_dialog_ui_hbox';
													content_page_cell_table.appendChild(createElement('tbody', function(content_page_cell_tbody) {
														content_page_cell_tbody.appendChild(createElement('tr', function(content_page_cell_row) {
															content_page_cell_row.className = 'cke_dialog_ui_hbox';
															content_page_cell_row.appendChild(createElement('td', function(content_page_cell_cell) {
																content_page_cell_cell.className = 'cke_dialog_ui_hbox_first';
																content_page_cell_cell.style.width = '70%';
																content_page_cell_cell.style.padding = '0';
																content_page_cell_cell.appendChild(createElement('div', function(content_page_cell_cell_box) {
																	content_page_cell_cell_box.className = 'cke_dialog_ui_html';
																	content_page_cell_cell_box.appendChild(createElement('table', function(content_page_cell_cell_table) {
																		content_page_cell_cell_table.setAttribute('cellspacing', '0');
																		content_page_cell_cell_table.setAttribute('style', 'border-collapse: separate;');

																		content_page_cell_cell_table.appendChild(createElement('caption', function(caption) {
																			caption.className = 'cke_voice_label';
																			caption.appendChild(document.createTextNode('Color Options'));
																		}));

																		content_page_cell_cell_table.appendChild(createElement('tbody', function(content_page_cell_cell_tbody) {
																			content_page_cell_cell_tbody.appendChild(createElement('tr', function(color_row) {
																				for (i = buffer[0]; i < buffer[1]; i++) {
																					color_row.appendChild(createColorMore(colors[i].color));
																				}
																			}));

																			buffer[0] += 18;
																			buffer[1] += 18;

																			content_page_cell_cell_tbody.appendChild(createElement('tr', function(color_row) {
																				for (i = buffer[0]; i < buffer[1]; i++) {
																					color_row.appendChild(createColorMore(colors[i].color));
																				}
																			}));

																			buffer[0] += 18;
																			buffer[1] += 18;

																			content_page_cell_cell_tbody.appendChild(createElement('tr', function(color_row) {
																				for (i = buffer[0]; i < buffer[1]; i++) {
																					color_row.appendChild(createColorMore(colors[i].color));
																				}
																			}));

																			buffer[0] += 18;
																			buffer[1] += 18;

																			content_page_cell_cell_tbody.appendChild(createElement('tr', function(color_row) {
																				for (i = buffer[0]; i < buffer[1]; i++) {
																					color_row.appendChild(createColorMore(colors[i].color));
																				}
																			}));

																			buffer[0] += 18;
																			buffer[1] += 18;

																			content_page_cell_cell_tbody.appendChild(createElement('tr', function(color_row) {
																				for (i = buffer[0]; i < buffer[1]; i++) {
																					color_row.appendChild(createColorMore(colors[i].color));
																				}
																			}));

																			buffer[0] += 18;
																			buffer[1] += 18;

																			content_page_cell_cell_tbody.appendChild(createElement('tr', function(color_row) {
																				for (i = buffer[0]; i < buffer[1]; i++) {
																					color_row.appendChild(createColorMore(colors[i].color));
																				}
																			}));

																			buffer[0] += 18;
																			buffer[1] += 18;

																			content_page_cell_cell_tbody.appendChild(createElement('tr', function(color_row) {
																				for (i = buffer[0]; i < buffer[1]; i++) {
																					color_row.appendChild(createColorMore(colors[i].color));
																				}
																			}));

																			buffer[0] += 18;
																			buffer[1] += 18;

																			content_page_cell_cell_tbody.appendChild(createElement('tr', function(color_row) {
																				for (i = buffer[0]; i < buffer[1]; i++) {
																					color_row.appendChild(createColorMore(colors[i].color));
																				}
																			}));

																			buffer[0] += 18;
																			buffer[1] += 18;

																			content_page_cell_cell_tbody.appendChild(createElement('tr', function(color_row) {
																				for (i = buffer[0]; i < buffer[1]; i++) {
																					color_row.appendChild(createColorMore(colors[i].color));
																				}
																			}));

																			buffer[0] += 18;
																			buffer[1] += 18;

																			content_page_cell_cell_tbody.appendChild(createElement('tr', function(color_row) {
																				for (i = buffer[0]; i < buffer[1]; i++) {
																					color_row.appendChild(createColorMore(colors[i].color));
																				}
																			}));

																			buffer[0] += 18;
																			buffer[1] += 18;

																			content_page_cell_cell_tbody.appendChild(createElement('tr', function(color_row) {
																				for (i = buffer[0]; i < buffer[1]; i++) {
																					color_row.appendChild(createColorMore(colors[i].color));
																				}
																			}));

																			buffer[0] += 18;
																			buffer[1] += 18;

																			content_page_cell_cell_tbody.appendChild(createElement('tr', function(color_row) {
																				for (i = buffer[0]; i < buffer[1]; i++) {
																					color_row.appendChild(createColorMore(colors[i].color));
																				}
																			}));

																			buffer[0] += 18;
																			buffer[1] += 18;

																			content_page_cell_cell_tbody.appendChild(createElement('tr', function(color_row) {
																				for (i = buffer[0]; i < buffer[1]; i++) {
																					color_row.appendChild(createColorMore(colors[i].color));
																				}
																			}));
																		}));
																	}));
																}));
															}));
															
															content_page_cell_row.appendChild(createElement('td', function(content_page_cell_cell) {
																content_page_cell_cell.className = 'cke_dialog_ui_hbox_child';
																content_page_cell_cell.style.width = '10%';
																content_page_cell_cell.style.padding = '0';
																content_page_cell_cell.appendChild(createElement('span', function(span) {
																	span.className = 'cke_dialog_ui_html';
																	span.appendChild(document.createTextNode('\u00a0'));
																}));
															}));

															content_page_cell_row.appendChild(createElement('td', function(content_page_cell_cell) {
																content_page_cell_cell.className = 'cke_dialog_ui_hbox_last';
																content_page_cell_cell.style.width = '30%';
																content_page_cell_cell.style.padding = '0';
																content_page_cell_cell.appendChild(createElement('div', function(content_page_cell_cell_box) {
																	content_page_cell_cell_box.className = 'cke_dialog_ui_vbox';
																	content_page_cell_cell_box.appendChild(createElement('table', function(content_page_cell_cell_table) {
																		content_page_cell_cell_table.align = 'left';
																		content_page_cell_cell_table.border = '0';
																		content_page_cell_cell_table.setAttribute('cellspacing', '0');
																		content_page_cell_cell_table.style.width = '100%';
																		content_page_cell_cell_table.appendChild(createElement('tbody', function(content_page_cell_cell_tbody) {
																			content_page_cell_cell_tbody.appendChild(createElement('tr', function(content_page_cell_cell_row) {
																				content_page_cell_cell_row.appendChild(createElement('td', function(content_page_cell_cell_cell) {
																					content_page_cell_cell_cell.className = 'cke_dialog_ui_vbox_child';
																					content_page_cell_cell_cell.style.padding = '0';
																					content_page_cell_cell_cell.appendChild(createElement('span', function(span) {
																						span.className = 'cke_dialog_ui_html';
																						span.appendChild(document.createTextNode('Highlight'));
																					}));

																					content_page_cell_cell_cell.appendChild(createElement('div', function(previewbox) {
																						previewbox.className = 'color-preview';
																						previewbox.style.border = '1px solid';
																						previewbox.style.width = '74px';
																						previewbox.style.height = '74px';
																						previewbox.style.backgroundColor = '#000';
																					}));

																					content_page_cell_cell_cell.appendChild(createElement('div', function(previewvalue) {
																						previewvalue.id = 'colorMore-preview-value';
																						previewvalue.appendChild(document.createTextNode('#000000'));
																					}));

																					content_page_cell_cell_cell.appendChild(createElement('span', function(span) {
																						span.appendChild(document.createTextNode('Selected Color'));
																					}));

																					content_page_cell_cell_cell.appendChild(createElement('div', function(selectedbox) {
																						selectedbox.className = 'selected-preview';
																						selectedbox.style.border = '1px solid';
																						selectedbox.style.width = '74px';
																						selectedbox.style.height = '20px';
																					}));
																				}));
																			}));

																			content_page_cell_cell_tbody.appendChild(createElement('tr', function(content_page_cell_cell_row) {
																				content_page_cell_cell_row.appendChild(createElement('td', function(content_page_cell_cell_cell) {
																					content_page_cell_cell_cell.className = 'cke_dialog_ui_vbox_child';
																					content_page_cell_cell_cell.style.padding = '0';
																					content_page_cell_cell_cell.appendChild(createElement('div', function(selectedcont) {
																						selectedcont.className = 'cke_dialog_ui_text';
																						selectedcont.style.width = '74px';
																						selectedcont.appendChild(createElement('label', function(selectedlabel) {
																							selectedlabel.className = 'cke_dialog_ui_labeled_label';
																							selectedlabel.style.display = 'none';
																							selectedlabel.appendChild(document.createTextNode('Selected Color'));
																						}));

																						selectedcont.appendChild(createElement('div', function(labelcontent) {
																							labelcontent.className = 'cke_dialog_ui_labeled_content';
																							labelcontent.appendChild(createElement('div', function(inputcont) {
																								inputcont.className = 'cke_dialog_ui_input_text';
																								inputcont.appendChild(createElement('input', function(input) {
																									input.id = 'colorMore-input';
																									input.className = 'cke_dialog_ui_input_text';
																									input.type = 'text';
																								}));
																							}));
																						}));
																					}));
																				}));
																			}));

																			content_page_cell_cell_tbody.appendChild(createElement('tr', function(content_page_cell_cell_row) {
																				content_page_cell_cell_row.appendChild(createElement('td', function(content_page_cell_cell_cell) {
																					content_page_cell_cell_cell.className = 'cke_dialog_ui_vbox_child';
																					content_page_cell_cell_cell.style.padding = '0';
																					content_page_cell_cell_cell.appendChild(createElement('span', function(span) {
																						span.className = 'cke_dialog_ui_html';
																						span.appendChild(document.createTextNode('\u00a0'));
																					}));
																				}));
																			}));

																			content_page_cell_cell_tbody.appendChild(createElement('tr', function(content_page_cell_cell_row) {
																				content_page_cell_cell_row.appendChild(createElement('td', function(content_page_cell_cell_cell) {
																					content_page_cell_cell_cell.className = 'cke_dialog_ui_vbox_child';
																					content_page_cell_cell_cell.style.padding = '0';
																					content_page_cell_cell_cell.appendChild(createElement('a', function(clear) {
																						clear.className = 'cke_dialog_ui_button clear_button';
																						clear.href = 'javascript:void(0)';
																						clear.style.marginTop = '5px';
																						clear.title = 'Clear';
																						clear.appendChild(createElement('span', function(span) {
																							span.className = 'cke_dialog_ui_button';
																							span.appendChild(document.createTextNode('Clear'));
																						}));
																					}));
																				}));
																			}));
																		}));
																	}));
																}));
															}));
														}));
													}));
												}));
											}));
										}));
									}));
								}));
							}));
						}));
					}));

					content_tbody.appendChild(createElement('tr', function(content_row) {
						content_row.appendChild(createElement('td', function(content_cell) {
							content_cell.className = 'cke_dialog_footer';
							content_cell.appendChild(createElement('table', function(footer) {
								footer.className = 'cke_dialog_ui_hbox cke_dialog_footer_buttons';
								footer.appendChild(createElement('tbody', function(footer_tbody) {
									footer_tbody.appendChild(createElement('tr', function(footer_row) {
										footer_row.className = 'cke_dialog_ui_hbox';
										footer_row.appendChild(createElement('td', function(okay) {
											okay.className = 'cke_dialog_ui_hbox_first';
											okay.style.paddingRight = '10px';
											okay.appendChild(createElement('a', function(button) {
												button.className = 'cke_dialog_ui_button cke_dialog_ui_button_ok';
												button.href = 'javascript:void(0)';
												button.title = 'OK';
												button.appendChild(createElement('span', function(span) {
													span.className = 'cke_dialog_ui_button';
													span.appendChild(document.createTextNode('OK'));
												}));
											}));
										}));

										footer_row.appendChild(createElement('td', function(cancel) {
											cancel.className = 'cke_dialog_ui_hbox_first';
											cancel.appendChild(createElement('a', function(button) {
												button.className = 'cke_dialog_ui_button cke_dialog_ui_button_cancel';
												button.href = 'javascript:void(0)';
												button.title = 'Cancel';
												button.appendChild(createElement('span', function(span) {
													span.className = 'cke_dialog_ui_button';
													span.appendChild(document.createTextNode('Cancel'));
												}));
											}));
										}));
									}));
								}));
							}));
						}));
					}));
				}));
			}));
		}));
	});

	// Prepend

	document.body.appendChild(colorMoreRequest);

	runInGlobal('colorMoreRequestDrag = new Draggable(\'colorMore-request\', { handle: \'request-type\', starteffect: null, endeffect: null });');

	createRequestBackground();

	var ColorCellHightlightHandler = function() {
		var colorPreview = document.getElementById('colorMore-request').getElementsByClassName('color-preview')[0],
		color = this.getElementsByTagName('span')[0].childNodes[0].nodeValue;

		colorPreview.style.backgroundColor = color;
		colorPreview.nextSibling.childNodes[0].nodeValue = color;
	};

	var ColorCellSelectHandler = function() {
		var selectedCell = document.getElementById('colorMore-request').getElementsByClassName('selected-cell')[0] || null,
		newColor = this.getElementsByTagName('span')[0].childNodes[0].nodeValue;

		if (selectedCell != null) {
			selectedCell.style.border = '1px solid ' + selectedCell.style.backgroundColor;
			Classes.removeClass(selectedCell, 'selected-cell');
		}

		document.getElementById('colorMore-request').getElementsByClassName('selected-preview')[0].style.backgroundColor = newColor;
		document.getElementById('colorMore-input').value = newColor;

		this.style.border = '1px dotted #fff';
		Classes.addClass(this, 'selected-cell');
		this.focus();
	};

	var clearHandler = function() {
		var selectedCell = document.getElementById('colorMore-request').getElementsByClassName('selected-cell')[0];

		selectedCell.style.border = '1px solid ' + selectedCell.style.backgroundColor;
		selectedCell.blur();
		Classes.removeClass(selectedCell, 'selected-cell');

		document.getElementById('colorMore-request').getElementsByClassName('selected-preview')[0].style.backgroundColor = '';
		document.getElementById('colorMore-input').value = '';
	};

	var cells = document.getElementById('colorMore-request').getElementsByClassName('ColorCell'),
	cell;

	for (i = 0; i < cells.length; i++) {
		cell = cells[i];
		Events.selector(cell).add('mouseenter', 'highlightColor', ColorCellHightlightHandler, false);
		Events.selector(cell).add('click', 'selectColor', ColorCellSelectHandler, false);
	}

	Events.selector(document.getElementById('colorMore-request').getElementsByClassName('clear_button')[0]).add('click', 'clearColor', clearHandler, false);

	var requestClickHandler = function() {
			fade(document.getElementById('colorMore-request'), 'out');
			fade(document.getElementById('request-background'), 'out');
	};

	Events.selector(document.getElementById('colorMore-request').getElementsByClassName('cke_dialog_close_button')[0]).add('click', 'colorMoreRequest_fade', requestClickHandler, false);
	Events.selector(document.getElementById('colorMore-request').getElementsByClassName('cke_dialog_footer')[0].getElementsByTagName('a')[0]).add('click', 'colorMoreRequest_fade', requestClickHandler, false);
	Events.selector(document.getElementById('colorMore-request').getElementsByClassName('cke_dialog_footer')[0].getElementsByTagName('a')[1]).add('click', 'colorMoreRequest_fade', requestClickHandler, false);
}

function plaintextParser(editor) {
	var buttons = editor.getElementsByClassName('cke_button'),
	dropdowns = editor.getElementsByClassName('cke_rcombo'),
	i = 0;

	var plaintextBBCodeHandler = function() {
		if (editor.getElementsByClassName('cke_source')[0] != null) {
			var top = '0px',
			self = this,
			request,
			dropdown,
			buttonOffset,
			buttonHeight,
			windowScroll,
			windowHeight,
			dropdownHeight,
			textArea = editor.getElementsByClassName('cke_source')[0],
			selectedText;

			switch (self.title) {
				case 'Special BBCode':
					if (request == null) {
						createRequest();
					}

					request = document.getElementById('plaintext-request');

					request.getElementsByClassName('request-type')[0].childNodes[0].nodeValue = 'Special BBCode';
					request.getElementsByClassName('spec')[0].childNodes[0].nodeValue = 'BBCode';

					empty(request.getElementsByClassName('fields')[0]);

					// Make fields

					var specialSelect = createElement('select', function(select) {
						select.className = 'cke_dialog_ui_input_select sp_BBCode';
						select.options[0] = new Option(' Please select', 'Default', true);
						select.options[1] = new Option(' Acronym', 'Acronym');
						select.options[2] = new Option(' Background-color', 'Background-color');
						select.options[3] = new Option(' Horizontal Rule', 'Horizontal Rule');
						select.options[4] = new Option(' Media', 'Media');
						select.options[5] = new Option(' Member', 'Member');
						select.options[6] = new Option(' Post Link', 'Post Link');
						select.options[7] = new Option(' Spoiler', 'Spoiler');
						select.options[8] = new Option(' Topic Link', 'Topic Link');
						select.options[9] = new Option(' Twitter', 'Twitter');
					}),
					specialFields = createElement('div', function(fields) {
						fields.className = 'sp_BBCode_fields';
						fields.style.paddingTop = '5px';
					});

					request.getElementsByClassName('fields')[0].appendChild(specialSelect);
					request.getElementsByClassName('fields')[0].appendChild(specialFields);

					// Event

					var selectSpecialBBCodeHandler = function() {
						var select = this;

						empty(select.nextSibling);

						switch (select.options[select.selectedIndex].value) {
							case 'Acronym':
								(function () {
									var descript = createElement('div', function(el) {
										el.className = 'cke_dialog_ui_vbox_child sp_BBCode_desc';
										el.appendChild(document.createTextNode('Allows you to make an acronym that will display a description when moused over.'));
									}),
									inputbox = createElement('div', function(el) {
										el.className = 'cke_dialog_ui_vbox_child';
										el.appendChild(document.createTextNode('Enter the description for this acronym (EG: Laugh Out Loud)'));
										el.appendChild(createElement('div', function(cont) {
											cont.className = 'cke_dialog_ui_input_text';
											cont.appendChild(createElement('input', function(input) {
												input.className = 'cke_dialog_ui_input_text';
												input.type = 'text';
											}));
										}));
									}),
									textbox = createElement('div', function(el) {
										el.className = 'cke_dialog_ui_vbox_child';
										el.style.paddingBottom = '0px';
										el.appendChild(document.createTextNode('Enter the acronym (EG: lol)'));
										el.appendChild(createElement('div', function(cont) {
											cont.className = 'cke_dialog_ui_input_textarea';
											cont.appendChild(createElement('textarea', function(text) {
												text.className = 'cke_dialog_ui_input_textarea';
												text.rows = 5;
												text.cols = 20;
											}));
										}));
									});

									select.nextSibling.appendChild(descript);
									select.nextSibling.appendChild(inputbox);
									select.nextSibling.appendChild(textbox);
								})();
							break;
							case 'Background-color':
								(function () {
									var descript = createElement('div', function(el) {
										el.className = 'cke_dialog_ui_vbox_child sp_BBCode_desc';
										el.appendChild(document.createTextNode('Adds a background color behind the text.'));
									}),
									inputbox = createElement('div', function(el) {
										el.className = 'cke_dialog_ui_vbox_child';
										el.appendChild(document.createTextNode('Option'));
										el.appendChild(createElement('div', function(cont) {
											cont.className = 'cke_dialog_ui_input_text';
											cont.appendChild(createElement('input', function(input) {
												input.className = 'cke_dialog_ui_input_text';
												input.type = 'text';
											}));
										}));
									}),
									textbox = createElement('div', function(el) {
										el.className = 'cke_dialog_ui_vbox_child';
										el.style.paddingBottom = '0px';
										el.appendChild(document.createTextNode('Content'));
										el.appendChild(createElement('div', function(cont) {
											cont.className = 'cke_dialog_ui_input_textarea';
											cont.appendChild(createElement('textarea', function(text) {
												text.className = 'cke_dialog_ui_input_textarea';
												text.rows = 5;
												text.cols = 20;
											}));
										}));
									});

									select.nextSibling.appendChild(descript);
									select.nextSibling.appendChild(inputbox);
									select.nextSibling.appendChild(textbox);
								})();
							break;
							case 'Horizontal Rule':
								(function () {
									var descript = createElement('div', function(el) {
										el.className = 'cke_dialog_ui_vbox_child sp_BBCode_desc';
										el.appendChild(document.createTextNode('Adds a horizontal rule to separate text.'));
									});

									select.nextSibling.appendChild(descript);
								})();
							break;
							case 'Media':
								(function () {
									var descript = createElement('div', function(el) {
										el.className = 'cke_dialog_ui_vbox_child sp_BBCode_desc';
										el.appendChild(document.createTextNode('Allows a user to post media content from certain common media sites.'));
									}),
									inputbox = createElement('div', function(el) {
										el.className = 'cke_dialog_ui_vbox_child';
										el.appendChild(document.createTextNode('Dimensions (Flash Only)'));
										el.appendChild(createElement('div', function(cont) {
											cont.className = 'cke_dialog_ui_input_text';
											cont.appendChild(createElement('input', function(input) {
												input.className = 'cke_dialog_ui_input_text';
												input.type = 'text';
											}));
										}));
									}),
									textbox = createElement('div', function(el) {
										el.className = 'cke_dialog_ui_vbox_child';
										el.style.paddingBottom = '0px';
										el.appendChild(document.createTextNode('Media URL'));
										el.appendChild(createElement('div', function(cont) {
											cont.className = 'cke_dialog_ui_input_textarea';
											cont.appendChild(createElement('textarea', function(text) {
												text.className = 'cke_dialog_ui_input_textarea';
												text.rows = 5;
												text.cols = 20;
											}));
										}));
									});

									select.nextSibling.appendChild(descript);
									select.nextSibling.appendChild(inputbox);
									select.nextSibling.appendChild(textbox);
								})();
							break;
							case 'Member':
								(function () {
									var descript = createElement('div', function(el) {
										el.className = 'cke_dialog_ui_vbox_child sp_BBCode_desc';
										el.appendChild(document.createTextNode('Given a member name, a link is automatically generated to the member\'s profile.'));
									}),
									inputbox = createElement('div', function(el) {
										el.className = 'cke_dialog_ui_vbox_child';
										el.appendChild(document.createTextNode('Member Name'));
										el.appendChild(createElement('div', function(cont) {
											cont.className = 'cke_dialog_ui_input_text';
											cont.appendChild(createElement('input', function(input) {
												input.className = 'cke_dialog_ui_input_text';
												input.type = 'text';
											}));
										}));
									});

									select.nextSibling.appendChild(descript);
									select.nextSibling.appendChild(inputbox);
								})();
							break;
							case 'Post Link':
								(function () {
									var descript = createElement('div', function(el) {
										el.className = 'cke_dialog_ui_vbox_child sp_BBCode_desc';
										el.appendChild(document.createTextNode('This tag provides an easy way to link to a post.'));
									}),
									inputbox = createElement('div', function(el) {
										el.className = 'cke_dialog_ui_vbox_child';
										el.appendChild(document.createTextNode('Enter the Post ID'));
										el.appendChild(createElement('div', function(cont) {
											cont.className = 'cke_dialog_ui_input_text';
											cont.appendChild(createElement('input', function(input) {
												input.className = 'cke_dialog_ui_input_text';
												input.type = 'text';
											}));
										}));
									}),
									textbox = createElement('div', function(el) {
										el.className = 'cke_dialog_ui_vbox_child';
										el.style.paddingBottom = '0px';
										el.appendChild(document.createTextNode('Enter the title for this link'));
										el.appendChild(createElement('div', function(cont) {
											cont.className = 'cke_dialog_ui_input_textarea';
											cont.appendChild(createElement('textarea', function(text) {
												text.className = 'cke_dialog_ui_input_textarea';
												text.rows = 5;
												text.cols = 20;
											}));
										}));
									});

									select.nextSibling.appendChild(descript);
									select.nextSibling.appendChild(inputbox);
									select.nextSibling.appendChild(textbox);
								})();
							break;
							case 'Spoiler':
								(function () {
									var descript = createElement('div', function(el) {
										el.className = 'cke_dialog_ui_vbox_child sp_BBCode_desc';
										el.appendChild(document.createTextNode('Spoiler tag.'));
									}),
									inputbox = createElement('div', function(el) {
										el.className = 'cke_dialog_ui_vbox_child';
										el.appendChild(document.createTextNode('Option'));
										el.appendChild(createElement('div', function(cont) {
											cont.className = 'cke_dialog_ui_input_text';
											cont.appendChild(createElement('input', function(input) {
												input.className = 'cke_dialog_ui_input_text';
												input.type = 'text';
											}));
										}));
									}),
									textbox = createElement('div', function(el) {
										el.className = 'cke_dialog_ui_vbox_child';
										el.style.paddingBottom = '0px';
										el.appendChild(document.createTextNode('Enter the text to be masked'));
										el.appendChild(createElement('div', function(cont) {
											cont.className = 'cke_dialog_ui_input_textarea';
											cont.appendChild(createElement('textarea', function(text) {
												text.className = 'cke_dialog_ui_input_textarea';
												text.rows = 5;
												text.cols = 20;
											}));
										}));
									});

									select.nextSibling.appendChild(descript);
									select.nextSibling.appendChild(inputbox);
									select.nextSibling.appendChild(textbox);
								})();
							break;
							case 'Topic Link':
								(function () {
									var descript = createElement('div', function(el) {
										el.className = 'cke_dialog_ui_vbox_child sp_BBCode_desc';
										el.appendChild(document.createTextNode('This tag provides an easy way to link to a topic.'));
									}),
									inputbox = createElement('div', function(el) {
										el.className = 'cke_dialog_ui_vbox_child';
										el.appendChild(document.createTextNode('Enter the Topic ID'));
										el.appendChild(createElement('div', function(cont) {
											cont.className = 'cke_dialog_ui_input_text';
											cont.appendChild(createElement('input', function(input) {
												input.className = 'cke_dialog_ui_input_text';
												input.type = 'text';
											}));
										}));
									}),
									textbox = createElement('div', function(el) {
										el.className = 'cke_dialog_ui_vbox_child';
										el.style.paddingBottom = '0px';
										el.appendChild(document.createTextNode('Enter the title for this link'));
										el.appendChild(createElement('div', function(cont) {
											cont.className = 'cke_dialog_ui_input_textarea';
											cont.appendChild(createElement('textarea', function(text) {
												text.className = 'cke_dialog_ui_input_textarea';
												text.rows = 5;
												text.cols = 20;
											}));
										}));
									});

									select.nextSibling.appendChild(descript);
									select.nextSibling.appendChild(inputbox);
									select.nextSibling.appendChild(textbox);
								})();
							break;
							case 'Twitter':
								(function () {
									var descript = createElement('div', function(el) {
										el.className = 'cke_dialog_ui_vbox_child sp_BBCode_desc';
										el.appendChild(document.createTextNode('A tag to link to a user\'s twitter account.'));
									}),
									textbox = createElement('div', function(el) {
										el.className = 'cke_dialog_ui_vbox_child';
										el.style.paddingBottom = '0px';
										el.appendChild(document.createTextNode('Twitter Username'));
										el.appendChild(createElement('div', function(cont) {
											cont.className = 'cke_dialog_ui_input_textarea';
											cont.appendChild(createElement('textarea', function(text) {
												text.className = 'cke_dialog_ui_input_textarea';
												text.rows = 5;
												text.cols = 20;
											}));
										}));
									});

									select.nextSibling.appendChild(descript);
									select.nextSibling.appendChild(textbox);
								})();
							break;	
						}

						selectedText = getSelection(editor.getElementsByClassName('cke_source')[0]);

						if (select.nextSibling.getElementsByTagName('textarea')[0] != null && selectedText.length) {
							select.nextSibling.getElementsByTagName('textarea')[0].value = selectedText;
						}
					};

					Events.selector(request.getElementsByClassName('sp_BBCode')[0]).add('change', 'selectSpecialBBCode', selectSpecialBBCodeHandler, false);

					var SpecialBBCodeSubmitHandler = function() {
						var select = request.getElementsByClassName('sp_BBCode')[0],
						fields = select.nextSibling,
						input,
						textarea;

						switch (select.options[select.selectedIndex].value) {
							case 'Acronym':
								input = fields.getElementsByTagName('input')[0].value;
								textarea = fields.getElementsByTagName('textarea')[0];
								wrapText(editor.getElementsByClassName('cke_source')[0], '[acronym=' + input + ']', '[/acronym]', textarea);
							break;
							case 'Background-color':
								input = fields.getElementsByTagName('input')[0].value;
								textarea = fields.getElementsByTagName('textarea')[0];
								wrapText(editor.getElementsByClassName('cke_source')[0], '[background=' + input + ']', '[/background]', textarea);
							break;
							case 'Horizontal Rule':
								wrapText(editor.getElementsByClassName('cke_source')[0], '[hr]', '');
							break;
							case 'Media':
								input = fields.getElementsByTagName('input')[0].value;
								textarea = fields.getElementsByTagName('textarea')[0];
								wrapText(editor.getElementsByClassName('cke_source')[0], '[media=' + input + ']', '[/media]', textarea);
							break;
							case 'Member':
								input = fields.getElementsByTagName('input')[0].value;
								wrapText(editor.getElementsByClassName('cke_source')[0], '[member=' + input + ']', '');
							break;
							case 'Post Link':
								input = fields.getElementsByTagName('input')[0].value;
								textarea = fields.getElementsByTagName('textarea')[0];
								wrapText(editor.getElementsByClassName('cke_source')[0], '[post=' + input + ']', '[/post]', textarea);
							break;
							case 'Spoiler':
								input = fields.getElementsByTagName('input')[0].value;
								textarea = fields.getElementsByTagName('textarea')[0];
								if (input.length) {
									wrapText(editor.getElementsByClassName('cke_source')[0], '[spoiler=' + input + ']', '[/spoiler]', textarea);
								} else {
									wrapText(editor.getElementsByClassName('cke_source')[0], '[spoiler]', '[/spoiler]', textarea);
								}
							break;
							case 'Topic Link':
								input = fields.getElementsByTagName('input')[0].value;
								textarea = fields.getElementsByTagName('textarea')[0];
								wrapText(editor.getElementsByClassName('cke_source')[0], '[topic=' + input + ']', '[/topic]', textarea);
							break;
							case 'Twitter':
								textarea = fields.getElementsByTagName('textarea')[0];
								wrapText(editor.getElementsByClassName('cke_source')[0], '[twitter]', '[/twitter]', textarea);
							break;
						}

						Events.getEventsByName('submitSpecialBBCode').remove();
						Events.getEventsByName('removeSpecialBBCodeSubmit').remove();
					};

					var removeSpecialBBCodeHandlers = function() {
						Events.getEventsByName('submitSpecialBBCode').remove();
						Events.getEventsByName('removeSpecialBBCodeSubmit').remove();
					};

					Events.selector(getSubmit(request)).add('click', 'submitSpecialBBCode', SpecialBBCodeSubmitHandler, false);

					Events.selector(getCancel(request)).add('click', 'removeSpecialBBCodeSubmit', removeSpecialBBCodeHandlers, false);

					Events.selector(getClose(request)).add('click', 'removeSpecialBBCodeSubmit', removeSpecialBBCodeHandlers, false);

					fade(document.getElementById('request-background'), 'in');
					fade(document.getElementById('plaintext-request'), 'in');

					if (window.innerHeight > request.offsetHeight) {
						top = (window.innerHeight / 2) - (request.offsetHeight / 2) + 'px';
					}

					request.style.top = top;
					request.style.left = (window.innerWidth / 2) - 200 + 'px';
					request.style.width = '400px';

					request.getElementsByClassName('sp_BBCode')[0].focus();
				break;
			
				case 'Font Name':
					if (document.getElementById('font-dropdown') == null) {
						createFontDropdown();
					}

					dropdown = document.getElementById('font-dropdown');

					var fonts = dropdown.getElementsByTagName('a');

					var applyFontHandler = function() {
						wrapText(editor.getElementsByClassName('cke_source')[0], '[font=' + this.getElementsByTagName('span')[0].style.fontFamily.replace(/'/g, "").replace(/, /g, ",") + ']', '[/font]');

						Classes.removeClass(self.parentNode, 'cke_on');
						Classes.addClass(self.parentNode, 'cke_off');

						Events.getEventsByName('applyFont').remove();

						dropdown.style.display = 'none';

						document.getElementById('dropdown-click-background').remove();
					};
					
					if (window.getComputedStyle(dropdown).display === 'none') {
						Classes.removeClass(self.parentNode, 'cke_off');
						Classes.addClass(self.parentNode, 'cke_on');

						for (i = 0; i < fonts.length; i++) {
							Events.selector(fonts[i]).add('click', 'applyFont', applyFontHandler, false);
						}

						dropdown.style.display = 'block';

						document.body.appendChild(createElement('div', function(click) {
							click.id = 'dropdown-click-background';
							click.style.position = 'fixed';
							click.style.width = '100%';
							click.style.height = '100%';
							click.style.top = '0px';
							click.style.left = '0px';
							click.style.zIndex = '9998';

							click.onclick = function() {
								Classes.removeClass(self.parentNode, 'cke_on');
								Classes.addClass(self.parentNode, 'cke_off');

								Events.getEventsByName('applyFont').remove();

								dropdown.style.display = 'none';
								this.remove();
								editor.getElementsByClassName('cke_source')[0].focus();
							};
						}));
					}

					buttonOffset = getPosition(self).y;
					buttonHeight = self.offsetHeight;
					windowScroll = window.scrollY;
					windowHeight = window.innerHeight;
					dropdownHeight = dropdown.offsetHeight;

					if ((windowScroll + windowHeight) - (buttonOffset + buttonHeight - 1) >= dropdownHeight) {
						top = buttonOffset + buttonHeight - 1 + 'px';
					} else if ((windowScroll + windowHeight) - (buttonOffset + buttonHeight - 1) < dropdownHeight && (buttonOffset + buttonHeight - 1) - windowScroll > dropdownHeight) {
						top = buttonOffset + buttonHeight - 1 - dropdownHeight + 'px';
					} else {
						top = windowScroll + 'px';
					}

					dropdown.style.top = top;
					dropdown.style.left = getPosition(self).x + 'px';
				break;

				case 'Font Size':
					if (document.getElementById('size-dropdown') == null) {
						createSizeDropdown();
					}

					dropdown = document.getElementById('size-dropdown');

					var sizes = dropdown.getElementsByTagName('a');

					var applySizeHandler = function() {
						wrapText(editor.getElementsByClassName('cke_source')[0], '[size=' + this.id.split('Size_')[1] + ']', '[/size]');

						Classes.removeClass(self.parentNode, 'cke_on');
						Classes.addClass(self.parentNode, 'cke_off');

						Events.getEventsByName('applySize').remove();

						dropdown.style.display = 'none';

						document.getElementById('dropdown-click-background').remove();
					};
					
					if (window.getComputedStyle(dropdown).display === 'none') {
						Classes.removeClass(self.parentNode, 'cke_off');
						Classes.addClass(self.parentNode, 'cke_on');

						for (i = 0; i < sizes.length; i++) {
							Events.selector(sizes[i]).add('click', 'applySize', applySizeHandler, false);
						}

						dropdown.style.display = 'block';

						document.body.appendChild(createElement('div', function(click) {
							click.id = 'dropdown-click-background';
							click.style.position = 'fixed';
							click.style.width = '100%';
							click.style.height = '100%';
							click.style.top = '0px';
							click.style.left = '0px';
							click.style.zIndex = '9998';

							click.onclick = function() {
								Classes.removeClass(self.parentNode, 'cke_on');
								Classes.addClass(self.parentNode, 'cke_off');

								Events.getEventsByName('applySize').remove();

								dropdown.style.display = 'none';
								this.remove();
								editor.getElementsByClassName('cke_source')[0].focus();
							};
						}));
					}

					buttonOffset = getPosition(self).y;
					buttonHeight = self.offsetHeight;
					windowScroll = window.scrollY;
					windowHeight = window.innerHeight;
					dropdownHeight = dropdown.offsetHeight;

					if ((windowScroll + windowHeight) - (buttonOffset + buttonHeight - 1) >= dropdownHeight) {
						top = buttonOffset + buttonHeight - 1 + 'px';
					} else if ((windowScroll + windowHeight) - (buttonOffset + buttonHeight - 1) < dropdownHeight && (buttonOffset + buttonHeight - 1) - windowScroll > dropdownHeight) {
						top = buttonOffset + buttonHeight - 1 - dropdownHeight + 'px';
					} else {
						top = windowScroll + 'px';
					}

					dropdown.style.top = top;
					dropdown.style.left = getPosition(self).x + 'px';
				break;

				case 'Text Color':
					if (document.getElementById('color-dropdown') == null) {
						createColorDropdown();
					}

					dropdown = document.getElementById('color-dropdown');

					var colors = dropdown.getElementsByClassName('cke_colorbox');

					var colorBoxHandler = function() {
						wrapText(editor.getElementsByClassName('cke_source')[0], '[color=' + getBackgroundColor(this.getElementsByTagName('span')[0]) + ']', '[/color]');

						Classes.removeClass(self.parentNode, 'cke_on');
						Classes.addClass(self.parentNode, 'cke_off');

						Events.getEventsByName('applyColor').remove();

						dropdown.style.display = 'none';

						document.getElementById('dropdown-click-background').remove();
					};

					var colorMoreHandler = function() {
						if (document.getElementById('colorMore-request') == null) {
							createColorMoreRequest();
						}

						var request = document.getElementById('colorMore-request');

						var submitColorMoreHandler = function() {
							var color = document.getElementById('colorMore-input').value;
							wrapText(editor.getElementsByClassName('cke_source')[0], '[color=' + color + ']', '[/color]');

							Events.getEventsByName('submitColorMore').remove();
							Events.getEventsByName('removeColorMoreSubmit').remove();
						};

						var removeColorMoreHandlers = function() {
							Events.getEventsByName('submitColorMore').remove();
							Events.getEventsByName('removeColorMoreSubmit').remove();
						};

						Events.selector(getSubmit(request)).add('click', 'submitColorMore', submitColorMoreHandler, false);

						Events.selector(getCancel(request)).add('click', 'removeColorMoreSubmit', removeColorMoreHandlers, false);

						Events.selector(getClose(request)).add('click', 'removeColorMoreSubmit', removeColorMoreHandlers, false);

						fade(document.getElementById('request-background'), 'in');
						fade(document.getElementById('colorMore-request'), 'in');

						if (window.innerHeight > request.offsetHeight) {
							top = (window.innerHeight / 2) - (request.offsetHeight / 2) + 'px';
						}

						request.style.top = top;
						request.style.left = (window.innerWidth / 2) - 190 + 'px';

						if (request.getElementsByClassName('selected-cell')[0] != null) {
							request.getElementsByClassName('selected-cell')[0].style.border = '1px solid ' + request.getElementsByClassName('selected-cell')[0].style.backgroundColor;
							request.getElementsByClassName('selected-cell')[0].blur();
							Classes.removeClass(request.getElementsByClassName('selected-cell')[0], 'selected-cell');
						}

						request.getElementsByClassName('ColorCell')[0].style.border = '1px dotted #fff';
						Classes.addClass(request.getElementsByClassName('ColorCell')[0], 'selected-cell');
						request.getElementsByClassName('ColorCell')[0].focus();

						Classes.removeClass(self.parentNode, 'cke_on');
						Classes.addClass(self.parentNode, 'cke_off');

						Events.getEventsByName('applyColor').remove();

						dropdown.style.display = 'none';

						document.getElementById('dropdown-click-background').remove();
					};

					if (window.getComputedStyle(dropdown).display === 'none') {
						Classes.removeClass(self.parentNode, 'cke_off');
						Classes.addClass(self.parentNode, 'cke_on');

						Events.selector(dropdown.getElementsByClassName('cke_colorauto')[0]).add('click', 'applyColor', colorBoxHandler, false);

						for (i = 0; i < colors.length; i++) {
							if (colors[i].tagName === 'A') {
								Events.selector(colors[i]).add('click', 'applyColor', colorBoxHandler, false);
							}
						}

						Events.selector(dropdown.getElementsByClassName('cke_colormore')[0]).add('click', 'applyColor', colorMoreHandler, false);

						dropdown.style.display = 'block';

						document.body.appendChild(createElement('div', function(click) {
							click.id = 'dropdown-click-background';
							click.style.position = 'fixed';
							click.style.width = '100%';
							click.style.height = '100%';
							click.style.top = '0px';
							click.style.left = '0px';
							click.style.zIndex = '9998';

							click.onclick = function() {
								Classes.removeClass(self.parentNode, 'cke_on');
								Classes.addClass(self.parentNode, 'cke_off');

								Events.getEventsByName('applyColor').remove();

								dropdown.style.display = 'none';
								this.remove();
								editor.getElementsByClassName('cke_source')[0].focus();
							};
						}));
					}

					buttonOffset = getPosition(self).y;
					buttonHeight = self.offsetHeight;
					windowScroll = window.scrollY;
					windowHeight = window.innerHeight;
					dropdownHeight = dropdown.offsetHeight;

					if ((windowScroll + windowHeight) - (buttonOffset + buttonHeight - 1) >= dropdownHeight) {
						top = buttonOffset + buttonHeight - 1 + 'px';
					} else if ((windowScroll + windowHeight) - (buttonOffset + buttonHeight - 1) < dropdownHeight && (buttonOffset + buttonHeight - 1) - windowScroll > dropdownHeight) {
						top = buttonOffset + buttonHeight - 1 - dropdownHeight + 'px';
					} else {
						top = windowScroll + 'px';
					}

					dropdown.style.top = top;
					dropdown.style.left = getPosition(self).x + 'px';
				break;

				case 'Smiley':
					var smileyTray;

					if (editor.parentNode.parentNode.parentNode.parentNode.getElementsByClassName('ipsSmileyTray')[0] == null) {
						var restoreContent = textArea.value,
						RestoreStart = textArea.selectionStart,
						RestoreEnd = textArea.selectionEnd;

						editor.getElementsByClassName('cke_button_ipssource')[0].click();

						var smileyMain = setInterval(function() {
							if (editor.getElementsByClassName('cke_button_ipssource')[0].getAttribute('aria-pressed') !== 'true' && !Classes.hasClass(editor.getElementsByClassName('cke_button_removeFormat')[0], 'cke_disabled')) {
								editor.getElementsByClassName('cke_button_ipsemoticon')[0].click();

								var smiliesHandler = function(event) {
									if (event.target.nodeType !== 1 || event.target.tagName !== 'IMG') {
										return false;
									}

									wrapText(editor.getElementsByClassName('cke_source')[0], event.target.title, '');
								};

								smileyTray = editor.parentNode.parentNode.parentNode.parentNode.getElementsByClassName('ipsSmileyTray')[0];

								Events.selector(smileyTray).add('click', 'addSmiley', smiliesHandler, false);

								editor.getElementsByClassName('cke_button_ipssource')[0].click();
								smileyTray.nextSibling.remove();

								var checker = setInterval(function() {
									if (editor.getElementsByClassName('cke_button_ipssource')[0].getAttribute('aria-pressed') === 'true' && Classes.hasClass(editor.getElementsByClassName('cke_button_removeFormat')[0], 'cke_disabled')) {
										Classes.removeClass(editor.getElementsByClassName('cke_button_ipsbbcode')[0], 'cke_disabled');
										Classes.removeClass(editor.getElementsByClassName('cke_font')[0], 'cke_disabled');
										Classes.removeClass(editor.getElementsByClassName('cke_fontSize')[0], 'cke_disabled');
										Classes.removeClass(editor.getElementsByClassName('cke_button_textcolor')[0], 'cke_disabled');
										Classes.removeClass(editor.getElementsByClassName('cke_button_ipsemoticon')[0], 'cke_disabled');
										Classes.removeClass(editor.getElementsByClassName('cke_button_bold')[0], 'cke_disabled');
										Classes.removeClass(editor.getElementsByClassName('cke_button_italic')[0], 'cke_disabled');
										Classes.removeClass(editor.getElementsByClassName('cke_button_underline')[0], 'cke_disabled');
										Classes.removeClass(editor.getElementsByClassName('cke_button_strike')[0], 'cke_disabled');
										Classes.removeClass(editor.getElementsByClassName('cke_button_subscript')[0], 'cke_disabled');
										Classes.removeClass(editor.getElementsByClassName('cke_button_superscript')[0], 'cke_disabled');
										Classes.removeClass(editor.getElementsByClassName('cke_button_bulletedlist')[0], 'cke_disabled');
										Classes.removeClass(editor.getElementsByClassName('cke_button_numberedlist')[0], 'cke_disabled');
										Classes.removeClass(editor.getElementsByClassName('cke_button_link')[0], 'cke_disabled');
										Classes.removeClass(editor.getElementsByClassName('cke_button_image')[0], 'cke_disabled');
										Classes.removeClass(editor.getElementsByClassName('cke_button_ipscode')[0], 'cke_disabled');
										Classes.removeClass(editor.getElementsByClassName('cke_button_ipsquote')[0], 'cke_disabled');
										Classes.removeClass(editor.getElementsByClassName('cke_button_indent')[0], 'cke_disabled');
										Classes.removeClass(editor.getElementsByClassName('cke_button_justifycenter')[0], 'cke_disabled');
										Classes.removeClass(editor.getElementsByClassName('cke_button_justifyright')[0], 'cke_disabled');
										fade(smileyTray, 'in', 100);
										clearTimeout(checker);
									}
								}, 1000);

								if (editor.getElementsByClassName('cke_source')[0] != null) {
									editor.getElementsByClassName('cke_source')[0].focus();
									editor.getElementsByClassName('cke_source')[0].value = restoreContent;
									selectRange(editor.getElementsByClassName('cke_source')[0], RestoreStart, RestoreEnd);
								}

								clearTimeout(smileyMain);
							}
						}, 1000);
					} else {
						smileyTray = editor.parentNode.parentNode.parentNode.parentNode.getElementsByClassName('ipsSmileyTray')[0];
						fade(smileyTray, 'toggle', 100);
					}
				break;

				case 'Bold':
					wrapText(editor.getElementsByClassName('cke_source')[0], '[b]', '[/b]');
				break;

				case 'Italic':
					wrapText(editor.getElementsByClassName('cke_source')[0], '[i]', '[/i]');
				break;

				case 'Underline':
					wrapText(editor.getElementsByClassName('cke_source')[0], '[u]', '[/u]');
				break;

				case 'Strike Through':
					wrapText(editor.getElementsByClassName('cke_source')[0], '[s]', '[/s]');
				break;

				case 'Subscript':
					wrapText(editor.getElementsByClassName('cke_source')[0], '[sub]', '[/sub]');
				break;

				case 'Superscript':
					wrapText(editor.getElementsByClassName('cke_source')[0], '[sup]', '[/sup]');
				break;
				
				case 'Insert/Remove Bulleted List':
					wrapText(editor.getElementsByClassName('cke_source')[0], '[list]\n[*]', '[/*]\n[/list]');
				break;

				case 'Insert/Remove Numbered List':
					wrapText(editor.getElementsByClassName('cke_source')[0], '[list=1]\n[*]', '[/*]\n[/list]');
				break;

				case 'Link':
					selectedText = getSelection(textArea);

					if (selectedText.length && selectedText.substr(0, 4) === 'http') {
						wrapText(editor.getElementsByClassName('cke_source')[0], '[url=' + selectedText + ']', '[/url]');
					} else {
						if (document.getElementById('plaintext-request') == null) {
							createRequest();
						}

						request = document.getElementById('plaintext-request');

						request.getElementsByClassName('request-type')[0].childNodes[0].nodeValue = 'Link';

						empty(request.getElementsByClassName('spec')[0]);
						request.getElementsByClassName('spec')[0].appendChild(createElement('span', function(el) {
							el.style.fontWeight = 'bolder';
							el.appendChild(document.createTextNode('URL'));
						}));

						empty(request.getElementsByClassName('fields')[0]);
						request.getElementsByClassName('fields')[0].appendChild(createElement('div', function(el) {
							el.className = 'cke_dialog_ui_input_text';
							el.appendChild(createElement('input', function(input) {
								input.className = 'cke_dialog_ui_input_text';
								input.type = 'text';
							}));
						}));

						var submitLinkHandler = function() {
							var link = request.getElementsByClassName('fields')[0].getElementsByTagName('input')[0].value;

							selectedText = getSelection(textArea);

							if (selectedText.length) {
								wrapText(editor.getElementsByClassName('cke_source')[0], '[url=' + link + ']', '[/url]');
							} else {
								wrapText(editor.getElementsByClassName('cke_source')[0], '[url=' + link + ']' + link, '[/url]');
							}

							Events.getEventsByName('applyLinkRequest').remove();
							Events.getEventsByName('removeLinkSubmit').remove();
						};

						var removeLinkHandlers = function() {
							Events.getEventsByName('applyLinkRequest').remove();
							Events.getEventsByName('removeLinkSubmit').remove();
						};

						Events.selector(getSubmit(request)).add('click', 'applyLinkRequest', submitLinkHandler, false);

						Events.selector(getCancel(request)).add('click', 'removeLinkSubmit', removeLinkHandlers, false);

						Events.selector(getClose(request)).add('click', 'removeLinkSubmit', removeLinkHandlers, false);

						fade(document.getElementById('request-background'), 'in');
						fade(document.getElementById('plaintext-request'), 'in');

						if (window.innerHeight > request.offsetHeight) {
							top = (window.innerHeight / 2) - (request.offsetHeight / 2) + 'px';
						}

						request.style.top = top;
						request.style.left = (window.innerWidth / 2) - 200 + 'px';
						request.style.width = '400px';

						request.getElementsByClassName('fields')[0].getElementsByTagName('input')[0].focus();
					}
				break;

				case 'Image':
					selectedText = getSelection(textArea);

					if (selectedText.length && selectedText.substr(0, 4) === 'http') {
						wrapText(editor.getElementsByClassName('cke_source')[0], '[img=', ']');
					} else {
						if (document.getElementById('plaintext-request') == null) {
							createRequest();
						}

						request = document.getElementById('plaintext-request');

						request.getElementsByClassName('request-type')[0].childNodes[0].nodeValue = 'Image';

						empty(request.getElementsByClassName('spec')[0]);
						request.getElementsByClassName('spec')[0].appendChild(createElement('span', function(el) {
							el.style.fontWeight = 'bolder';
							el.appendChild(document.createTextNode('URL'));
						}));

						empty(request.getElementsByClassName('fields')[0]);
						request.getElementsByClassName('fields')[0].appendChild(createElement('div', function(el) {
							el.className = 'cke_dialog_ui_input_text';
							el.appendChild(createElement('input', function(input) {
								input.className = 'cke_dialog_ui_input_text';
								input.type = 'text';
							}));
						}));

						var submitImageHandler = function() {
							var link = request.getElementsByClassName('fields')[0].getElementsByTagName('input')[0].value;

							selectedText = getSelection(textArea);

							wrapText(editor.getElementsByClassName('cke_source')[0], '[img=' + link + ']', '');

							Events.getEventsByName('applyImageRequest').remove();
							Events.getEventsByName('removeImageSubmit').remove();
						};

						var removeImageHandlers = function() {
							Events.getEventsByName('applyImageRequest').remove();
							Events.getEventsByName('removeImageSubmit').remove();
						};

						Events.selector(getSubmit(request)).add('click', 'applyImageRequest', submitImageHandler, false);

						Events.selector(getCancel(request)).add('click', 'removeImageSubmit', removeImageHandlers, false);

						Events.selector(getClose(request)).add('click', 'removeImageSubmit', removeImageHandlers, false);

						fade(document.getElementById('request-background'), 'in');
						fade(document.getElementById('plaintext-request'), 'in');

						if (window.innerHeight > request.offsetHeight) {
							top = (window.innerHeight / 2) - (request.offsetHeight / 2) + 'px';
						}

						request.style.top = top;
						request.style.left = (window.innerWidth / 2) - 200 + 'px';
						request.style.width = '400px';

						request.getElementsByClassName('fields')[0].getElementsByTagName('input')[0].focus();
					}
				break;

				case 'Code':
					selectedText = getSelection(textArea);

					if (selectedText.length) {
						wrapText(editor.getElementsByClassName('cke_source')[0], '[code=auto:0]', '[/code]');
					} else {
						if (document.getElementById('plaintext-request') == null) {
							createRequest();
						}

						request = document.getElementById('plaintext-request');
						request.getElementsByClassName('request-type')[0].childNodes[0].nodeValue = 'Code';

						empty(request.getElementsByClassName('spec')[0]);
						request.getElementsByClassName('spec')[0].appendChild(createElement('span', function(el) {
							el.style.fontWeight = 'bolder';
							el.appendChild(document.createTextNode('Code Type'));
						}));

						empty(request.getElementsByClassName('fields')[0]);

						request.getElementsByClassName('fields')[0].appendChild(createElement('select', function(select) {
							select.className = 'cke_dialog_ui_input_select';

							select.options[0] = new Option(' PHP/Generic/Auto Detect', 'auto', true);
							select.options[1] = new Option(' Javascript', 'js');
							select.options[2] = new Option(' HTML', 'html');
							select.options[3] = new Option(' SQL', 'sql');
							select.options[4] = new Option(' CSS', 'css');
							select.options[5] = new Option(' XML', 'xml');
							select.options[6] = new Option(' None', 'nocode');
						}));

						request.getElementsByClassName('fields')[0].appendChild(createElement('div', function(cont) {
							cont.className = 'cke_dialog_ui_vbox_child';

							cont.appendChild(document.createTextNode('Starting Line Number'));

							cont.appendChild(createElement('div', function(box) {
								box.className = 'cke_dialog_ui_input_text';
								box.appendChild(createElement('input', function(input) {
									input.className = 'cke_dialog_ui_input_text code-line-number';
									input.type = 'text';
								}));
							}));

							cont.appendChild(createElement('div', function(box) {
								box.className = 'cke_dialog_ui_vbox_child';
								box.style.paddingBottom = '0px';

								box.appendChild(createElement('div', function(textcont) {
									textcont.className = 'cke_dialog_ui_input_textarea';

									textcont.appendChild(createElement('textarea', function(text) {
										text.className = 'cke_dialog_ui_input_textarea code-body';
										text.rows = 5;
										text.cols = 20;
										text.style.height = '240px';
										text.style.direction = 'ltr';
										text.style.fontFamily = 'monospace';
										text.style.fontSize = '13px';
									}));
								}));
							}));
						}));

						var submitCodeHandler = function() {
							var type = request.getElementsByClassName('fields')[0].getElementsByTagName('select')[0].options[request.getElementsByClassName('fields')[0].getElementsByTagName('select')[0].selectedIndex].value,
							line = request.getElementsByClassName('fields')[0].getElementsByClassName('code-line-number')[0].value,
							body = request.getElementsByClassName('fields')[0].getElementsByClassName('code-body')[0].value;

							if (!line.length) {
								line = 0;
							}

							wrapText(editor.getElementsByClassName('cke_source')[0], '[code=' + type + ':' + line + ']' + body + '[/code]', '');

							Events.getEventsByName('applyCodeRequest').remove();
							Events.getEventsByName('removeCodeSubmit').remove();
						};

						var removeCodeHandlers = function() {
							Events.getEventsByName('applyCodeRequest').remove();
							Events.getEventsByName('removeCodeSubmit').remove();
						};

						Events.selector(getSubmit(request)).add('click', 'applyCodeRequest', submitCodeHandler, false);

						Events.selector(getCancel(request)).add('click', 'removeCodeSubmit', removeCodeHandlers, false);

						Events.selector(getClose(request)).add('click', 'removeCodeSubmit', removeCodeHandlers, false);

						fade(document.getElementById('request-background'), 'in');
						fade(document.getElementById('plaintext-request'), 'in');

						if (window.innerHeight > request.offsetHeight) {
							top = (window.innerHeight / 2) - (request.offsetHeight / 2) + 'px';
						}

						request.style.top = top;
						request.style.left = (window.innerWidth / 2) - 385 + 'px';
						request.style.width = '770px';

						request.getElementsByClassName('fields')[0].getElementsByClassName('code-body')[0].focus();
					}
				break;

				case 'Quote':
					wrapText(editor.getElementsByClassName('cke_source')[0], '[quote]', '[/quote]');
				break;

				case 'Increase Indent':
					wrapText(editor.getElementsByClassName('cke_source')[0], '[indent=1]', '[/indent]');
				break;

				case 'Center':
					wrapText(editor.getElementsByClassName('cke_source')[0], '[center]', '[/center]');
				break;

				case 'Align Right':
					wrapText(editor.getElementsByClassName('cke_source')[0], '[right]', '[/right]');
				break;

				default:
					return false;
			}
		}
	};

	for (i = 0; i < buttons.length; i++) {
		Events.selector(buttons[i].getElementsByTagName('a')[0]).add('click', 'Plaintext_BBCode', plaintextBBCodeHandler, false);
	}

	for (i = 0; i < dropdowns.length; i++) {
		Events.selector(dropdowns[i].getElementsByTagName('a')[0]).add('click', 'Plaintext_BBCode', plaintextBBCodeHandler, false);
	}

	Classes.addClass(editor.getElementsByClassName('cke_button_ipssource')[0], 'bbcode-parsed');
}

function plaintextBBCode(editor) {
	if (Classes.hasClass(editor.getElementsByClassName('cke_button_ipssource')[0], 'cke_on')) {
		Classes.removeClass(editor.getElementsByClassName('cke_button_ipsbbcode')[0], 'cke_disabled');
		Classes.removeClass(editor.getElementsByClassName('cke_font')[0], 'cke_disabled');
		Classes.removeClass(editor.getElementsByClassName('cke_fontSize')[0], 'cke_disabled');
		Classes.removeClass(editor.getElementsByClassName('cke_button_textcolor')[0], 'cke_disabled');
		Classes.removeClass(editor.getElementsByClassName('cke_button_ipsemoticon')[0], 'cke_disabled');
		Classes.removeClass(editor.getElementsByClassName('cke_button_bold')[0], 'cke_disabled');
		Classes.removeClass(editor.getElementsByClassName('cke_button_italic')[0], 'cke_disabled');
		Classes.removeClass(editor.getElementsByClassName('cke_button_underline')[0], 'cke_disabled');
		Classes.removeClass(editor.getElementsByClassName('cke_button_strike')[0], 'cke_disabled');
		Classes.removeClass(editor.getElementsByClassName('cke_button_subscript')[0], 'cke_disabled');
		Classes.removeClass(editor.getElementsByClassName('cke_button_superscript')[0], 'cke_disabled');
		Classes.removeClass(editor.getElementsByClassName('cke_button_bulletedlist')[0], 'cke_disabled');
		Classes.removeClass(editor.getElementsByClassName('cke_button_numberedlist')[0], 'cke_disabled');
		Classes.removeClass(editor.getElementsByClassName('cke_button_link')[0], 'cke_disabled');
		Classes.removeClass(editor.getElementsByClassName('cke_button_image')[0], 'cke_disabled');
		Classes.removeClass(editor.getElementsByClassName('cke_button_ipscode')[0], 'cke_disabled');
		Classes.removeClass(editor.getElementsByClassName('cke_button_ipsquote')[0], 'cke_disabled');
		Classes.removeClass(editor.getElementsByClassName('cke_button_indent')[0], 'cke_disabled');
		Classes.removeClass(editor.getElementsByClassName('cke_button_justifycenter')[0], 'cke_disabled');
		Classes.removeClass(editor.getElementsByClassName('cke_button_justifyright')[0], 'cke_disabled');

		if (!Classes.hasClass(editor.getElementsByClassName('cke_button_ipssource')[0], 'bbcode-parsed')) {
			plaintextParser(editor);
		}
	}

	var buttonParseHandler = function() {
		setTimeout(function() {
			var checker = setInterval(function() {
				if (Classes.hasClass(editor.getElementsByClassName('cke_button_ipssource')[0], 'cke_on')) {
					Classes.removeClass(editor.getElementsByClassName('cke_button_ipsbbcode')[0], 'cke_disabled');
					Classes.removeClass(editor.getElementsByClassName('cke_font')[0], 'cke_disabled');
					Classes.removeClass(editor.getElementsByClassName('cke_fontSize')[0], 'cke_disabled');
					Classes.removeClass(editor.getElementsByClassName('cke_button_textcolor')[0], 'cke_disabled');
					Classes.removeClass(editor.getElementsByClassName('cke_button_ipsemoticon')[0], 'cke_disabled');
					Classes.removeClass(editor.getElementsByClassName('cke_button_bold')[0], 'cke_disabled');
					Classes.removeClass(editor.getElementsByClassName('cke_button_italic')[0], 'cke_disabled');
					Classes.removeClass(editor.getElementsByClassName('cke_button_underline')[0], 'cke_disabled');
					Classes.removeClass(editor.getElementsByClassName('cke_button_strike')[0], 'cke_disabled');
					Classes.removeClass(editor.getElementsByClassName('cke_button_subscript')[0], 'cke_disabled');
					Classes.removeClass(editor.getElementsByClassName('cke_button_superscript')[0], 'cke_disabled');
					Classes.removeClass(editor.getElementsByClassName('cke_button_bulletedlist')[0], 'cke_disabled');
					Classes.removeClass(editor.getElementsByClassName('cke_button_numberedlist')[0], 'cke_disabled');
					Classes.removeClass(editor.getElementsByClassName('cke_button_link')[0], 'cke_disabled');
					Classes.removeClass(editor.getElementsByClassName('cke_button_image')[0], 'cke_disabled');
					Classes.removeClass(editor.getElementsByClassName('cke_button_ipscode')[0], 'cke_disabled');
					Classes.removeClass(editor.getElementsByClassName('cke_button_ipsquote')[0], 'cke_disabled');
					Classes.removeClass(editor.getElementsByClassName('cke_button_indent')[0], 'cke_disabled');
					Classes.removeClass(editor.getElementsByClassName('cke_button_justifycenter')[0], 'cke_disabled');
					Classes.removeClass(editor.getElementsByClassName('cke_button_justifyright')[0], 'cke_disabled');

					if (!Classes.hasClass(editor.getElementsByClassName('cke_button_ipssource')[0], 'bbcode-parsed')) {
						plaintextParser(editor);
					}
					clearTimeout(checker);
				}
			}, 10);
		}, 100);
		
		var smileyTray = editor.parentNode.parentNode.parentNode.parentNode.getElementsByClassName('ipsSmileyTray')[0];

		if (smileyTray != null) {
			fade(smileyTray, 'out', 100);
		}
	};

	Events.selector(editor.getElementsByClassName('cke_button_ipssource')[0]).add('click', 'parseBBCode', buttonParseHandler, false);
}

var initBBCodeHandler = function(event) {
	var instance;

	if (isChildOf('.cke_editor', event.target)) {
		instance = getParent('.cke_editor', event.target);
	} else {
		return false;
	}

	if (Classes.hasClass(instance, 'plaintextBBCode')) {
		return false;
	}

	if (Classes.hasClass(instance.getElementsByClassName('cke_button_ipssource')[0], 'cke_on') && Classes.hasClass(instance.getElementsByClassName('cke_button_bold')[0], 'cke_disabled')) {
		plaintextBBCode(instance);
		console.log('Plaintext BBCode initilized on:', instance);
		Classes.addClass(instance, 'plaintextBBCode');
	}
};

if (document.body.id === 'ipboard_body') {
	Events.selector(document).add('mouseover', 'initBBCode', initBBCodeHandler, false);
}