var cnt = 0;
var Ktml_initialized = false;
var thisTimeoutID;
var curWin = null;
var winCount = 0;
var Ktml_object = null;
var openWins = new Array();
var inspectedFld = null;
var holdForCallback = null;
Object_weave_safe(utility, {
	req: {}
});
utility.req.create_socket = function () {
	function getXmlHttpPrefix() {
		if (getXmlHttpPrefix.prefix) return getXmlHttpPrefix.prefix;
		var prefixes = ["MSXML2", "Microsoft", "MSXML", "MSXML3"];
		var o;
		for (var i = 0; i < prefixes.length; i++) {
			try {
				o = new ActiveXObject(prefixes[i] + ".XmlHttp");
				return getXmlHttpPrefix.prefix = prefixes[i];
			}
			catch(ex) {}
		}
		throw new Error("Could not find an installed XML parser");
	}
	try {
		if (window.XMLHttpRequest) {
			var req = new XMLHttpRequest();
			if (req.readyState == null) {
				req.readyState = 1;
				req.addEventListener("load", function () {
					req.readyState = 4;
					if (typeof req.onreadystatechange == "function") {
						req.onreadystatechange();
					}
				}, false);
			}
			return req;
		}
		if (window.ActiveXObject) {
			var ax = new ActiveXObject(getXmlHttpPrefix() + ".XmlHttp");
			return ax;
		}
	}
	catch(ex) {}
	return false;
};
utility.req.request = function () {};
utility.req.request.events = ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];
utility.req.request.prototype = {
	initialize: function (url, options) {
		this.sock = utility.req.create_socket();
		if (typeof options == 'undefined') {
			options = {};
		}
		this.url = (!(typeof url == 'undefined' || url == null) ? url : '');
		this.set_options(options);
		this.request(url);
	},
	set_options: function (options) {
		var default_options = {
			method: 'get',
			async: false,
			get: null,
			post: null,
			post_body: null,
			headers: null
		};
		this.options = Object_weave_safe(options, default_options);
	},
	request: function (url) {
		var tmp = '';
		var params_get = this.options.get || '';
		if (typeof params_get == 'object') {
			for (var key in params_get) {
				var value = params_get[key];
				tmp += "&" + key + "=" + encodeURI(params_get[key]);
			}
			if (tmp.length > 0) tmp = tmp.substr(1);
		}
		var str_get = tmp;
		tmp = '';
		var params_post = this.options.post || '';
		if (typeof params_post == 'object') {
			for (var key in params_post) {
				var value = params_post[key];
				tmp += "&" + key + "=" + encodeURI(params_post[key]);
			}
		}
		var str_post = tmp;
		try {
			if (this.options.method == 'get') url += '?' + str_get;
			this.sock.open(this.options.method, url, this.options.async);
			if (this.options.async) {
				this.sock.onreadystatechange = Function_bind(this.on_state_change, this);
				setTimeout(Function_bind((function () {
					this.respond_ready_state(1)
				}), this), 50);
			}
			this.set_request_headers();
			var body = this.options.post_body ? this.options.post_body : str_post;
			this.sock.send(this.options.method == 'post' ? body : null);
		}
		catch(e) {}
	},
	set_request_headers: function () {
		var headers = ['X-Requested-With', 'XMLHttpRequest'];
		if (this.options.method == 'post') {
			headers.push('Content-type', 'application/x-www-form-urlencoded');
			if (this.sock.overrideMimeType) headers.push('Connection', 'close');
		}
		if (this.options.headers) headers.push.apply(headers, this.options.headers);
		for (var i = 0; i < headers.length; i += 2)
		this.sock.setRequestHeader(headers[i], headers[i + 1]);
	},
	on_state_change: function () {
		var readyState = this.sock.readyState;
		if (readyState != 1) this.respond_ready_state(this.sock.readyState);
	},
	respond_ready_state: function (readyState) {
		try {
			if (this && this.sock) {
				var tmp = this.sock.status;
			}
		}
		catch(e) {
			return;
		}
		var event = utility.req.request.events[readyState];
		if (event == 'Complete') {
			if (this.is_success()) {
				if (this.options.onSuccess) {
					this.options.onSuccess(this.sock);
				}
			} else {
				if (this.options.onFailure) {
					this.options.onFailure(this.sock);
				}
			}
		}(this.options['on' + event] || utility.js.empty_func)(this.sock);
		if (event == 'Complete') {
			this.sock.onreadystatechange = utility.js.empty_func;
		}
	},
	is_success: function () {
		return (this.sock.status == undefined || this.sock.status == 0 || (this.sock.status >= 200 && this.sock.status < 300));
	},
	is_failure: function () {
		return !this.is_success();
	}
};
function Ktml_initDebug() {}
var LOG_ERROR = "ERROR", LOG_WARNING = "WARNING", LOG_INFO = "INFO";
function KTMLLogger(owner) {
	KTStorage.add(this);
	this.owner = owner;
	this.painted = false;
	this.errors = [];
	this.filter = {
		type: '',
		where: ''
	};
	this.logger = null;
	var debug = util_defaultValue($KTML4_GLOBALS['debug'], 'false');
	this.enabled = debug == 'true';
};
KTMLLogger.prototype.paint = function () {
	if (!this.enabled || this.painted) {
		return;
	}
	var ktml = ktmls[this.owner];
	var logger = utility.dom.createElement("DIV", {
		id: this.id + '_logger',
		className: 'error_log'
	});
	logger = ktml.formElement.parentNode.insertBefore(logger, ktml.formElement);
	logger.innerHTML = '<div class="error_log_header">KTML4 Error Log</div><div class="error_log_close_button"><input id="' + this.id + '_close_button" type="button" value="Show" onclick="ktmls[' + this.owner + '].logger.toggle()" /></div>';
	var log_body = utility.dom.createElement("DIV", {
		id: this.id + '_log_body',
		className: 'error_log_body'
	});
	log_body = ktml.formElement.parentNode.insertBefore(log_body, ktml.formElement);
	this.logger = this.id + '_logger';
	this.log_body = this.id + '_log_body';
	this.close_button = this.id + '_close_button';
	this.painted = true;
};
KTMLLogger.prototype.log = function (type, where, what) {
	if (!this.enabled) {
		return;
	}
	this.errors.push({
		type: type,
		where: where,
		what: what
	});
	this.paint();
	if (this.visible) {
		this.show(type, where);
	}
};
KTMLLogger.prototype.toggle = function () {
	var btn = document.getElementById(this.close_button);
	if (this.visible) {
		btn.value = "Show";
		this.hide();
	} else {
		btn.value = "Hide";
		this.show(this.filter.type, this.filter.where);
	}
};
KTMLLogger.prototype.show = function (type, where) {
	if (!this.enabled) {
		return;
	}
	this.filter.type = util_defaultValue(type, '');
	this.filter.where = util_defaultValue(where, '');
	this.paint();
	var ktml = ktmls[this.owner];
	ktml.preserveSelection(false);
	var logger = document.getElementById(this.logger);
	var log_body = document.getElementById(this.log_body);
	log_body.style.top = '-10000px';
	log_body.style.left = '-10000px';
	log_body.style.display = 'block';
	log_body.style.width = ktml.width + 'px';
	log_body.style.height = ktml.height + 'px';
	var err = null;
	var errors = '';
	for (var i = 0; i < this.errors.length; i++) {
		err = this.errors[i];
		if ((err.type == this.filter.type || '' == this.filter.type) && (err.where == this.filter.where || '' == this.filter.where)) {
			errors += '<div class="error_log_item ' + err.type + '"><div class="error_log_type">' + err.type + ': </div><div class="error_log_where">' + err.where + ': </div><div class="error_log_message">' + err.what + '</div></div>' + "\r\n";
		}
	}
	log_body.innerHTML = errors;
	this.visible = true;
	utility.dom.putElementAt(log_body, ktml.div, '00');
};
KTMLLogger.prototype.hide = function () {
	if (!this.enabled || !this.painted) {
		return;
	}
	var log_body = document.getElementById(this.log_body);
	log_body.style.display = "none";
	this.visible = false;
};
function Logging() {
	alert("This is a static class");
}
Logging.initialize = Logging_initialize;
Logging.entering = Logging_entering;
Logging.exiting = Logging_exiting;
Logging.log = Logging_log;
Logging.setLevel = Logging_setLevel;
Logging.write = Logging_write;
Logging.parse = Logging_parse;
Logging.accepted = Logging_accepted;
Logging.alertAttr = Logging_alertAttr;
Logging.dumpVar = Logging_dumpVar;
Logging.getPrefix = Logging_getPrefix;
Logging.alert = Logging_alert;
Logging.prompt = Logging_prompt;
Logging.pushTime = Logging_pushTime;
Logging.popTime = Logging_popTime;
Logging.params = {};
Logging.level = 3;
Logging.MAXLOG = 20;
Logging.ws = " ";
Logging.enter = " {";
Logging.exit = "}	";
Logging.profile = true;
Logging.times = Array();
Logging.passObj = Array();
function Logging_initialize() {
	var tmp = "------ Logging system 0.1 ---------\n";
	tmp += "-----------------------------------\n\n";
	Logging.write(tmp, false);
}
function Logging_entering(className, level) {
	if (typeof level == 'undefined') {
		level = Logging.level;
	}
	if (!Logging.accepted(level)) {
		return;
	}
	if (!className) {
		className = Logging_entering.caller.name
	}
	var rest = '';
	var temp = Logging.getPrefix(level) + Logging.enter + className;
	Logging.ws += "  ";
	Logging.write(temp + "\n");
	if (Logging.profile) {
		Logging.times.push(new Date());
	}
}
function Logging_exiting(className, level, result) {
	if (typeof level == 'undefined') {
		level = Logging.level;
	}
	if (!Logging.accepted(level)) {
		return;
	}
	if (!className) {
		className = Logging_exiting.caller.name;
	}
	if (Logging.profile) {
		var now = new Date();
		var start = Logging.times.pop();
	}
	Logging.ws = Logging.ws.substring(0, Logging.ws.length - 2);
	var temp = Logging.getPrefix(level) + Logging.exit + "." + className;
	if (typeof(result) != "undefined") {
		temp += " with result " + Logging.dumpVar(result);
	}
	if (Logging.profile) {
		temp += ' in ' + (now - start) + ' ms';
	}
	Logging.write(temp + "\n");
}
function Logging_getPrefix(level) {
	return "";
}
function Logging_log(message, rx, level) {
	if (typeof rx == 'undefined') {
		rx = new RegExp("", "");
	}
	if (typeof level == 'undefined') {
		level = Logging.level;
	}
	if (!Logging.accepted(level)) {
		return;
	}
	Logging.write(Logging.getPrefix(level) + Logging.ws + Logging.dumpVar(message, rx) + "\n");
}
function Logging_setLevel(level) {
	Logging.level = level;
}
function Logging_accepted(level) {
	if (level <= 0 || level > Logging.MAXLOG) {
		alert("Logging level must be an integer between 1 and 20.");
		return false;
	}
	if (level <= Logging.level) {
		return true;
	} else {
		return false;
	}
}
function Logging_dumpVar(obj, rx, tab, inner) {
	return utility.debug.dumpone(obj, rx);
	tm = "";
	if (!tab) {
		tab = "";
	}
	if (Array_indexOf(Logging.passObj, obj) != -1) {
		tm += Logging.ws + tab + " " + obj;
		return tm;
	}
	tab += "  ";
	if (typeof(obj) == "object") {
		Logging.passObj.push(obj);
		for (i in obj) {
			if (typeof(obj[i]) != "function") {
				var isobj = typeof(obj[i]) == "object";
				tm += Logging.ws + tab + i + ": {";
				if (isobj) {
					tm += "\n";
				}
				tm += Logging.dumpVar(obj[i], rx, tab, true);
				if (isobj) {
					tm += Logging.ws + tab + " ";
				}
				tm += "}	\n";
			}
		}
		Logging.passObj.pop();
	} else if (typeof(obj) == "function") {
		tm += Logging.ws + tab + typeof(obj);
	} else {
		if (!inner) {
			tm += Logging.ws + tab + typeof(obj);
		}
		tm += obj;
	}
	tab = tab.substring(0, tab.length - 2);
	return tm;
}
function Logging_alertAttr(obj, rx) {
	alert(Logging.dumpVar(obj, rx));
}
function Logging_prompt(obj, rx) {
	prompt("", Logging.dumpVar(obj, rx));
}
function Logging_write(message, append) {
	if (typeof Logging.params.element == 'string') {
		var container = document.getElementById(Logging.params.element);
	}
	var el = Logging.params.element;
	if (!el) {
		return false;
	}
	el.value = ((append != undefined) && (append == false)) ? message : el.value + "\r\n" + message;
	return true;
}
function Logging_parse(method) {
	var all = "";
	var name = method.name;
	all += name;
	var args = method.arguments;
	return all;
}
function Logging_pushTime(level) {
	if (!Logging.accepted(level)) {
		return;
	}
	Logging.times.push(new Date());
	var temp = Logging.getPrefix(level) + Logging.ws + 'Start time balize: ';
	Logging.write(temp + "\n");
}
function Logging_popTime(level, leave) {
	if (!Logging.accepted(level)) {
		return;
	}
	var now = new Date();
	if (leave) {
		var start = Logging.times.pop();
	} else {
		var start = Logging.times[Logging.times.length - 1];
	}
	var temp = Loggin.getPrefix(level) + Logging.ws + 'End time balize: ';
	if (Logging.profile) {
		temp += ' in ' + (now - start) + ' ms';
	}
	Logging.write(temp + "\n");
}
function Logging_alert(obj, rx) {
	alert(Logging.dumpVar(obj, rx));
}
function UndoItem(undoManager, text) {
	this.parent = undoManager;
	this.hasBookmarks = this.parent.hasBookmarks;
	this.text = text;
	this.add();
}
function UndoItem_toString() {
	var str = "";
	return str;
}
function UndoItem_add() {
	var obj = this;
	if (this.parent.owner.edit.readyState != 'complete') {
		setTimeout(function () {
			return obj.add();
		}, 100);
		return;
	}
	var book, sel;
	sel = this.getSelection();
	book = this.getBookmark();
	if (!sel) {
		return;
	}
	this.selection_start = sel;
	this.bookmark_start = book;
	if (!this.selection_end) {
		this.selection_end = sel;
		this.bookmark_end = book;
	}
}
function UndoItem_getBookmark() {
	var selected = this.parent.owner.edit.selection;
	if (!selected) return null;
	var tr = selected.createRange();
	if (this.hasBookmarks) {
		if (selected.type != "Control") {
			var selection_marker = null;
			while (selection_marker = this.parent.owner.edit.getElementById('selection_marker')) {
				selection_marker.parentNode.removeChild(selection_marker);
			}
			try {
				tr.collapse(false);
				tr.pasteHTML('<span id="selection_marker"></span>');
				this.text = this.parent.owner.edit.body.innerHTML;
				selection_marker = this.parent.owner.edit.getElementById('selection_marker');
				selection_marker.removeNode(true);
			}
			catch(err) {}
			return tr.getBookmark();
		} else {
			return tr(0);
		}
	} else {
		return null;
	}
}
function UndoItem_getSelection() {
	try {
		var selected = this.parent.owner.edit.selection;
		var tr = selected.createRange();
		if (!tr) {
			return null;
		}
		if (this.hasBookmarks) {
			return tr;
		} else {
			var sel = new Object;
			sel.startOffset = tr.startOffset;
			sel.endOffset = tr.endOffset;
			sel.startContainer = static_UndoItem_getNumericPath(tr.startContainer);
			sel.endContainer = static_UndoItem_getNumericPath(tr.endContainer);
			return sel;
		}
	}
	catch(err) {
		return null;
	}
}
function UndoItem_getTrueSelection(sel) {
	if (this.hasBookmarks) {
		return sel;
	} else {
		var selected = this.parent.owner.edit.selection;
		var tr = selected.createRange();
		var node = this.getNodeForPath(sel.endContainer);
		try {
			tr.setEnd(node, sel.endOffset);
		}
		catch(e) {
			if (node.nodeValue) {} else {
				tr.setEnd(node.previousSibling, sel.endNode);
			}
		}
		node = this.getNodeForPath(sel.startContainer);
		tr.setStart(node, sel.startOffset);
		return tr;
	}
}
function static_UndoItem_getNumericPath(node) {
	var path = new Array();
	var root = node.ownerDocument.documentElement;
	while (node != root) {
		var first = node.parentNode.firstChild;
		var i = 0;
		while (node != first) {
			node = node.previousSibling;
			i++;
		}
		path.push(i);
		node = node.parentNode;
	}
	return path.reverse();
}
function UndoItem_getNodeForPath(path) {
	var node = this.parent.owner.edit.documentElement;
	var kids;
	for (var i = 0; i < path.length; i++) {
		kids = node.childNodes;
		node = kids[path[i]];
	}
	return node;
}
function UndoItem_moveTo(sel, book) {
	var tr;
	this.parent.owner.cw.focus();
	if (this.hasBookmarks) {
		try {
			tr = this.parent.owner.edit.body.createTextRange();
			var selection_marker = this.parent.owner.edit.getElementById('selection_marker');
			tr.moveToElementText(selection_marker);
			tr.collapse(false);
			tr.select();
			selection_marker.removeNode(true);
		}
		catch(e) {}
	} else {
		try {
			tr = this.getTrueSelection(sel);
			tr.collapse(false);
		}
		catch(e) {}
	}
}
function UndoItem_undo() {
	this.moveTo(this.selection_start, this.bookmark_start);
}
function UndoItem_redo() {
	this.moveTo(this.selection_end, this.bookmark_end);
}
function UndoManager(ktml) {
	this.owner = ktml;
	this.limit = 50;
	this.edits = new Array();
	if (is.ie) {
		this.hasBookmarks = 1;
	} else {
		this.hasBookmarks = 0;
	}
}
function Undo_toString() {
	var i, str = "";
	for (i = 0; i < this.edits.length; i++) {
		str += this.edits[i].toString();
	}
	return str;
}
function Undo_init() {
	if (this.owner.config_var.auto_focus) {
		try {
			this.owner.cw.focus();
			var first_leaf = this.owner.edit.body;
			while (true) {
				var tmp = first_leaf.firstChild;
				while (tmp && (tmp.nodeType == 1 && tmp.nodeName == "BR" || tmp.nodeType == 3 && String_trim(tmp.nodeValue) == "")) {
					tmp = tmp.nextSibling;
				}
				if (tmp) {
					first_leaf = tmp;
				} else {
					break;
				}
			}
			if (is.mozilla) {
				var sel = this.owner.cw.getSelection();
				sel.removeAllRanges();
				sel.collapse(first_leaf, 0)
			} else {
				var tr = this.owner.edit.selection.createRange();
				if (first_leaf.nodeType != 1) {
					first_leaf = first_leaf.parentNode;
				}
				tr.moveToElementText(first_leaf);
				tr.collapse(true);
				tr.select();
			}
		}
		catch(e) {
			try {
				if (is.mozilla) {
					this.owner.cw.getSelection().collapse(this.owner.edit.body, 0);
				} else {
					var tr = this.owner.edit.selection.createRange();
					tr.moveToElementText(this.owner.edit.body);
					tr.collapse(true);
					tr.select();
				}
			}
			catch(e) {}
		}
		this.owner.displayChanged();
	}
	this.cursor = 0;
	this.edits[0] = new UndoItem(this, this.owner.edit.body.innerHTML);
}
function Undo_atStart() {
	if (this.cursor < 1) {
		return true;
	} else {
		return false;
	}
}
function Undo_atEnd() {
	if (this.cursor >= this.edits.length - 1) {
		return true;
	} else {
		return false;
	}
}
function Undo_addEdit(giveFocusBack) {
	giveFocusBack = giveFocusBack && 1;
	if (this.cursor >= this.edits.length) {
		this.cursor = this.edits.length - 1;
	}
	var text = this.owner.edit.body.innerHTML;
	var old_text = this.edits[this.cursor].text;
	if (is.ie) {
		old_text = old_text.replace(/<SPAN id=selection_marker><\/SPAN>/i, '');
	}
	if (old_text == text) {
		return;
	}
	if (this.cursor == this.limit - 1) {
		this.edits.splice(1, 1);
	} else {
		this.cursor++;
	}
	this.edits[this.cursor] = new UndoItem(this, text);
	giveFocusBack && this.owner.cw.focus();
}
function Undo_update() {
	try {
		this.edits[this.cursor].add();
	}
	catch(err) {}
}
function Undo_undo() {
	if (this.atStart()) return;
	if (!this.edits[this.cursor]) return;
	this.cursor--;
	this.owner.edit.body.innerHTML = this.edits[this.cursor].text;
	this.edits[this.cursor].undo();
	this.owner.cw.focus();
}
function Undo_redo() {
	if (this.atEnd()) return;
	if (!this.edits[this.cursor]) return;
	this.cursor++;
	this.owner.edit.body.innerHTML = this.edits[this.cursor].text;
	this.edits[this.cursor].redo();
	this.owner.cw.focus();
}
UndoItem.prototype.toString = UndoItem_toString;
UndoItem.prototype.add = UndoItem_add;
UndoItem.prototype.moveTo = UndoItem_moveTo;
UndoItem.prototype.undo = UndoItem_undo;
UndoItem.prototype.redo = UndoItem_redo;
UndoItem.prototype.getSelection = UndoItem_getSelection;
UndoItem.prototype.getBookmark = UndoItem_getBookmark;
UndoItem.prototype.getTrueSelection = UndoItem_getTrueSelection;
UndoItem.prototype.getNodeForPath = UndoItem_getNodeForPath;
UndoManager.prototype.toString = Undo_toString;
UndoManager.prototype.init = Undo_init;
UndoManager.prototype.atStart = Undo_atStart;
UndoManager.prototype.atEnd = Undo_atEnd;
UndoManager.prototype.addEdit = Undo_addEdit;
UndoManager.prototype.update = Undo_update;
UndoManager.prototype.undo = Undo_undo;
UndoManager.prototype.redo = Undo_redo;
function lang_translatepage(content, lang, wnd) {
	var regexp_repl = new RegExp("\\|\\|([^\\|\\|]*)\\|\\|", "gi");
	while ((arr = regexp_repl.exec(content)) != null) {
		if (translated = wnd.translate(arr[1], lang)) {
			var repl = new RegExp("\\|\\|" + arr[1] + "\\|\\|", "gi");
			if (typeof content.replace != 'function') {
				return content.toString();
			}
			try {
				content = content.replace(repl, translated);
			}
			catch(e) {}
		}
	}
	return content;
}
if (typeof window.ktmls == 'undefined') {
	window.ktmls = [];
}
var KtmlVersion = '4.1.0';
var KtmlDevelopment = false;
var KtmlAddVersionToScripts = false;
var HIDDEN_TAG_ID = "KTML_HIDDEN_TAG_GLYPH_ID";
var HIDDEN_TAGS_RE = new RegExp("<img[^>]*id=['\"]?" + HIDDEN_TAG_ID + "['\"]?", "i");
var ANCHOR_GLYPH_HTML = '';
$HDR_ATTRNAME_TYPE = 'hdr_type';
$HDR_ATTRNAME_SUBTYPE = 'hdr_stype';
$HDR_MAINCLASSNAME = 'HTMLDropdown';
$HDR_DEFAULT_WIDTH = 100;
$HDR_DEFAULT_HEIGHT = 150;
$HDR_DEFAULT_LINEHEIGHT = 20;
$HDR_GLOBALOBJECT = "HTMLDropDowns";
if (typeof window[$HDR_GLOBALOBJECT] == "undefined") {
	window[$HDR_GLOBALOBJECT] = {
		'objects': [],
		'addedwindowevent': 0
	}
}
TEXT_NODE = 3;
COMMENT_NODE = 8;
var KT_clean_functions = {
	none: null,
	word: util_cleanHTMLContent,
	css: util_cleanCSSStyles,
	classes: util_cleanCSSClasses,
	script: util_cleanScriptTags,
	fonts: util_cleanFontTags,
	formatting: util_cleanFormattingTags,
	all: util_cleanAllTags
};
var KtmlHelpMap = {
	PI_link: 'hyperlink_properties',
	PI_anchor: 'hyperlink_properties',
	PI_hr: 'horizontal_rules',
	PI_image: 'set_image_properties',
	PI_list: 'list_item_properties',
	PI_ord: 'numbered_list_properties',
	PI_table: 'setting_table_properties',
	PI_cell: 'setting_cell_properties',
	PI_row: 'setting_row_properties',
	PI_unord: 'bulleted_list_properties'
};
var KtmlCommands = {
	'bold': ['bold', 'Bold'],
	'italic': ['italic', 'Italic'],
	'underline': ['underline', 'Underline'],
	'superscript': ['superscript', 'Superscript'],
	'subscript': ['subscript', 'Subscript'],
	'copy': ['copy', 'Copy'],
	'cut': ['cut', 'Cut'],
	'paste': ['paste', 'Paste'],
	'backcolor': ['hilitecolor', 'backcolor'],
	'forecolor': ['forecolor', 'ForeColor'],
	'fontname': ['fontname', 'FontName'],
	'fontsize': ['fontsize', 'FontSize'],
	'indent': ['indent', 'Indent'],
	'outdent': ['outdent', 'Outdent'],
	'undo': ['undo', 'Undo'],
	'redo': ['redo', 'Redo'],
	'orderlist': ['insertorderedlist', 'InsertOrderedList'],
	'unorderlist': ['insertunorderedlist', 'InsertUnorderedList'],
	'hyperlink': ['createlink', 'CreateLink'],
	'unlink': ['unlink', 'Unlink'],
	'insert_anchor': ['createanchor', 'CreateBookmark'],
	'unanchor': ['unBookmark', 'UnBookmark'],
	'insertimage': ['insertimage', 'InsertImage'],
	'justifycenter': ['justifycenter', 'JustifyCenter'],
	'justifyleft': ['justifyleft', 'JustifyLeft'],
	'justifyright': ['justifyright', 'JustifyRight'],
	'justifyfull': ['justifyfull', 'JustifyFull'],
	'removeformat': ['removeformat', 'RemoveFormat'],
	'blockfmt': ['formatblock', 'FormatBlock'],
	'selectall': ['selectall', 'SelectAll'],
	'delete': ['delete', 'Delete']
};
function KtmlGetCommand(command) {
	var idx = is.ie ? 1 : 0;
	return KtmlCommands[command][idx];
}
if (typeof KtmlLangRes == 'undefined') {
	KtmlLangRes = {};
}
function langAddResources(lang, what) {
	if (typeof(KtmlLangRes[lang]) == "undefined") {
		KtmlLangRes[lang] = [];
	}
	for (var res in what) {
		KtmlLangRes[lang][res.toLowerCase()] = utility.string.getInnerText(what[res]);
	}
}
function translate(what, from) {
	var ret = "";
	if (typeof from == "undefined") {
		from = "english";
	}
	if (typeof(KtmlLangRes[from]) == "undefined") {
		ret = what;
	}
	if (ret == "" && typeof(KtmlLangRes[from][what.toLowerCase()]) == "undefined") {
		ret = what;
	}
	if (ret == "") {
		ret = KtmlLangRes[from][what.toLowerCase()];
	}
	return ret;
}
if (typeof KtmlIncludeJsCache == 'undefined') {
	KtmlIncludeJsCache = {};
}
function KtmlIncludeJs(src, callback, doc) {
	if (typeof doc == "undefined") {
		doc = document;
	}
	if (typeof KtmlIncludeJsCache[src] != 'undefined') {
		if (KtmlIncludeJsCache[src].ready) {
			if (typeof callback == 'function') {
				callback(src);
			}
		} else {
			KtmlIncludeJsCache[src].deferred.push(callback);
			return;
		}
	} else {
		KtmlIncludeJsCache[src] = {
			'source': src,
			'ready': false,
			'deferred': []
		};
		var src_postfix = '';
		if (KtmlAddVersionToScripts) {
			if (src.indexOf('?') >= 0) {
				src_postfix += '&version=' + KtmlVersion;
			} else {
				src_postfix += '?version=' + KtmlVersion;
			}
		}
		if (KtmlDevelopment) {
			if (src.indexOf('?') >= 0 || src_postfix.indexOf('?') >= 0) {
				src_postfix += '&rand=' + Math.random();
			} else {
				src_postfix += '?rand=' + Math.random();
			}
		}
		var scriptElement = doc.createElement('script');
		if (is.mozilla) {
			scriptElement.readyState = 'loaded';
			utility.dom.attachEvent(scriptElement, 'onload', function () {
				KtmlIncludeJsCache[src].ready = true;
				if (typeof callback == 'function') {
					callback(src);
				}
				if (KtmlIncludeJsCache[src].deferred.length) {
					for (var __i = 0; __i < KtmlIncludeJsCache[src].deferred.length; __i++) {
						KtmlIncludeJsCache[src].deferred[__i](src);
					}
				}
			});
		} else {
			utility.dom.attachEvent(scriptElement, 'onreadystatechange', function () {
				if (scriptElement.readyState == 'loaded' || scriptElement.readyState == 'complete') {
					KtmlIncludeJsCache[src].ready = true;
					if (typeof callback == 'function') {
						callback(src);
					}
					if (KtmlIncludeJsCache[src].deferred.length) {
						for (var __i = 0; __i < KtmlIncludeJsCache[src].deferred.length; __i++) {
							KtmlIncludeJsCache[src].deferred[__i](src);
						}
					}
				}
			});
		}
		scriptElement.type = 'text/javascript';
		scriptElement.src = src + src_postfix;
		var headElement = doc.getElementsByTagName('head')[0];
		headElement.appendChild(scriptElement);
	}
};
var Serializer = function (name, path) {
	this.name = name;
	this.path = path;
	this.props = {};
};
Serializer.prototype = {
	load: function() {
		var old_cookie_str = utility.cookie.del(this.name.replace(/_\d+$/, '') + "_cookie");
		var cookie_str = utility.cookie.get(this.name.replace(/_\d+$/, '') + "_503cookie");
		if (!cookie_str) {
			this.props = {};
		} {
			this.props = eval('(' + cookie_str + ')');
		}
	},
	save: function() {
		// set it to expire in 10 min.
		utility.cookie.set(this.name.replace(/_\d+$/, '') + "_503cookie", this.stringify(this.props), 0.007, null, '');
	},
	stringify: function (arg) {
		var c, i, l, s = '',	v;
		switch (typeof arg) {
		case 'object':
			if (arg) {
				if (typeof arg.push == 'function') {
					for (i = 0; i < arg.length; ++i) {
						v = this.stringify(arg[i]);
						if (s) {
							s += ',';
						}
						s += v;
					}
					return '[' + s + ']';
				} else if (typeof arg.toString != 'undefined') {
					for (i in arg) {
						v = arg[i];
						if (typeof v != 'undefined' && typeof v != 'function') {
							v = this.stringify(v);
							if (s) {
								s += ',';
							}
							s += this.stringify(i) + ':' + v;
						}
					}
					return '{' + s + '}';
				}
			}
			return 'null';
		case 'number':
			return isFinite(arg) ? String(arg) : 'null';
		case 'string':
			l = arg.length;
			s = '"';
			for (i = 0; i < l; i += 1) {
				c = arg.charAt(i);
				if (c >= ' ') {
					if (c == '\\' || c == '"') {
						s += '\\';
					}
					s += c;
				} else {
					switch (c) {
					case '\b':
						s += '\\b';
						break;
					case '\f':
						s += '\\f';
						break;
					case '\n':
						s += '\\n';
						break;
					case '\r':
						s += '\\r';
						break;
					case '\t':
						s += '\\t';
						break;
					default:
						c = c.charCodeAt();
						s += '\\u00' + Math.floor(c / 16).toString(16) + (c % 16).toString(16);
					}
				}
			}
			return s + '"';
		case 'boolean':
			return String(arg);
		default:
			return 'null';
		}
	},
	get: function (domain_name, prop_name) {
		if (!this.props) {
			this.props = {};
		}
		if (this.props[domain_name]) {
			if (this.props[domain_name][prop_name]) {
				return this.props[domain_name][prop_name];
			}
		}
		return null;
	},
	set: function (domain_name, prop_name, prop_value) {
		if (!this.props[domain_name]) {
			this.props[domain_name] = {};
		}
		if (!this.props[domain_name][prop_name]) {
			this.props[domain_name][prop_name] = null;
		}
		this.props[domain_name][prop_name] = prop_value;
	}
}
function _gel(id, doc) {
	return (doc ? doc : document).getElementById(id);
}
function util_function_copy(func_ref) {
	var func_body = func_ref.toString();
	var args_string = func_body.substring(func_body.indexOf("(") + 1, func_body.indexOf(")"));
	args_string = args_string.replace(/\s*/gi, '');
	args_string = '"' + args_string.replace(/,/gi, '","') + '"';
	func_body = func_body.substring(func_body.indexOf('{') + 1, func_body.lastIndexOf('}'));
	func_body = func_body.replace(/"/gi, '\"');
	return eval('new Function(' + args_string + ',func_body)');
};
function util_defaultValue(vn, dv) {
	if (typeof vn == 'undefined') {
		return dv;
	} else {
		return vn;
	}
}
function util_cleanBrowserCSS(tmp) {
	var r1 = new RegExp('(mso\-)+[^;"]*[; ]*', "gi");
	tmp = tmp.replace(r1, '; ');
	r1 = new RegExp('(\-moz\-)+[^;"]*[; ]*', "gi");
	tmp = tmp.replace(r1, '; ');
	r1 = new RegExp("( )+", "gi");
	tmp = tmp.replace(r1, ' ');
	tmp = tmp.replace(r1, ' ');
	return tmp;
}
function util_cleanHTMLContent(tmp) {
	tmp = tmp.replace(/<!--(\w|\W)+?-->*/gi, '');
	tmp = tmp.replace(/<title>(\w|\W)+?<\/title>*/gi, '');
	tmp = tmp.replace(/<(\/?)(body|o:|div|link|head|html|xml|meta|style)[^>]*>/gi, "");
	var r1 = new RegExp("<(\\?)+xml:.*(\\?)+>", "gi");
	tmp = tmp.replace(r1, "");
	var r1 = new RegExp("<(\\?xml:).*(\\?)*\/>", "gi");
	tmp = tmp.replace(r1, "");
	tmp = tmp.replace(/<TT([^>]*)>/ig, "<div $1>");
	tmp = tmp.replace(/<\/TT>/ig, "</div>");
	tmp = tmp.replace(/<TT([^>]*)>/ig, "<p $1>");
	tmp = tmp.replace(/<\/TT>/ig, "</p>");
	// remove title tag
	tmp = tmp.replace(/<title>(\w|\W)+?<\/title>*/gi, '');
	// remove all comments
	tmp = tmp.replace(/<!--(\w|\W)+?-->*/gi, '');
	// remove comments inserted by word
	tmp = tmp.replace(/<!--(\[)+if gte(\w|\W)+?-->*/gi, '');
	//tmp=tmp.replace(/<\/?font[^>]*>/ig,"");
	//tmp=tmp.replace(/<\/?span[^>]*>/ig,"");
	// remove classes with names like Mso
	tmp = tmp.replace(/\sclass=[\"]*(Mso)[\w]*[\"]*/ig, '');
	r1 = new RegExp('(style=\"[^\"]*)\s*[\w]*\s*(mso)[\w]+(\-)[\w]+[;]*[\"]*', "gi");
	tmp = tmp.replace(r1, '$1$2');
	tmp = tmp.replace(/\sstyle=[\"]*[\w]*\s*(mso)[\w]+(\-)[\w]+[;]*[\"]*/ig, '');
	// move text-align rule in style attribute to align attribute
	r1 = new RegExp("(style=\"[^\"]*)TEXT-ALIGN:\\s?([a-z]*)([^\"]*\")", "gi");
	tmp = tmp.replace(r1, "align=$2 $1$3");
	// move background rule in style attribute to background-color style rule
	r1 = new RegExp("(style=\"[^\"]*)BACKGROUND:\\s?([a-z0-9#]*)([^;]*;)", "gi");
	tmp = tmp.replace(r1, '$1background-color: $2; ');
	r1 = new RegExp("(style=\"[^\"]*)width:\\s?([a-z0-9]*)([^\"]*\")", "gi");
	tmp = tmp.replace(r1, ' width="$2" $1$3');
	r1 = new RegExp("(style=\"[^\"]*)height:\\s?([a-z0-9]*)([^\"]*\")", "gi");
	tmp = tmp.replace(r1, ' height="$2" $1$3');
	r1 = new RegExp("\\s(?:lang|style|class)\\s*=\\s*\"[^\"]*\"", "gi");
	tmp = tmp.replace(r1, ' ');
	r1 = new RegExp("\\s(?:lang|style|class)\\s*=\\s*'[^']*'", "gi");
	tmp = tmp.replace(r1, ' ');
	r1 = new RegExp("\\s(?:lang|style|class)\\s*=\\s*[^\\s>]*", "gi");
	tmp = tmp.replace(r1, ' ');
	tmp = tmp.replace(/(<\/?)dir>/ig, "$1blockquote>");
	tmp = tmp.replace(/(<td[^>]*>)\s*<p>([^<>]*)<\/p>\s*<\/td>/ig, "$1$2</td>");
	var replacements = [133, '&#133;', 8226, '&#8243;', 8221, '"', 8216, "'", 8217, "'", 145, '&#039;', 146, '&#039;', 147, '&#034;', 148, '&#034;', 8220, '&#034;', 8226, '&#149;', 149, '&#149;', 8211, '&#150;', 150, '&#150;', 8212, '&#151;', 151, '&#151;', 8482, '&#153;', 153, '&#153;', 169, '&copy;', 174, '&reg;']
	for (var i = 0; i < replacements.length; i = i + 2) {
		rgx = new RegExp(String.fromCharCode(replacements[i]), "gi");
		tmp = tmp.replace(rgx, replacements[i + 1]);
	}
	tmp = tmp.replace(/<\/?place[^>]*>/ig, "");
	tmp = tmp.replace(/<\/?city[^>]*>/ig, "");
	tmp = tmp.replace(/<\/?state[^>]*>/ig, "");
	tmp = tmp.replace(/<\/?country[^>]*>/ig, "");
	// remove empty style attributes
	r1 = new RegExp("\\s*(style=\"[^\"]*)[;|:]*\\s?([^\"]*\")", "gi");
	tmp = tmp.replace(r1, '');
	tmp = tmp.replace(/\n+/gi, '\n');
	tmp = tmp.replace(/^\n+/gi, '');
	tmp = tmp.replace(/\n+/gi, '\n');
	tmp = tmp.replace(/^\n+/gi, '');
	return tmp;
}
/*
 this is a more aggressive version of util_cleanHTMLContent. in addition to what util_cleanHTMLContent is doing,
 this function also removes any style,script tags from the pasted text. also replaces \n (line feeds)
*/
function util_cleanHTMLContentCustom(tmp) {
	tmp = tmp.replace(/<(\/?)(body|o:|div|link|head|html|xml|meta|style|script)[^>]*>/gi, "");
	var r1 = new RegExp("<(\\?xml:).*(\\?)*\/>", "gi");
	tmp = tmp.replace(r1, "");
	tmp = tmp.replace(/<TT([^>]*)>/ig, "<p $1>");
	tmp = tmp.replace(/<\/TT>/ig, "</p>");
	// remove style tags [not attributes]
	tmp = tmp.replace(/<style>(\w|\W)+?<\/style>*/gi, '');
	//tmp=tmp.replace(/<!--(\[)+if gte(\w|\W)+?-->*/gi,'');
	// remove all comments
	tmp = tmp.replace(/<!--(\w|\W)+?-->*/gi, '');
	// remove classes with names like Mso
	tmp = tmp.replace(/\sclass=[\"]*(Mso)[\w]*[\"]*/ig, '');
	r1 = new RegExp('(style=\"[^\"]*)\s*[\w]*\s*(mso)[\w]+(\-)[\w]+[;]*[\"]*', "gi");
	tmp = tmp.replace(r1, '$1$2');
	tmp = tmp.replace(/\sstyle=[\"]*[\w]*\s*(mso)[\w]+(\-)[\w]+[;]*[\"]*/ig, '');
	// word07 is not double-quoting the attributes. replace double quotes inside attribute to single quotes
	tmp = tmp.replace(/&quot;/gi, "'");
	// move text-align rule in style attribute to align attribute
	r1 = new RegExp("(style=\"[^\"]*)TEXT-ALIGN:\\s?([a-z]*)([^\"]*\")", "gi");
	tmp = tmp.replace(r1, "align=$2 $1$3");
	// move background rule in style attribute to background-color style rule
	r1 = new RegExp("(style=\"[^\"]*)BACKGROUND:\\s?([a-z0-9#]*)([^;]*;)", "gi");
	tmp = tmp.replace(r1, '$1background-color: $2; ');
	// move width rule in style attribute to width attribute	
	//r1=new RegExp("(style=\"[^\"]*)\\s+width:\\s?([a-z0-9]*)([^\"]*\")","gi");  
	//tmp=tmp.replace(r1,' width="$2" $1$3');
	// move height rule in style attribute to height attribute	
	//r1=new RegExp("(style=\"[^\"]*)\\s+height:\\s?([a-z0-9]*)([^\"]*\")","gi");
	//tmp=tmp.replace(r1,' height="$2" $1$3');
	r1 = new RegExp("\\s(?:lang)\\s*=\\s*\"[^\"]*\"", "gi");
	tmp = tmp.replace(r1, ' ');
	r1 = new RegExp("\\s(?:lang)\\s*=\\s*'[^']*'", "gi");
	tmp = tmp.replace(r1, ' ');
	r1 = new RegExp("\\s(?:lang)\\s*=\\s*[^\\s>]*", "gi");
	tmp = tmp.replace(r1, ' ');
	// replace dir with blockquote
	tmp = tmp.replace(/(<\/?)dir>/ig, "$1blockquote>");
	var replacements = [133, '&#133;', 8226, '&#8243;', 8221, '"', 8216, "'", 8217, "'", 145, '&#039;', 146, '&#039;', 147, '&#034;', 148, '&#034;', 8220, '&#034;', 8226, '&#149;', 149, '&#149;', 8211, '&#150;', 150, '&#150;', 8212, '&#151;', 151, '&#151;', 8482, '&#153;', 153, '&#153;', 169, '&copy;', 174, '&reg;']
	for (var i = 0; i < replacements.length; i = i + 2) {
		rgx = new RegExp(String.fromCharCode(replacements[i]), "gi");
		tmp = tmp.replace(rgx, replacements[i + 1]);
	}
	tmp = tmp.replace(/<\/?place[^>]*>/ig, "");
	tmp = tmp.replace(/<\/?city[^>]*>/ig, "");
	tmp = tmp.replace(/<\/?state[^>]*>/ig, "");
	tmp = tmp.replace(/<\/?country[^>]*>/ig, "");
	tmp = tmp.replace(/<[pP]\s*>&nbsp;<\/[pP]>/gi, "");
	// remove empty paragraph tags
	r1 = new RegExp("(<[^>]+>)+&nbsp;(</\w+>)+", "gi");
	tmp = tmp.replace(r1, '');
	// remove v: element attached to <img> tag
	r1 = new RegExp('\\s+v:[\w|\W]+=[\"]*[^\"]+[\"]*', 'gi');
	tmp = tmp.replace(r1, '');
	// remove empty style attributes
	r1 = new RegExp("\\s*style=\"\\s*(;)*\\s*(\")", "gi");
	tmp = tmp.replace(r1, '');
	tmp = util_cleanBrowserCSS(tmp);
	tmp = tmp.replace(/\n+/gi, '\n');
	tmp = tmp.replace(/^\n+/gi, '');
	tmp = tmp.replace(/\n+/gi, '\n');
	tmp = tmp.replace(/^\n+/gi, '');
	return tmp;
}
function util_cleanCSSStyles(tmp) {
	//tmp=tmp.replace(/\sstyle\s*=\s*['"]?[^'">]*['"]?/ig," ");
	tmp = tmp.replace(/\sstyle\s*=\s*"[^"]*"/ig, " ");
	tmp = tmp.replace(/\sstyle\s*=\s*'[^']*'/ig, " ");
	tmp = tmp.replace(/\sstyle\s*=\s*[^\s>]+/ig, " ");
	tmp = util_cleanCSSClasses(tmp);
	return tmp;
};
function util_cleanCSSClasses(tmp) {
	re_class_single = /(<[^\s>]*)([^>]*)(\sclass='[^']*')([^>]*>)/gi;
	re_class_double = /(<[^\s>]*)([^>]*)(\sclass="[^"]*")([^>]*>)/gi;
	re_class = /(<[^\s>]*)([^>]*)(\sclass=[^\s>]*)([^>]*>)/gi;
	tmp = tmp.replace(re_class_single, '$1$2$4');
	tmp = tmp.replace(re_class_double, '$1$2$4');
	tmp = tmp.replace(re_class, '$1$2$4');
	return tmp;
};
function util_cleanScriptTags(tmp) {
	var doc = tmp;
	var openScriptRE = /&lt;script[^&]*&gt;/i;
	var closeTag = '\/&gt;';
	var closeScriptTag = '&lt;\/script&gt;';
	while (openScriptRE.test(doc)) {
		matchAry = doc.match(openScriptRE);
		matchStr = matchAry[0];
		startIdx = matchAry.index;
		endIdx = startIdx + matchStr.length;
		if (matchStr.indexOf(closeTag) == -1) {
			closeIdx = doc.toLowerCase().indexOf(closeScriptTag, endIdx);
			if (closeIdx != -1) endIdx = closeIdx + closeScriptTag.length;
		}
		var newDoc = '';
		if (startIdx != 0) newDoc = doc.substring(0, startIdx);
		if (endIdx + 1 != doc.length) newDoc += doc.substring(endIdx);
		doc = newDoc;
	}
	return doc;
};
function util_cleanFontTags(tmp) {
	re_font_open = /<font[^>]*>/gi;
	re_font_close = /<\/font>/gi;
	tmp = tmp.replace(re_font_open, '');
	tmp = tmp.replace(re_font_close, '');
	return tmp;
};
function util_cleanFormattingTags(tmp) {
	tmp = tmp.replace(/<(H[0-9]+)\s?([^>]*)>/ig, "<p>");
	var r1 = new RegExp("<\\/(?:H[0-9]+)>", "gi");
	tmp = tmp.replace(r1, "</p>");
	var r1 = /<\/?(?:b|strong|i|u|em|font)(?=\s|\/|>)[^>]*>/gi;
	tmp = tmp.replace(r1, "");
	//tmp=tmp.replace(/<([^>]*)style="[^"]*"([^>]*)>/ig,"<$1$2>");
	//tmp=tmp.replace(/<([^>]*)class="[^"]*"([^>]*)>/ig,"<$1$2>");
	var re_open = re_close = build = null;
	var removeTags = new Array('ACRONYM', 'B', 'BDO', 'BIG', 'BLINK', 'DFN', 'EM', 'FONT', 'I', 'INS', 'KBD', 'NOBR', 'Q', 'SAMP', 'SMALL', 'STIKE', 'STRONG', 'SUB', 'SUP', 'IT', 'U', 'VAR', 'ADDRESS', 'PRE');
	for (var i = 0; i < removeTags.length; i++) {
		build = "<" + removeTags[i] + "[^>]*>";
		re_open = new RegExp(build, "gi");
		tmp = tmp.replace(re_open, '');
		build = "<\/" + removeTags[i] + ">";
		re_close = new RegExp(build, "gi");
		tmp = tmp.replace(re_close, '');
	}
	// handle "s" (strike) take differently. otherwise, we are removing span tags too with this
	re_open = new RegExp("<s>", "gi");
	tmp = tmp.replace(re_open, '');
	re_close = new RegExp("<\/s>", "gi");
	tmp = tmp.replace(re_close, '');
	return tmp;
};
function util_cleanAllTags(tmp) {
	tmp = tmp.replace(/<(\/?)([a-z:0-9]+)[^>]*>/gi, "<$1$2>");
	// commented this line to fix issue 5670
	//tmp=tmp.replace(/>[\s\r\n]*</gi,'><');
	var prev_tag = '';
	tmp = tmp.replace(/<(\/?)([a-z:0-9]+)>/gi, function (a, slash, tag) {
		var ret = '';
		tag = tag.toLowerCase();
		if (/^span|div|p|td|th|li|addr|pre|h[1-6]$/i.test(tag)) {
			if (slash == '' && prev_tag != '' && tag != prev_tag) {
				if (prev_tag == 'p') {
					if (tag == 'li') ret += ' ';
				} else {
					ret += '</' + prev_tag + '>';
					ret += '<' + slash + 'p>';
				}
			}
			prev_tag = 'p';
			return ret;
		} else {
			return '';
		}
	});
	while (/<(\/?)p><\p>/i.test(tmp)) {
		tmp = tmp.replace(/<(\/?)p><\p>/i, "<$1p>");
		tmp = tmp.replace(/<p><\/p>/gi, "");
	}
	return tmp || '';
};
var KtmlScripts = {
	'base': [],
	'modules': []
};
var KtmlModuleList = {
	'contextmenu': ['main', 'browser'],
	'glyphhandler': ['main', 'browser'],
	'introspection': ['main', 'browser'],
	'css': ['main', 'browser'],
	'filebrowser': ['main'],
	'expire': ['main'],
	'xhtml': ['main', 'browser'],
	'spellchecker': ['main']
};
var KtmlLoadedModuleList = [];
function KtmlLoadModules() {
	if (!window.KtmlWindowLoaded) {
		return;
	}
	for (var i = 0; i < window.ktmls.length; i++) {
		if (!window.ktmls[i].shouldLoadModules) {
			if (is.ie) {
				return;
			}
		}
	}
	if (typeof KtmlUserModuleList != 'undefined') {
		KtmlModuleList = Object_weave(KtmlModuleList, KtmlUserModuleList);
	}
	var scripts = {};
	var loadedScripts = {};
	var postfix = (is.ie) ? '_ie' : '_mozilla';
	for (var mod in KtmlModuleList) {
		Ktml_object.config_var['KTMLToolBarList'] += ',' + mod;
		var desc = KtmlModuleList[mod];
		scripts[mod] = [];
		loadedScripts[mod] = 0;
		if (Array_indexOf(desc, 'main') >= 0) Array_push(scripts[mod], KtmlDirDepth + 'modules/' + mod + '/scripts.js');
		if (Array_indexOf(desc, 'browser') >= 0) Array_push(scripts[mod], KtmlDirDepth + 'modules/' + mod + '/scripts' + postfix + '.js');
	}
	for (var mod in scripts) {
		var tmp = scripts[mod];
		for (var i = 0; i < tmp.length; i++) {
			KtmlIncludeJs(tmp[i], function (src) {
				Array_push(KtmlScripts['modules'], src.replace(/\?.*$/, ''));
				var moduleName = src.replace(/^.*\/modules\/([^\/]+)\/.*$/, '$1');
				if (scripts[moduleName].length > loadedScripts[moduleName]) {
					loadedScripts[moduleName]++;
				}
				if (scripts[moduleName].length == loadedScripts[moduleName]) {
					KtmlAddModule(moduleName);
				}
			});
		}
	}
}
function KtmlAddModule(mod) {
	if (typeof window[mod + '_runonce'] == 'function') {
		window[mod + '_runonce']();
	}
	if (typeof window[mod + '_runeach'] == 'function') {
		Array_each(window.ktmls, function (iter) {
			if (!iter.shouldLoadModules) {
				return;
			}
			if (typeof iter[mod + '_runeach_done'] != "undefined") {
				return;
			}
			window[mod + '_runeach'](iter);
			iter[mod + '_runeach_done'] = true;
		});
	}
}
ktml_attachToFormElement = function (name) {
	if (typeof window['ktml_' + name] != "undefined") {
		return;
	}
	window['ktml_' + name] = new ktml(name);
}
function ktml(name) {
	if (is.mozilla) {
		glblArray = getglblRTElementsRef();
		if (glblArray != 'undefined') {
			var thisInd = getThisRTERef(name, glblArray);
			if (thisInd > 0) {
				var otherKTMLLoaded = getRTEStatus(glblArray, thisInd - 1);
				if (otherKTMLLoaded == 'false') {
					pause(100);
				}
			}
		}
	}
	if (is.safari) {
		is.valid = false;
	}
	try {
		if (typeof utility.dom.getBorderBox == "undefined") {
			is.valid = false;
			alert("KTML version " + KtmlVersion + " requires at least MX Kollection 3.6.1!\r\nRequired function [utility.dom.getBorderBox] not found in utility.js");
		}
	} catch(err) {};
	Ktml_object = this;
	this.name = name;
	this.formElement = document.getElementById(name);
	if (!this.formElement) {
		alert('The element KTML4 is bound to was not found.' + "\r\n" + 'The element having ID "' + name + '" was not found in page.');
		return;
	}
	this.checkDocMode();
	if (typeof(getHtmlEditorText) == "undefined" && typeof(window[this.name + '_config']) == "undefined" && this.name.match(/_[0-9]*$/)) {
		this.config_var = window[this.name.replace(/_[0-9]*$/, '') + '_config'];
	} else {
		this.config_var = window[this.name + '_config'];
	}
	this.width = this.config_var.width;
	if (isNaN(this.width)) {
		this.width = parseInt(this.formElement.style.width);
	}
	if (isNaN(this.width)) {
		this.width = 600;
	}
	this.height = this.config_var.height;
	if (isNaN(this.height)) {
		this.height = parseInt(this.formElement.style.height);
	}
	if (isNaN(this.height)) {
		this.height = 400;
	}
	this.hooks = {
		'onkeyup': [],
		'onkeypress': [],
		'onmouseover': [],
		'onmouseup': [],
		'onunload': [],
		'ontogglerich2code': [],
		'ontogglecode2rich': [],
		'onloadtext': [],
		'onsavetext': [],
		'onupdatebuttonstate': [],
		'ondomselect': [],
		'onsetdisplaymode': [],
		'onsetdisplaymode_beforeinvisible': [],
		'onpaste_word': [],
		'onpaste': []
	};
	if (!is.valid) {
		this.paint();
		return;
	}
	this.readyForSave = true;
	this.setGlobals();
	this.logger = new KTMLLogger(this.counter);
	if (this.formElement.form) {
		var ktml_counters = this.formElement.form.getAttribute("ktml_counters") || '';
		ktml_counters += (ktml_counters ? "," : "") + this.counter;
		this.formElement.form.setAttribute("ktml_counters", ktml_counters);
	}
	var _tmpArr1 = this.config_var.buttons;
	var _tmpArr2 = [];
	var _delta = 0;
	var _tmpCounter = 0;
	Array_each(_tmpArr1, function (tlbGroup) {
		if (tlbGroup) {
			if (tlbGroup[0] > _tmpCounter) {
				if (tlbGroup[0] - _tmpCounter != _delta) {
					_tmpCounter++;
					_delta = (tlbGroup[0] - _tmpCounter);
				};
			};
			tlbGroup[0] = _tmpCounter;
			_tmpArr2.push(tlbGroup);
		}
	});
	this.config_var.buttons = _tmpArr2;
	try {
		this.formElement.style.display = "none";
	} catch(e) {};
	this.flags = {};
	this.active = false;
	this.customButtons = [];
	this.visible = ktml_isElementVisible(this.counter);
	this.fullScreenState = false;
	this.tagReplacementRules = {};
	var denied_tags_list = util_defaultValue($KTML4_GLOBALS['denied_tags_list'], '');
	var allowed_tags_list = util_defaultValue($KTML4_GLOBALS['allowed_tags_list'], '');
	if (denied_tags_list.length > 0 && allowed_tags_list.length > 0) {} else {
		if (denied_tags_list != '') {
			denied_tags_list = denied_tags_list.split(",");
			for (var i = 0; i < denied_tags_list.length; i++) {
				this.addTagReplacementRule("strip" + denied_tags_list[i], denied_tags_list[i], "striptag");
			}
		}
		if (allowed_tags_list != '') {
			this.allowed_tags_list = allowed_tags_list.split(",");
		} else {
			this.allowed_tags_list = null;
		}
	}
	this.addTagReplacementRule("stripnoscript", "noscript", "striptagandcontent");
	var logical_emphasis = util_defaultValue($KTML4_GLOBALS['logical_emphasis'], 'true');
	if (logical_emphasis == 'true') {
		this.addTagReplacementRule("b2strong", "b", "strong");
		this.addTagReplacementRule("i2em", "i", "em");
	}
	this.charset = is.ie ? document.charset : document.characterSet;
	if (is.mozilla) {
		this.loadCompatLayer();
	} else {
		this.ui = {
			showToolbar: "manual",
			showPI: true,
			toolbar: false,
			pi: false
		};
		this.ui.showToolbar = this.config_var['show_toolbar'];
		this.ui.showPI = !!this.config_var['show_pi'];
		this.ui.toolbar = this.ui.showToolbar == "load";
		this.ui.pi = this.ui.showPI;
		if (typeof KT_Messages == "undefined") {
			if (KtmlDevelopment) {
				alert("Developer Error\r\n\r\n\t\tKT_Messages is undefined.\r\n\r\nMost probably ktml.js resource file is not found in includes/resources/.");
				KT_Messages = {};
			}
		}
		langAddResources(KtmlGlobalLanguage, KT_Messages);
		this.paint();
	}
};
ktml.prototype.loadCompatLayer = function () {
	var idx = this.counter;
	var src = window.KtmlRoot + 'core/mozilla_ie_compat.js';
	KtmlIncludeJs(src, function () {
		ktml_delayed_loader(idx);
	});
	//changeglblSetting(idx);
};
function ktml_isElementVisible(idx) {
	var el = ktmls[idx].formElement.parentNode;
	var display = "",	visibility = "";
	var isVisible = true;
	while (el) {
		display = utility.dom.getStyleProperty(el, "display");
		if (display == "none") {
			isVisible = false;
			break;
		}
		visibility = utility.dom.getStyleProperty(el, "visibility");
		if (visibility == "hidden") {
			isVisible = false;
			break;
		}
		el = el.parentNode;
		if (el) {
			if (el.nodeType == 3) {
				el = el.parentNode;
			} else if (el.nodeName == "BODY") {
				break;
			}
		}
	}
	ktmls[idx].visible = isVisible;
	return isVisible;
};
function ktml_delayed_loader(idx) {
	if (typeof($NXT_FORM_SETTINGS) != "undefined" && (typeof($style_executed) == "undefined" || typeof($style_executed) != "undefined" && $style_executed == false) || !ktml_isElementVisible(idx)) {
		window.setTimeout(function () {
			ktml_delayed_loader(idx);
		}, 300);
		return;
	}
	ktml_mozilla_attach_properties(idx);
};
function ktml_mozilla_attach_properties(idx) {
	var _this = ktmls[idx];
	_this.ui = {
		showToolbar: "manual",
		showPI: true,
		toolbar: false,
		pi: false
	};
	_this.ui.showToolbar = _this.config_var['show_toolbar'];
	_this.ui.showPI = !!_this.config_var['show_pi'];
	_this.ui.toolbar = _this.ui.showToolbar == "load";
	_this.ui.pi = _this.ui.showPI;
	langAddResources(KtmlGlobalLanguage, KT_Messages);
	_this.paint();
};
function KTML_formSubmittalHandler(e) {
	var o = utility.dom.setEventVars(e);
	if (ktml.submit_all(o.e)) {
		return true;
	}
	utility.dom.stopEvent(o.e);
	return false;
};
ktml.prototype.checkDocMode = function () {
	var skip_doctype_check = util_defaultValue($KTML4_GLOBALS['skip_doctype_check'], 'false');
	if (skip_doctype_check == 'false' && document.compatMode == 'BackCompat') {
		var quirksWarning = KT_Messages["quirks mode message"];
		alert(quirksWarning);
		is.valid = false;
		is.quirks_mode = true;
	}
};
function kt_dotnet_hook(eventTarget, args, callback) {
	var form = document.forms[0];
	fire_starter = form;
	function all_saved() {
		if (form) {
			var ktml_counters = util_defaultValue(form.getAttribute("ktml_counters"), '') + '';
			ktml_counters = ktml_counters.split(",");
			var to_save = ktml_counters.length;
			var saved = 0;
			var idx = 0;
			for (var i = 0; i < ktml_counters.length; i++) {
				if (ktmls[idx].displayMode == "CODE") {
					alert(translate("submit disabled in source view"));
					Page_BlockSubmit = true;
					return false;
				}
			}
			for (var i = 0; i < ktml_counters.length; i++) {
				idx = parseInt(ktml_counters[i], 10);
				if (ktmls[idx].readyForSave) {
					saved++;
					continue;
				}
				if (!ktml_isElementVisible(idx)) {
					saved++;
					ktmls[idx].readyForSave = true;
					continue;
				}
				ktmls[idx].save(all_saved);
			}
			if (saved == to_save) {
				callback.call(null, args);
			}
		} else {
			callback.call(null, args);
			return true;
		}
	}
	all_saved();
};
ktml.prototype.setGlobals = function () {
	Array_push(window.ktmls, this);
	if (typeof($KTML4_GLOBALS) == "undefined") {
		$KTML4_GLOBALS = {};
	}
	this.counter = ktmls.length - 1;
	this.displayMode = 'RICH';
	this.selectableNodes = new Array();
	this.dontLeaveMeFlag = false;
	this.config = [];
	if (typeof(getHtmlEditorText) == "undefined" && typeof(window[this.name + '_config']) == "undefined" && this.name.match(/_[0-9]*$/)) {
		this.id = window[this.name.replace(/_[0-9]*$/, '') + '_id'];
	} else {
		this.id = window[this.name + '_id'];
	}
	if (!window.ktmlGlobalsAreSet) {
		window.ktmlGlobalsAreSet = true;
		util_setGlobalLocationVars();
		window.focusedKTMLIndex = null;
		if (typeof(Page_BlockSubmit) == "undefined") {
			Page_BlockSubmit = false;
		}
		if (typeof(WebForm_DoPostBackWithOptions) == "function") {
			window.kt_WebForm_DoPostBackWithOption = util_function_copy(WebForm_DoPostBackWithOptions);
			WebForm_DoPostBackWithOptions = function (options) {
				kt_dotnet_hook(options.eventTarget, options, function (options) {
					kt_WebForm_DoPostBackWithOption(options);
				});
			}
		} else if (typeof(__doPostBack) == "function") {
			window.kt___doPostBack = util_function_copy(__doPostBack);
			__doPostBack = function () {
				kt_dotnet_hook(arguments[0], arguments, function () {
					kt___doPostBack(arguments[0][0], arguments[0][1]);
				});
			}
			GLOBAL_registerFormSubmitEventHandler('KTML_formSubmittalHandler', 2);
		} else {
			GLOBAL_registerFormSubmitEventHandler('KTML_formSubmittalHandler', 2);
		}
		utility.dom.attachEvent(is.ie ? document.body : window, 'onkeydown', utility.popup.escapeModal, 0);
		window.KTStorage = new ObjectStorage("ktml");
		utility.dom.attachEvent2(window.document.body, 'mousedown', utility.popup.removeModal);
		if (window.ktml_init_object['debugger_params'].length) {
			Logging.params.element = window.ktml_init_object['debugger_params'][1];
		}
		window.KtmlDirDepth = window.ktml_init_object['path'];
		window.KtmlRelativeImagePath = window.KtmlDirDepth + "core/img/";
		if (typeof(window.ktml_init_object['language']) != "undefined") {
			window.KtmlGlobalLanguage = window.ktml_init_object['language'];
		} else {
			window.KtmlGlobalLanguage = 'english';
		}
		var loca = window.location;
		if (KtmlDirDepth.indexOf('http') != 0) {
			var str = loca.href;
			str = str.split("?")[0];
			var index;
			str = str.substring(0, str.lastIndexOf("/") + 1);
			index = KtmlDirDepth.indexOf("./");
			if (index == 0) {
				window.KtmlRoot = str + KtmlDirDepth.substring(2);
			} else {
				index = KtmlDirDepth.indexOf("/");
				if (index == 0) {
					window.KtmlRoot = loca.protocol + '//' + loca.host + KtmlDirDepth;
				} else {
					window.KtmlRoot = str + KtmlDirDepth;
				}
			};
		} else {
			window.KtmlRoot = KtmlDirDepth;
		}
		if (loca.protocol == "https:" && !(/^https:\/\/[^\/:]*:/i.test(KtmlRoot))) {
			KtmlRoot = KtmlRoot.replace(/^https:\/\/([^\/]*)/i, "https://$1:443");
		}
		if (jsDlgLoader.length) {
			window.KtmlExtension = window.ktml_init_object['server'];
			window.KtmlAbsoluteServicePath = jsDlgLoader + "?pageid=" + jspageid + "&csModule=dhtmledit/ktml/includes/ktm/plugins/service/service";
		}
	} else {
		var frm = this.formElement.form;
		if (frm) {
			if (typeof frm.onsubmit != 'undefined' && frm.onsubmit != null) {
				var form_handlers = frm.form_handlers;
				if (form_handlers) {
					var attached = false;
					for (var j = 0; j < form_handlers.length; j++) {
						if (form_handlers[j][1] == 'KTML_formSubmittalHandler') {
							attached = true;
							break;
						}
						if (!attached) {
							form_handlers[form_handlers.length] = [2, 'KTML_formSubmittalHandler'];
							sortFormHandlers(form_handlers);
						}
					}
				} else {
					var tmp = frm.onsubmit.toString();
					var str = tmp.substring(tmp.indexOf('{') + 1, tmp.lastIndexOf('}'));
					frm.onsubmit = new Function('e', 'if (!KT_formSubmittalHandler(e)) return false; ' + str);
					form_handlers = [];
					form_handlers[form_handlers.length] = [priority, function_name];
				}
				frm.form_handlers = form_handlers;
			} else {
				frm.onsubmit = new Function('e', 'return KT_formSubmittalHandler(e);');
				var form_handlers = [];
				form_handlers[form_handlers.length] = [2, 'KTML_formSubmittalHandler'];
				frm.form_handlers = form_handlers;
			}
		}
	}
	this.config.UILanguage = KtmlGlobalLanguage;
};
function KtmlSafeMode(msg) {
	if (confirm(msg + "\n\n" + KT_Messages["goto technote"])) {
		window.open("http://www.interaktonline.com/Support/Knowledgebase/Technote/Details/144/124/KTML+only+loads+in+safe+mode.html");
	}
};
ktml.prototype.paint = function () {
	if (!is.valid) {
		if (this.formElement.tagName != "TEXTAREA") {
			var txt = utility.dom.createElement("TEXTAREA", {});
			txt.style.width = this.width + "px";
			txt.style.height = this.height + "px";
			txt.id = this.formElement.id;
			txt.name = this.formElement.name;
			txt.value = this.formElement.value;
			txt = this.formElement.parentNode.insertBefore(txt, this.formElement);
			try {
				this.formElement.disabled = true;
			}
			catch(e) {};
			try {
				this.formElement.removeAttribute("name");
			}
			catch(e) {};
			try {
				this.formElement.parentNode.removeChild(this.formElement);
			}
			catch(e) {};
			this.formElement = txt;
		}
		var warn = utility.dom.createElement("A", {});
		var msg = is.quirks_mode ? KT_Messages["quirks mode message"] : KT_Messages["safe mode message"].replace(/%s/, "IE 6.0, Mozilla 1.4, Netscape 7.1");
		warn.href = 'javascript:/* KTML safe mode */';
		warn.innerHTML = "KTML - safe mode<br>";
		warn = this.formElement.parentNode.insertBefore(warn, this.formElement);
		warn.onclick = function () {
			KtmlSafeMode(msg);
		};
		return;
	}
	var tlbCount = this.config_var['buttons'].length;
	var rowCount = 0,	row = -1;
	for (var i = 0; i < tlbCount; i++) {
		if (this.config_var['buttons'][i][2].length == 0) {
			continue;
		}
		row = this.config_var['buttons'][i][0];
		rowCount = Math.max(rowCount, row);
	}
	this.ui.full_size = this.config_var.show_toolbar == 'load' && ($KTML4_GLOBALS['editor_inner_dimensions'] + '') == 'true';
	var toolbarHeight2 = 29 * rowCount + (is.ie ? 2 : 4);
	var canvasHeight2 = this.height - (this.ui.full_size ? 0 : (toolbarHeight2 - (is.ie ? 2 : 2) + (this.ui.pi ? (27 + 76 + 9) : 0)));
	var toolbarHeight1 = 8;
	var canvasHeight1 = this.height - (this.ui.full_size ? 0 : ((is.ie ? +3 : 0) + 10 + 11 + 0 + 7));
	if (this.ui.toolbar) {
		var toolbarHeight = toolbarHeight2;
		var canvasHeight = canvasHeight2;
	} else {
		var toolbarHeight = toolbarHeight1;
		var canvasHeight = canvasHeight1;
	}
	this.tiHeight = this.ui.pi ? 22 : 0;
	this.piHeight = this.ui.pi ? 74 : 0;
	this.piHeightRec = this.piHeight - 20;
	this.piWidthRec = this.width - 4 - 9 - 32;
	this.iframeSRC = ktml_init_object.path + 'core/img/s.gif';
	this.iframeSRC2 = ktml_init_object.path + 'core/htm/blank.html';
	this.defaults = {};
	this.defaults.font_family = this.config_var['font_family'] ? this.config_var['font_family'] : '';
	this.defaults.background_color = this.config_var['background_color'] ? this.config_var['background_color'] : '#ffffff';
	this.defaults.font_size = this.config_var['font_size'] ? this.config_var['font_size'] : '';
	if (this.config_var['classNames'] != '' && jsshowStyleMenu == 1) this.defaults.classNames = this.config_var['classNames'] ? this.config_var['classNames'] : '';
	this.defaults.RTEcontrolName = this.config_var['RTEcontrolName'];
	this.defaults.spellcheck_language = this.config_var['spellcheck_language'] ? this.config_var['spellcheck_language'] : '';
	var _span = document.createElement('span');
	this.ui.expanded = {
		toolbar: toolbarHeight2 + (is.ie ? 0 : -1),
		canvas: canvasHeight2 + (is.ie ? 0 : 4),
		ti: 22,
		pi: 74
	};
	this.ui.collapsed = {
		toolbar: (is.ie ? 8 : 6),
		canvas: (this.height - (is.ie ? 8 : 6) - 7)
	};
	var FROM_WHERE = typeof(KTML_LOCATION_FROM) != "undefined" ? KTML_LOCATION_FROM : 'ktml4';
	var ktmlContent = '\
<div align="left" class="F7F7F7" style="background-color: #F7F7F7 !important" ktml_counter="' + this.counter + '" id="' + this.name + '_div">\
  <table class="ktml ktml_bg" style="table:layout-fixed;" id="' + this.name + 'table" width="' + (this.width - 4) + '" ' + (this.ui.full_size ? '' : 'height="' + this.height + '"') + ' cellpadding="0" cellspacing="0" border="1">\
   <tr id="' + this.name + '_toolbarContainer">\
    <td style="height: ' + (toolbarHeight + (is.ie ? +1 : -0)) + 'px; line-height:1px;" id="' + this.name + '_toolbar">&nbsp;\
    </td>\
   </tr>\
   <tr>\
    <td id="' + this.name + '_htmlObjectContainer" valign="top" style="height: ' + (canvasHeight + (is.ie ? 0 : 6)) + 'px;">\
     <iframe style="width: 100%; height: ' + (canvasHeight + (is.ie ? 0 : 6)) + 'px; background-color:' + this.defaults.background_color + '; margin:0px;' + (is.ie ? 'margin-bottom:-3px;' : '') + '" id="' + this.name + '_htmlObject" name="' + this.name + '_htmlObject" marginheight="5" marginwidth="5" frameBorder="0" src="' + this.iframeSRC + '"></iframe>\
     <iframe id="' + this.name + '_PropertyInspectorBuffer" name="' + this.name + '_PropertyInspectorBuffer" style="display: none;" src="' + this.iframeSRC + '"></iframe>\
     <textarea id="' + this.name + '_textObject" style="width: 100%; height: 100%; display:none; border:0;margin:-1px 0px;"></textarea>\
    </td>\
   </tr>\
   <tr style="display:' + ((this.ui.pi && this.ui.toolbar) ? '' : 'none') + '">\
    <td style="height: ' + this.tiHeight + 'px;" id="' + this.name + '_ti" class="taginspector">\
     <div id="' + this.name + '_ti_div" style="width: ' + (this.width - 4) + 'px;height: 25px; overflow: hidden; white-space: nowrap! important;"></div>\
    </td>\
   </tr>\
   <tr style="display:' + ((this.ui.pi && this.ui.toolbar) ? 'none' : 'none') + '" id="' + this.name + '_LoadingPI">\
    <td style="height: ' + this.piHeight + 'px;">Loading ...</td>\
   </tr>\
   <tr style="display:' + ((this.ui.pi && this.ui.toolbar) ? '' : 'none') + ';" id="' + this.name + '_PI" onmouseover="ktmls[' + this.counter + '].preserveSelection(false);" onclick="introspection_showhelp2(' + this.counter + ', event)">\
    <td style="height: ' + this.piHeight + 'px;" id="' + this.name + '_props" class="propertyinspector">\
     <table width="100%" border="0" cellpadding="0" cellspacing="0" class="ktml_bg">\
      <tr>\
       <td width="100%">\
        <fieldset style="margin: 0px; padding: 0px; margin-left: 8px;"><legend class="ktml_legend">' + translate('Properties', this.config.UILanguage) + '</legend>\
         <table width="100%" border="0" cellpadding="0" cellspacing="0">\
          <tr>\
           <td width="100%">\
            <div style="width: ' + (this.piWidthRec) + 'px; height: ' + (this.piHeightRec) + 'px; overflow: hidden; z-index: 0;">\
             <div id="Properties_none_' + this.name + '" onselectstart = "return false"; class="property_body ktml_bg">\
              ' + translate('Panel description', this.config.UILanguage) + '\
             </div>\
            </div>\
           </td>\
           <td class="ktml_bg" style="text-align: right; background-position: center ' + (this.width - 4 - 9 - 50) + 'px !important" >\
           </td>\
          <tr>\
         </table>\
        </fieldset>\
       </td>\
       <td>\
        <div id="' + this.name + '_props_collapse" class="ktml_collapse ktml_collapse_closed" style="margin-top: 5px;"><div class="kt_spacer" style="width:7px !important; height: ' + (this.piHeight - (is.ie ? 10 : 12)) + 'px !important"></div></div>\
       </td>\
      </tr>\
     </table>\
     <span id="dummy_prevent_ie_td_border_collapse" style="display:block; float:left; width:0px; height:0px; overflow: hidden">&nbsp;</span>\
    </td>\
   </tr>\
  </table>\
  <div id="' + this.name + '_paste_container" style="position:absolute; top:-2000px; left:-2000px;height:0px;width:0px;overflow:hidden;">clipboard_not_allowed</div>';
	if (is.mozilla) {
		ktmlContent += '<iframe id="paste_iframe_' + this.name + '" name="paste_iframe_' + this.name + '" style="position:absolute; top:-2000px; left:-2000px;height:0px;width:0px;z-index:-1;" src="' + this.iframeSRC2 + '"></iframe>';
		ktmlContent += '<iframe id="clean_paste_iframe_' + this.name + '" name="clean_paste_iframe_' + this.name + '" style="position:absolute; top:-1000px; left:-1000px;height:0px;width:0px;z-index:-2;" src="' + this.iframeSRC2 + '"></iframe>';
	}
	ktmlContent += '<iframe id="xhtml_iframe_' + this.name + '" name="xhtml_iframe_' + this.name + '" style="display: none" src="' + this.iframeSRC + '"></iframe>';
	ktmlContent += '<iframe id="template_save_iframe_' + this.name + '" name="template_save_iframe_' + this.name + '" style="display: none" src="' + this.iframeSRC + '"></iframe>';
	ktmlContent += '</div>';
	this.formElement.parentNode.insertBefore(_span, this.formElement.nextSibling);
	_span.innerHTML = '<table cellpadding="0" cellspacing="0"><tbody><tr><td>' + ktmlContent + '</td></tr></tbody></table>'
	if (is.mozilla) {
		var tr = document.getElementById(this.name + '_htmlObject');
		tr.style.height = (canvasHeight + 4) + 'px';
		var td = document.getElementById(this.name + '_toolbar');
		td.style.height = (toolbarHeight - 1) + 'px';
	}
	this.div = document.getElementById(this.name + '_div');
	this.div.oncontextmenu = function () {
		return false;
	};
	this.textarea = document.getElementById(this.name + '_textObject');
	this.taginspector = document.getElementById(this.name + '_ti_div');
	this.iframe = document.getElementById(this.name + '_htmlObject');
	if (is.mozilla) {
		var tlbM = this.config_var.show_toolbar;
		var piSh = this.config_var.show_pi;
		var ifrH = parseInt(this.iframe.style.height);
		var txtA = document.getElementById(this.name + '_textObject');
		var ifCn = document.getElementById(this.name + '_htmlObjectContainer');
		var tbCn = document.getElementById(this.name + '_toolbarContainer');
		if (tlbM == "load" && !piSh) {
			this.iframe.style.height = (ifrH - 10) + "px";
			ifCn.style.height = (ifrH - 10) + "px";
		}
		if (tlbM == "manual" || tlbM == "focus") {
			tbCn.style.height = "1px";
			this.iframe.style.height = (ifrH + 11) + "px";
		}
	}
	var pathToStyle = null;
	var embed_style = '';
	try {
		pathToStyle = this.config_var['module_props']['css']['PathToStyle'];
	}
	catch(e) {
		pathToStyle = null;
	}
	if (pathToStyle != null) {
		var cusCSS = pathToStyle.split(",");
		embed_style = "";
		for (var i = 0; i < cusCSS.length; i++) {
			if (i > 0) {
				embed_style += "\n";
			}
			//alert(cusCSS[i]);
			embed_style += '<link id="styler' + [i] + '" href="' + cusCSS[i] + '" rel="stylesheet" type="text/css" media="all" />';
		}
	}
	var oNewDoc = this.iframe.contentWindow.document.open("text/html; charset=" + this.charset, "replace");
	oNewDoc.write('<html><head>\n\
<meta http-equiv="Content-Type" content="text/html; charset=' + this.charset + '">\n\
 ' + embed_style + '\n\
<style>\n\
 zp, zaddress { border:1px solid black; }\n\
 #kt_hidden  {display:none !important;}\n\
 #kt_removable {display:none !important;}\n\
 #kt_new_para_before { display:none; }\n\
 #kt_new_para_after { display:none; }\n\
 form{border:1px dashed red; margin:0px;behavior: url(' + KtmlDirDepth + 'core/styles/behaviors/cancelsubmit.htc);}\n\
 label{border:1px dashed cyan;}</style></head><body><script>parent.resumeLoad1(' + this.counter + ')</script></body></html>\
 ');
	oNewDoc.close();
};
function resumeLoad1(idx) {
	var ktmlObj = ktmls[idx];
	var _tmp = document.getElementById(ktmlObj.name + '_PropertyInspectorBuffer');
	var oNewDoc = _tmp.contentWindow.document.open("text/html", "replace");
	oNewDoc.write('<html><body onload="parent.resumeLoad2(' + ktmlObj.counter + ')"></body></html>');
	oNewDoc.close();
};
function resumeLoad2(idx) {
	var ktmlObj = ktmls[idx];
	ktmlObj.edit = ktmlObj.iframe.contentWindow.document;
	if (jsshowStyleMenu == 1 && ktmlObj.defaults.classNames != '') {
		ktmlObj.edit.body.className = ktmlObj.defaults.classNames;
	} else {
		ktmlObj.edit.body.style.fontFamily = ktmlObj.defaults.font_family;
		ktmlObj.edit.body.style.fontSize = ktmlObj.defaults.font_size;
		ktmlObj.edit.body.style.backgroundColor = ktmlObj.defaults.background_color;
	}
	ktmlObj.edit.body.id = ktmlObj.defaults.RTEcontrolName;
	ktmlObj.cw = ktmlObj.iframe.contentWindow;
	ktmlObj.cw.scroll(0, 0);
	blank_location = {};
	if (/includes\/ktm\/core\/htm\/full.html/i.test(window.location.pathname)) {
		var kloca = opener.location;
	} else {
		var kloca = window.location;
	}
	var kcolons = kloca.port ? ":" : "";
	blank_location.pathname = (kloca.pathname + "").replace(/[^\/]*$/, '');
	blank_location.server = kloca.protocol + "//" + kloca.hostname + kcolons + kloca.port;
	blank_location.full = blank_location.server + blank_location.pathname;
	blank_location.ktml_root = blank_location.pathname.replace(/includes\/ktm\/core\/htm\//i, '');
	blank_location.frame_src = unescape(window.parent.document.getElementById(jsFrameName).src);
	var up = 0;
	var m = ktml_init_object.path.match(/(\.\.\/)/);
	if (m) {
		up = m.length;
	}
	if(typeof is=='undefined') {
		is=new BrowserCheck();
	}	
	if (is.mozilla) callmakeCanvasEditable(ktmlObj);
	else {
		window.setTimeout(function () {
			ktmlObj.makeCanvasEditable();
		}, 1);
	}
};
function callmakeCanvasEditable(obj) {
	glblArray = getglblRTElementsRef();
	if (glblArray != 'undefined') {
		var thisInd = getThisRTERef(obj.name, glblArray);
		if (thisInd > 0 && glblArray.length > (thisInd)) {
			var otherKTMLLoaded = getRTEStatus(glblArray, thisInd - 1);
			if (otherKTMLLoaded == 'false') {
				pause(500);
			}
		}
	}
	obj.makeCanvasEditable();
};
ktml.prototype.fixMozEditor = function () {
	var theHeadNode = this.edit.getElementsByTagName("head")[0];
	var theStyleNode = this.edit.createElement('style');
	theStyleNode.type = "text/css";
	var theTextNode = this.edit.createTextNode('a:visited{color:blue ! important}');
	theStyleNode.appendChild(theTextNode);
	theHeadNode.appendChild(theStyleNode);
};
ktml.prototype.makeCanvasEditable = function () {
	var src = String_htmldecode(this.formElement.value);
	src = src.replace(/<param\s/gi, '<zparam ');
	src = src.replace(/<!--SCRIPT_TRANSLATOR<script/gi, '<script');
	src = src.replace(/<\/script>SCRIPT_TRANSLATOR-->/gi, '</script>');
	//src=src.replace(/<script/gi,'<!--SCRIPT_TRANSLATOR<script');
	//src=src.replace(/<\/script>/gi,'</script>SCRIPT_TRANSLATOR-->');
	src = String_trim(src);
	if (src == '' || src.match(/^<br\s*\/?>$/i)) {
		src = "<p>&nbsp;</p>";
	}
	src = src.replace(/\sonclick=/ig, ' kt_onclick=');
	this.edit.body.innerHTML = src;
	this.flags.clipboard_allowed = true;
	if(typeof is=='undefined') {
		is=new BrowserCheck();
	}	
	if (is.mozilla) {
		try {
			this.edit.designMode = 'on';
		}
		catch(err) {
			return;
		};
		this.paste_container = document.getElementById('paste_iframe_' + this.name).contentWindow.document;
		this.clean_paste_container = document.getElementById('clean_paste_iframe_' + this.name).contentWindow.document;
		this.clean_paste_container.body.innerHTML = src;
		this.edit.execCommand("useCSS", false, true);
		this.edit.execCommand("styleWithCSS", true, false);
		this.fixMozEditor();
		if (window.KT_attachProperties) {
			this.propertiesAttached = true;
			window.KT_attachProperties(this.iframe);
		}
	} else {
		this.edit.execCommand("LiveResize", true, true);
	}
	utility.dom.attachEvent2(this.edit, 'mousedown', utility.popup.removeModal);
	this.paintToolbar();
};
ktml.prototype.addCustomButton = function (btn, button_after_name, group_index) {
	this.customButtons.push([btn, button_after_name, group_index]);
};
var clickedSubmitButton = null;
var skipNextFocusEvent = false;
ktml.prototype.paintToolbar = function () {
	if (this.toolbarPainted) {
		return;
	}
	this.toolbarPainted = true;
	var td = document.getElementById(this.name + '_toolbar');
	td.style.display = 'none';
	td.innerHTML = '';
	this.setToolbarButtons(this.config_var['buttons']);
	var toolbarSrc = '<table cellpadding="0" cellspacing="0" border="0" width="100%" class="toolbar">\
   <tr>\
    <td class="ktml_collapse" style="display: none"><img src="' + KtmlRelativeImagePath + 's.gif" width="8" /></td>\
    <td valign="bottom" nowrap="nowrap" style="display:' + (this.ui.toolbar ? '' : 'none') + '">\
     <span id="Property_' + this.name + '"></span>\
     <span id="Property_first_' + this.name + '" style="display: none"></span>\
    </td>\
   </tr>\
  </table>\
  <div id="ktml_' + this.name + '_ccdiv" class="cc_container"></div>\
  <div id="ktml_' + this.name + '_cpdiv" class="cp_container">z</div>';
	td.innerHTML = toolbarSrc;
	var collapseTD = td.getElementsByTagName('td')[0];
	var loca = window.location;
	str = loca.protocol + "//" + loca.host + loca.pathname;
	str = str.replace(/[^\/]*$/i, '');
	this.serializer = new Serializer(this.name, str);
	this.serializer.load();
	this.toolbar = new Toolbar(document.getElementById("Property_" + this.name), document.getElementById("Property_first_" + this.name), this);
	this.toolbar.initializeUI();
	if (this.ui.toolbar && this.ui.showToolbar == "load") {
		this.ui.showToolbar = "none";
		this.toolbar.addBuiltinButtons(this.config.buttons);
		this.toolbar.addCustomButtons(this.customButtons);
		this.toolbar.lateLoaded = true;
	}
	utility.dom.setUnselectable(td);
	collapseTD.title = translate("Show/Hide Toolbar", this.config.UILanguage);
	var ktmlObj = this;
	if (this.ui.showToolbar == "focus") {
		this.ui.originalShowToolbar = "focus";
	}
	if (typeof(nxt_form_attach) != "function" && this.formElement.form && !this.formElement.form.getAttribute("kt_submit_all_events_attached")) {
		var firstSubmitFormButton = null;
		Array_each(this.formElement.form.elements, function (button, i) {
			if (getKTMLIndexFromElement(button) != -1) {
				return;
			}
			if (!firstSubmitFormButton && button.type && button.type == "submit") {
				firstSubmitFormButton = button;
			}
			utility.dom.attachEvent(button, 'focus', function (e) {
				var o = utility.dom.setEventVars(e);
				var el = o.targ;
				if (skipNextFocusEvent) {
					if (el.type && el.type == "submit") {
						clickedSubmitButton = el;
					}
					skipNextFocusEvent = false;
					return;
				}
				if (el.type && el.type == "submit") {
					clickedSubmitButton = el;
				} else {
					clickedSubmitButton = firstSubmitFormButton;
				}
			});
		});
		this.formElement.form.setAttribute("kt_submit_all_events_attached", true);
	}
	utility.dom.attachEvent2(window.document.body, 'mousedown', function (e) {
		var o = utility.dom.setEventVars(e);
		var el = o.targ;
		if (typeof(nxt_form_attach) != "function") {
			if (el.type && el.type == "submit") {
				skipNextFocusEvent = true;
				clickedSubmitButton = o.targ;
			} else {
				skipNextFocusEvent = false;
				clickedSubmitButton = null;
			}
		}
		if (ktmlObj.ui.showToolbar == "focus" || ktmlObj.ui.showToolbar == "none") {
			if (is.ie && typeof(el.getAttribute) == "undefined") {
				el = document.elementFromPoint(event.screenX - window.screenLeft, event.screenY - window.screenTop);
			}
			var clicked_ktml_index = getKTMLIndexFromElement(el);
			if (focusedKTMLIndex != null && (clicked_ktml_index != focusedKTMLIndex || clicked_ktml_index == -1)) {
				ktmls[focusedKTMLIndex].setToolbarVisibility(false);
				focusedKTMLIndex = null;
			}
		}
	});
	utility.dom.attachEvent(collapseTD, 'onclick', function () {
		ktmlObj.setToolbarVisibility(!ktmlObj.ui.toolbar);
		return false;
	});
	utility.dom.attachEvent(td, 'onmouseover', function () {
		ktmlObj.preserveSelection(true);
	});
	utility.dom.attachEvent(td, 'onmouseout', function () {
		ktmlObj.preserveSelection(false);
	});
	td.style.display = '';
	this.loadEditor();
};
function getKTMLIndexFromElement(el) {
	var clicked_ktml_index = -1;
	var kc = null;
	while (true) {
		if (!el || el.nodeName == "BODY") {
			break;
		}
		try {
			kc = el.getAttribute('ktml_counter')
		}
		catch(err) {}
		if (kc != null) {
			clicked_ktml_index = parseInt(kc, 10);
			break;
		}
		el = el.parentNode;
		if (!el) {
			break;
		}
		if (el.nodeType != 1) {
			el = el.parentNode;
		}
	}
	return clicked_ktml_index;
};
ktml.prototype.loadEditor = function () {
	var ktmlObj = this;
	ktmlObj.editorJsLoaded = true;
	var editorSrc = ktml_init_object.path + 'core/editor.js';
	editorSrc = editorSrc.replace(/\.js$/, (is.ie ? '_ie' : '_mozilla') + '.js');
	KtmlIncludeJs(editorSrc, function () {
		ktmlObj.editorJsLoaded = true;
		ktmlObj.editorSpecificJsLoaded = true;
		ktmlObj.editorLoaded();
	});
	if (is.mozilla) changeglblSetting(ktmlObj);
};
ktml.prototype.myCustomResize = function (width, height) {
	this.config_var.width = width;
	this.config_var.height = height;
	var tlbCount = this.config_var['buttons'].length;
	var rowCount = 0,	row = -1;
	for (var i = 0; i < tlbCount; i++) {
		if (this.config_var['buttons'][i][2].length == 0) {
			continue;
		}
		row = this.config_var['buttons'][i][0];
		rowCount = Math.max(rowCount, row);
	}
	this.ui.full_size = this.config_var.show_toolbar == 'load' && ($KTML4_GLOBALS['editor_inner_dimensions'] + '') == 'true';
	var toolbarHeight2 = 29 * rowCount + (is.ie ? 2 : 4);
	var canvasHeight2 = this.config_var.height - (this.ui.full_size ? 0 : (toolbarHeight2 - (is.ie ? 2 : 2) + (this.ui.pi ? (27 + 76 + 9) : 0)));
	var toolbarHeight1 = 8;
	var canvasHeight1 = this.config_var.height - (this.ui.full_size ? 0 : ((is.ie ? +3 : 0) + 10 + 11 + 0 + 7));
	if (this.ui.toolbar) {
		var toolbarHeight = toolbarHeight2;
		var canvasHeight = canvasHeight2;
	} else {
		var toolbarHeight = toolbarHeight1;
		var canvasHeight = canvasHeight1;
	}
	this.tiHeight = this.ui.pi ? 22 : 0;
	this.piHeight = this.ui.pi ? 74 : 0;
	this.piHeightRec = this.ui.pi ? this.piHeight - 20 : 0;
	this.piWidthRec = this.config_var.width - 45;
	thisIframe = document.getElementById(this.name + '_htmlObject');
	thisIframe.parentNode.style.width = (this.config_var.width) + 'px';
	thisIframe.parentNode.style.height = canvasHeight + (is.ie ? 0 : 6) + 'px';
	var tableElement = document.getElementById(this.name + 'table');
	tableElement.style.height = this.config_var.height + 'px';
	thisIframe.style.width = (this.config_var.width) + 'px';
	thisIframe.style.height = canvasHeight + (is.ie ? 0 : 6) + 'px';
	toolbarContainer = document.getElementById(this.name + '_toolbarContainer');
	toolbarContainer.style.height = toolbarHeight + 'px';
	toolbarContainer.style.width = (this.config_var.width - 45) + 'px';
	toolbarCell = document.getElementById(this.name + '_toolbar');
	toolbarCell.style.width = (this.config_var.width - 45) + 'px';
	try {
		document.getElementById(this.name + '_ti').style.width = (this.config_var.width - 45) + 'px';
	}
	catch(e) {}
	if (this.displayMode == 'CODE') {
		this.swapToMode = 'RICH';
		this.logic_setDisplayMode();
		this.swapToMode = 'CODE';
		this.disablePushButtons(true);
		this.logic_setDisplayMode();
	}
	this.paintToolbar();
	this.toolbar.owner.width = this.config_var.width - 45;
	this.toolbar.Resize();
	this.displayChanged();
}
ktml.prototype.Resize = function () {
	var dif = is.ie ? 5 : 2;
	var width = (this.iframe.parentNode.offsetWidth - dif);
	if (width < 0) {
		width = 0;
	}
	var height = (this.iframe.parentNode.offsetHeight - 2 * dif);
	if (height < 0) {
		height = 0;
	}
	this.textarea.style.width = width + 'px';
	this.textarea.style.height = height + 'px';
	this.textarea.style.border = '0px solid #ccc';
};
function ktml_viewsource_hook() {
	this.textarea.value = HandleOutgoingText(this, this.textarea.value);
};
ktml.prototype.editorLoaded = function () {
	if (this.editorJsLoaded && this.editorSpecificJsLoaded) {
		if (typeof(this.registerEvents) == "undefined") {
			return;
		}
		this.registerEvents(this);
		this.undo = new UndoManager(this);
		this.viewInvisibles = true;
		this.undo.init();
		this.utils_setInvisibles(false);
		this.hooks['onsetdisplaymode'].push(ktml_viewsource_hook);
		this.util_checkClipboardAccess();
		utility.dom.setUnselectable(this.taginspector);
		this.loadModules();
	}
};
ktml.prototype.util_checkClipboardAccess = function () {
	if (!is.mozilla) {
		return;
	}
	try {
		this.paste_container.designMode = 'on';
	}
	catch(err) {
		return;
	}
	try {
		this.paste_container.execCommand(KtmlGetCommand('paste'), false, null);
	}
	catch(err) {
		if (err.result == 2152924147) {
			this.flags.clipboard_allowed = false;
		}
	}
};
ktml.prototype.loadModules = function () {
	this.shouldLoadModules = true;
	window.KtmlWindowLoaded = true;
	KtmlLoadModules();
	var _this = this;
	window.setTimeout(function () {
		_this.Resize()
	}, 1);
	if (typeof window.onLoadKtml == 'function') {
		window.onLoadKtml(this);
	}
};
ktml.prototype.setToolbarButtons = function (buttonsVariable) {
	if (typeof(buttonsVariable) == "string") {
		this.config.buttons = buttonsVariable.split(",");
	} else if (typeof(buttonsVariable) == "object") {
		this.config.buttons = buttonsVariable;
	}
};
ktml.prototype.hasModule = function (moduleName) {
	return (typeof this.config_var['module_props'][moduleName] != 'undefined')
};
ktml.prototype.preserveSelection = function (flag) {
	this.dontLeaveMeFlag = flag;
};
ktml.prototype.dispose = function () {
	this.piloader = null;
	this.taginspector = null;
	this.textarea = null;
	if (typeof this.toolbar != 'undefined') {
		this.toolbar.dispose();
		this.toolbar = null;
	}
	if (typeof this.cpalette != 'undefined') {
		this.cpalette.dispose();
	}
	if (typeof this.glyphhandler != 'undefined') {
		this.glyphhandler.dispose();
	}
	if (typeof this.cleantypespicker != 'undefined') {
		this.cleantypespicker.dispose();
	}
	if (typeof this.contextMenu != 'undefined') {
		KTStorage.get(this.contextMenu).dispose();
	}
	if (typeof this.charpalette != 'undefined') {
		this.charpalette.dispose();
	}
	if (typeof this.inserttablepicker != 'undefined') {
		this.inserttablepicker.dispose();
	}
	for (dr in this.htmldropdowns) {
		this.htmldropdowns[dr] = null;
	}
	this.htmldropdowns = null;
	this.formElement = null;
	this.div = null;
	this.iframe = null;
	this.edit = null;
};
function ktmls_unload() {
	if (!is.valid) {
		return;
	}
	if (is.mozilla) {
		var ifr = document.getElementsByTagName('iframe');
		for (var i = 0; i < ifr.length; i++) {
			var oNewDoc = ifr[i].contentWindow.document.open("text/html", "replace");
			oNewDoc.write("");
			oNewDoc.close();
		}
	}
	if (is.ie) {
		for (var i = 0; i < ktmls.length; i++) {
			ktmls[i].dispose();
		}
		CollectGarbage();
	}
};
if (typeof ktmls_unload_attached == 'undefined') {
	ktmls_unload_attached = true;
	utility.dom.attachEvent2(window, 'unload', ktmls_unload);
}
ktml.prototype.collapse = function (how) {
	if (this.introspector) {
		this.introspector.hidePI();
	}
	var mode = this.displayMode;
	var show = {
		tb: this.ui.toolbar,
		pi: this.ui.toolbar && this.ui.pi && how,
		ti: (this.ui.toolbar && this.ui.pi)
	};
	var avail_height = this.height;
	var brd = is.ie ? 2 : 1;
	var borders = brd * 3;
	borders += show.pi ? brd * 2 : 0;
	borders += show.ti ? brd * 2 : 0;
	avail_height -= borders;
	avail_height -= show.tb ? this.ui.expanded.toolbar : 8;
	avail_height -= show.pi ? 74 : 0;
	avail_height -= show.ti ? 22 : 0;
	var pi_el = null;
	if (this.loadingPI) {
		pi_el = document.getElementById(this.name + '_LoadingPI');
	} else {
		pi_el = document.getElementById(this.name + '_PI');
	}
	var canvas = this.iframe.parentNode;
	/*
  if(!this.ui.full_size){
    this.iframe.style.height=Math.max(24,avail_height-3-(is.ie?0:3))+'px';
    this.textarea.style.height=Math.max(24,avail_height-6)+'px';
    canvas.style.height=Math.max(24,avail_height-4-(is.ie?0:3))+'px';
    }
  */
	pi_el.style.display = show.pi ? '' : 'none';
	var tb = document.getElementById(this.name + '_toolbar');
	var tbtd = utility.dom.getParentByTagName(this.toolbar.base, "td");
	if (show.tb) {
		tb.style.height = this.ui.expanded.toolbar + 'px';
		tbtd.style.display = '';
	} else {
		tbtd.style.display = 'none';
		tb.style.height = '8px';
	}
	this.taginspector.parentNode.parentNode.style.display = show.ti ? '' : 'none';
	/*
  if(!this.ui.full_size){
    if(is.mozilla){
      this.iframe.style.height=Math.max(24,avail_height-(how?(mode=="CODE"?4:4):3))+'px';
      this.textarea.style.height=Math.max(24,avail_height-(how?(mode=="CODE"?0:4):(mode=="CODE"?0:3))-3)+'px';
      canvas.style.height=Math.max(24,avail_height-(how?(mode=="CODE"?4:4):(mode=="CODE"?3:3)))+'px';
      }
    }
 */
}
ktml.prototype.setToolbarVisibility = function (flag) {
	this.ui.toolbar = flag;
	if (!this.toolbar.lateLoaded) {
		this.toolbar.addBuiltinButtons(this.config.buttons);
		this.toolbar.addCustomButtons(this.customButtons);
		this.toolbar.lateLoaded = true;
		for (var btn in this.toolbar.deferredcommands) {
			var idx = this.toolbar.indexOfName(btn);
			if (idx >= 0) {
				this.toolbar.buttonobjects[idx].command = this.toolbar.deferredcommands[btn];
			}
		}
		for (f_idx = 0; f_idx < this.toolbar.deferredfunctors.length; f_idx++) {
			this.toolbar.deferredfunctors[f_idx]();
		}
	}
	this.collapse(flag);
	if (is.mozilla) {
		this.cw.focus();
	}
	this.Resize();
	if (this.introspector) {
		this.introspector.update();
	}
	return;
};
ktml.prototype.logic_tableNavigation = function (currentTD, direction) {
	var _next = direction ? utility.dom.getNextSiblingByTagName(currentTD, "td", true) : utility.dom.getPreviousSiblingByTagName(currentTD, "td", true);
	if (_next === null) {
		_next = currentTD.parentNode;
		_next = direction ? utility.dom.getNextSiblingByTagName(_next, "tr", true) : utility.dom.getPreviousSiblingByTagName(_next, "tr", true);
		if (_next === null) {
			return null;
		}
		_next = direction ? utility.dom.getNextSiblingByTagName(_next.firstChild, "td") : utility.dom.getPreviousSiblingByTagName(_next.lastChild, "td");
	}
	return _next;
};
function dd(s, clear) {
	clear = clear || false;
	if (clear) {
		document.getElementById("dbg").value = "";
	}
	document.getElementById("dbg").value += utility.debug.dumpone(s) + "";
	document.getElementById("dbg").scrollTop = 100000;
};
ktml.prototype.logic_doFormat = function (what, second_pass) {
	var toundo = true;
	switch (what) {
	case 'cut':
		try {
			this.edit.execCommand(KtmlGetCommand('cut'), false, null);
		}
		catch(e) {
			if (confirm('Your browser is configured to not allow direct access to the clipboard via any of the Rich Text Editor buttons.  You can try to use Ctrl+X to cut content instead.\n\nPress OK to open a technical note with possible explanations on how to allow access to you clipboard via the Rich Text Editor buttons. Press Cancel to return to the editor.')) {
				var wnd = window.open('http://mozilla.org/editor/midasdemo/securityprefs.html', 'securityprefs', '');
				wnd.focus();
			}
		}
		break;
	case 'copy':
		try {
			this.edit.execCommand(KtmlGetCommand('copy'), false, null);
		}
		catch(e) {
			if (confirm('Your browser is configured to not allow direct access to the clipboard via any of the Rich Text Editor buttons.  You can try to use Ctrl+C to copy content instead.\n\nPress OK to open a technical note with possible explanations on how to allow access to you clipboard via the Rich Text Editor buttons. Press Cancel to return to the editor.')) {
				var wnd = window.open('http://mozilla.org/editor/midasdemo/securityprefs.html', 'securityprefs', '');
				wnd.focus();
			}
		}
		break;
	case 'paste':
		utility.window.blockInterface();
		var success = this.pasteClipboard();
		if (is.mozilla && !success) {
			var errmsg = 'Your browser is configured to not allow direct access to the clipboard via any of the Rich Text Editor buttons.  You can try to use Ctrl+V to paste content instead.\n\nPress OK to open a technical note with possible explanations on how to allow access to you clipboard via the Rich Text Editor buttons. Press Cancel to return to the editor.'
			if (confirm(errmsg)) {
				var wnd = window.open('http://mozilla.org/editor/midasdemo/securityprefs.html', 'securityprefs', '');
				wnd.focus();
			}
		}
		this.runHooks('onpaste');
		utility.window.unblockInterface();
		break;
	case 'paste_word':
		utility.window.blockInterface();
		var success = this.pasteClipboard('word');
		if (is.mozilla && !success) {
			if (confirm('Unprivileged scripts cannot invoke the Cut, Copy, and Paste commands!\nPress OK to open a technical note window with possible explanations to your problem. Press Cancel to return to the editor.')) {
				var wnd = window.open('http://mozilla.org/editor/midasdemo/securityprefs.html', 'securityprefs', '');
				wnd.focus();
			}
		}
		this.runHooks('onpaste_word');
		utility.window.unblockInterface();
		break;
	case 'toggle_visible':
		this.logic_toggleInvisibles();
		break;
	case 'toggle_editmode':
		if (this.displayMode == 'CODE') {
			this.disablePushButtons(false);
			this.swapToMode = 'RICH';
		} else {
			this.disablePushButtons(true);
			this.swapToMode = 'CODE';
		}
		this.logic_setDisplayMode(true);
		return;
	case 'fonttype':
		this.cw.focus();
		if (!arguments[1]) {
			var selNode = this.logic_getSelectedNode();
			var fnt = utility.dom.getParentByTagName(selNode, "FONT");
			if (!fnt) {
				break;
			}
			fnt.removeAttribute("face");
			var m = fnt.outerHTML.match(/<font([^>]*)>/i);
			var str = '';
			if (m.length > 1) {
				str = m[1].replace(/\s/gi, '');
			}
			if (!str) {
				this.util_stripTag(fnt);
			}
		} else {
			this.ui_logicDoWordFormat(KtmlGetCommand('fontname'), arguments[1]);
		}
		break;
	case 'SelectAll':
		this.edit.execCommand(KtmlGetCommand('selectall'), false, null);
		break;
	case 'fontsize':
		this.cw.focus();
		var tmp = arguments[1];
		if (isNaN(parseInt(tmp))) {
			var selNode = this.logic_getSelectedNode();
			var fnt = utility.dom.getParentByTagName(selNode, "FONT");
			if (!fnt) {
				break;
			}
			fnt.removeAttribute("size");
			var m = fnt.outerHTML.match(/<font([^>]*)>/i);
			var str = '';
			if (m.length > 1) {
				str = m[1].replace(/\s/gi, '');
			}
			if (!str) {
				this.util_stripTag(fnt);
			}
		} else {
			var ret = this.ui_logicDoWordFormat(KtmlGetCommand('fontsize'), parseInt(tmp));
			if (!ret) {
				return;
			}
		}
		break;
	case 'bold':
		this.ui_logicDoWordFormat(KtmlGetCommand('bold'));
		break;
	case 'italic':
		this.ui_logicDoWordFormat(KtmlGetCommand('italic'));
		break;
	case 'underline':
		this.ui_logicDoWordFormat(KtmlGetCommand('underline'));
		break;
	case 'superscript':
		this.ui_logicDoWordFormat(KtmlGetCommand('superscript'));
		break;
	case 'subscript':
		this.ui_logicDoWordFormat(KtmlGetCommand('subscript'));
		break;
	case 'JustifyLeft':
		this.edit.execCommand(KtmlGetCommand('justifyleft'), false, null);
		break;
	case 'JustifyCenter':
		this.edit.execCommand(KtmlGetCommand('justifycenter'), false, null);
		break;
	case 'JustifyRight':
		this.edit.execCommand(KtmlGetCommand('justifyright'), false, null);
		break;
	case 'JustifyFull':
		this.edit.execCommand(KtmlGetCommand('justifyfull'), false, null);
		break;
	case 'InsertOrderedList':
		this.edit.execCommand(KtmlGetCommand('orderlist'), false, null);
		this.logic_cleanList();
		break;
	case 'InsertUnorderedList':
		this.edit.execCommand(KtmlGetCommand('unorderlist'), false, null);
		this.logic_cleanList();
		break;
	case 'indent':
		this.edit.execCommand(KtmlGetCommand('indent'), false, null);
		break;
	case 'outdent':
		this.edit.execCommand(KtmlGetCommand('outdent'), false, null);
		break;
	case 'cshr':
		this.logic_hrOnClick();
		break;
	case 'FindText':
		if (is.mozilla) {}
		break;
	case 'CleanHTML':
		this.util_cleanHTMLContent();
		return;
	case 'RemoveLink':
		if (is.mozilla && this.cw.getSelection().isCollapsed) {
			this.logic_removeTag();
		} else {
			this.logic_removeTag();
			this.edit.execCommand("Unlink", false, false);
		}
		break;
	case 'insert_anchor':
		var sAnchorName, rng, htmlText, initValue;
		rng = this.edit.selection.createRange();
		var originalSelection = rng.htmlText;
		if (is.ie && (this.edit.selection.type == "Control")) {
			var el = rng.item(0);
			htmlText = el.outerHTML;
			this.edit.selection.empty();
			var tr = this.edit.body.createTextRange();
			tr.moveToElementText(el)
			tr.moveStart("character", 1);
			tr.select();
		} else {
			htmlText = rng.htmlText;
			rng.collapse(false);
			rng.select();
		}
		initValue = utility.string.getInnerText(htmlText);
		initValue = String_trim(initValue);
		initValue = initValue.replace(/\s+/g, ' ');
		initValue = initValue.replace(/[^\w\s;&]+/g, '_');
		sAnchorName = prompt(translate("Please enter anchor name:", this.config.UILanguage), initValue);
		if (sAnchorName && sAnchorName != "") {
			// Begin: FIX (Issue 3183) -- Part 1 of 1.
			// Old code:		 
			//var strAnchorToBeInserted = "<a name='"+sAnchorName+"'>"+originalSelection;
			// New code:
			var strAnchorToBeInserted = "<a name='" + sAnchorName + "'>";
			this.insertHTML(strAnchorToBeInserted);
			// End: FIX (Issue 3183) -- Part 1 of 1.
			toundo = false;
		};
		break;
	case 'cscharacter':
		this.logic_openChrPalette();
		return;
	case 'BackColor':
		this.logic_openPalette(this.toolbar.bgcolor, 'b');
		return;
	case "ForeColor":
		this.logic_openPalette(this.toolbar.fgcolor, 'f');
		break;
	case 'undo':
		if (this.undo) {
			this.undo.undo();
			toundo = false;
		} else {
			this.logic_recCommand(KtmlGetCommand('undo'));
		}
		break;
	case 'redo':
		if (this.undo) {
			this.undo.redo();
			toundo = false;
		} else {
			this.logic_recCommand(KtmlGetCommand('redo'));
		}
		break;
	case 'InsertHeading':
		this.cw.focus();
		this.logic_InsertHeading(arguments[1]);
		break;
	case 'toggle_properties_inspector':
		this.logic_togglePIDisplay();
		break;
	case 'csforeground':
		this.logic_openCSColorPalette('f');
		break;
	case 'csbackground':
		this.logic_openCSColorPalette('b');
		break;
	case 'csimage':
		this.logic_imageOnClick();
		break;
	case 'cslink':
		this.logic_linkOnClick();
		break;
	case 'cssnippet':
		this.logic_snippetOnClick();
		break;
	case 'csfield':
		this.logic_fieldOnClick();
		break;
	}
	if (toundo) {
		this.invalidate();
	}
	if (this.undo && toundo) {
		this.undo.addEdit();
	}
	this.cw.focus();
	this.ui_setButtonState();
};
ktml.prototype.disablePushButtons = function (state) {
	var clsList = ("clsFinishButton,clsSaveButton,clsOKButton,clsNextButton,clsPrevButton").split(',');
	var dspState = state ? 'none' : '';
	var oldSt, arrlst;
	var holder = window.parent.document.getElementById('clsProxyButtonHolder');
	if (holder) {
		Array_each(clsList, function (elem, i) {
			arrLst = holder.getElementsByTagName('SPAN');
			if (arrLst.length) {
				for (var i = 0; i < arrLst.length; i++) {
					if (arrLst[i].className == elem) arrLst[i].style.display = dspState;
				}
			}
		});
		// if there is any explicit button state display function, call it.	
		if (window.parent.setButtonDisplay && dspState == '') window.parent.setButtonDisplay();
	}
};
ktml.prototype.pasteClipboard = function (clean_type) {
	var ret = {
		clipboard_allowed: false,
		has_word: false,
		html_content: '',
		cleaned_content: ''
	};
	ret = testClipboardForWordHTML(this);
	if (!ret.clipboard_allowed) return false;
	pasteText = ret.html_content;
	Ktml_object.pasteText = pasteText;
	var pasteTextNoBR = pasteText.replace(/<br[ \/]*>/gi, "");
	var pasteTextHasTags = pasteTextNoBR.match(/<[a-z].*>/i);
	var pastedPlain = false;
	if (pasteTextHasTags == null) pastedPlain = true;
	var taglist = "acronym,b,bdo,big,blink,dfn,em,font,i,ins,kbd,nobr,q,s,samp,small,strike,strong,sub,sup,it,u,var";
	hasformattags = DoesContainTag(ret.pastedText, taglist);
	hasScript = checkForScript();
	if (useCSPasteOptions != 1) {
		// we should not show the commonspot paste options dialog.
		doDefaultClean(ret, this.counter);
	} else {
		if (pastePlain == 0 || (pastePlain == 1 && pastedPlain == false)) {
			var strURL = jsDlgLoader + '?csModule=dhtmledit/paste-dlg' + '&pageid=' + jspageid + '&nonstd=' + escape(ret.nonstandard_fonts) + '&ktmlFrameName=' + jsFrameName + '&hasformattags=' + hasformattags + '&hasScript=' + hasScript + '&hasWord=' + ret.has_word + '&formatted=' + enablePasteFormatted + '&unformatted=' + enablePasteUnformatted + '&code=' + enablePasteCode + '&remclass=' + pasteRemClass + '&remWord=' + pasteRemWord + '&remstyle=' + pasteRemStyle + '&remfonts=' + pasteRemFonts + '&defPasteOption=' + defPasteOption + '&counter=' + this.counter;
			if (curWin && curWin.closed) {
				curWin = null;
			}
			if (curWin) {
				try {
					curWin.focus();
				}
				catch(err) {}
			} else {
				curWin = newWindow(this.name + "Paste", strURL);
			}
		} else {
			var pasteArgs = {
				counter: 0,
				removeScript: 0,
				removeClass: 0,
				removeWord: 0,
				removeStyle: 0,
				removeFont: 0,
				replacementFont: null,
				pastePlain: 1,
				pasteCode: 0,
				removeFormat: 0
			};
			pasteCallback(pasteArgs);
		}
	}
	if (is.ie) {
		try {
			var cur_range = this.edit.selection.createRange();
			if (cur_range) {
				this.edit.selection.clear();
				this.undo.addEdit();
			}
		}
		catch(err) {}
	}
	return true;
}
function doDefaultClean(ret, counter) {
	var pasteArgs = {
		counter: counter,
		remScript: 0,
		remFormat: 0,
		replaceFont: null,
		pastePlain: 0,
		pasteCode: 0
	};
	//0: never remove
	//3: leave by default
	pasteArgs.remClass = (pasteRemClass == 0 || pasteRemClass == 3) ? 0 : 1;
	pasteArgs.remStyle = (pasteRemStyle == 0 || pasteRemStyle == 3) ? 0 : 1;
	pasteArgs.remWord = (pasteRemWord == 0 || pasteRemWord == 3) ? 0 : 1;
	pasteArgs.remFonts = (pasteRemFonts == 0 || pasteRemFonts == 3) ? 0 : 1;
	switch (defPasteOption) {
	case "paste_enable_formatted":
		break;
	case "paste_enable_unformatted":
		pasteArgs.remFormat = 1;
		break;
	case "paste_enable_code":
		pasteArgs.pasteCode = 1;
		break;
	case "pastePlain":
		pasteArgs.pastePlain = 1;
		break;
	}
	//0,remScript,remClass,remWord,remStyle,remFonts,replaceFont,pastePlain,pasteCode,remFormat
	pasteCallback(pasteArgs);
}
function pasteCallback(pasteArgs) {
	//counter,removeScript,removeClass,removeWord,removeStyle,removeFont,replacementFont,pastePlain,pasteCode,removeFormat
	//{none:null,word:util_cleanHTMLContent,css:util_cleanCSSStyles,classes:util_cleanCSSClasses,script:util_cleanScriptTags,fonts:util_cleanFontTags,formatting:util_cleanFormattingTags,all:util_cleanAllTags};
	var counter = pasteArgs.counter;
	var Ktml_object = ktmls[counter];
	var retObj = {
		clipboard_allowed: false,
		has_word: false,
		html_content: '',
		cleaned_content: ''
	};
	if (is.ie) {
		Ktml_object.util_restoreSelection(true);
		Ktml_object.cw.focus();
	}
	retObj = testClipboardForWordHTML(Ktml_object);
	var cur_range = Ktml_object.edit.selection.createRange();
	var clean_function = null;
	var clean_called = 0;
	var new_html = retObj.html_content;
	if (pasteArgs.pastePlain == 1) pasteArgs.removeWord = 1;
	var r1 = new RegExp("^&nbsp;");
	new_html = new_html.replace(r1, "");
	cur_range.select();
	if (cur_range.length) {
		cur_range.item(0).outerHTML = "";
		cur_range = Ktml_object.edit.selection.createRange();
	}
	if (new_html.length != 0) {
		new_html = util_rem_strings(new_html);
	}
	if (pasteArgs.removeWord == 1) {
		new_html = util_plain2translated(util_cleanHTMLContentCustom(util_translated2plain(new_html), true), counter);
		clean_called = 1;
	}
	if (pasteArgs.removeScript == 1) {
		clean_function = util_getCleanFunction('script', retObj.has_word);
		if (clean_function) {
			new_html = util_plain2translated(clean_function(util_translated2plain(new_html)), counter);
			clean_called = 1;
		}
	}
	if (pasteArgs.removeClass == 1) {
		clean_function = util_getCleanFunction('classes', retObj.has_word);
		if (clean_function) {
			new_html = util_plain2translated(clean_function(util_translated2plain(new_html)), counter);
			clean_called = 1;
		}
	}
	if (pasteArgs.removeStyle == 1) {
		/*
		new_html=new_html.replace(/\s*style\s*=\s*['"]?[^'">]*['"]?/ig," ");
		new_html=util_plain2translated(util_translated2plain(new_html.replace(/\s<span\s*style\s*=\s*['"]?[^'">]*['"]?/ig," ")));
		*/
		var tmp = new_html;
		tmp = tmp.replace(/\sstyle\s*=\s*"[^"]*"/ig, " ");
		tmp = tmp.replace(/\sstyle\s*=\s*'[^']*'/ig, " ");
		tmp = tmp.replace(/\sstyle\s*=\s*[^\s>]+/ig, " ");
		new_html = tmp;
		clean_called = 1;
	}
	if (pasteArgs.removeStyle == 1 && pasteArgs.removeClass == 1) {
		clean_function = util_getCleanFunction('css', retObj.has_word);
		if (clean_function) {
			new_html = util_plain2translated(clean_function(util_translated2plain(new_html)), counter);
			clean_called = 1;
		}
	}
	if (pasteArgs.removeFont == 1) {
		clean_function = util_getCleanFunction('fonts', retObj.has_word);
		if (clean_function) {
			new_html = util_plain2translated(clean_function(util_translated2plain(new_html)), counter);
			clean_called = 1;
		}
	}
	if (pasteArgs.pastePlain == 1) {
		clean_function = util_getCleanFunction('all', retObj.has_word);
		if (clean_function) {
			new_html = util_plain2translated(clean_function(util_translated2plain(new_html)), counter);
			clean_called = 1;
		}
	}
	if (pasteArgs.removeFormat == 1) {
		clean_function = util_getCleanFunction('formatting', retObj.has_word);
		if (clean_function) {
			new_html = util_plain2translated(clean_function(util_translated2plain(new_html)), counter);
			clean_called = 1;
		}
	}
	if (pasteArgs.replacementFont) {
		var nonstandardlist = retObj.nonstandard_fonts;
		if (nonstandardlist.length > 0) {
			var arrayofstrings = nonstandardlist.split("^");
			for (var j = 0; j < arrayofstrings.length; j++) {
				new_html = substringReplace(new_html, arrayofstrings[j], pasteArgs.replacementFont);
			}
		}
	}
	if (pasteArgs.pasteCode == 1) {
		new_html = substringReplace(new_html, "<", "&lt;");
		new_html = substringReplace(new_html, ">", "&gt;");
		clean_called = 1;
	}
	if (is.mozilla) {
		// compare against links in the source (ktml editor)
		Ktml_object.paste_container.body.innerHTML = util_removeSiteNameFromHTMLForPaste(Ktml_object, new_html);
		Ktml_object.paste_container.execCommand('SelectAll', false, false);
		try {
			Ktml_object.paste_container.execCommand('cut', false, false);
		} catch(e) {}
		var selNode = Ktml_object.logic_getSelectedNode();
		if (selNode && selNode.nodeName.toLowerCase() == 'p' && selNode.innerHTML == '&nbsp;') {
			// Ktml_object.edit.selection.collapseToEnd();
			Ktml_object.logic_removeTag();
		}
		Ktml_object.edit.execCommand('paste', false, false);
		var uniqueID = Ktml_object.getUniqueID();
		s1 = Ktml_object.edit.selection.createRange()
		Ktml_object.insertHTML('<u id="' + uniqueID + '"></u>');
		str = Ktml_object.getPlainSource();
		// compare against links in the source (cleaned_paste iframe)
		Ktml_object.edit.body.innerHTML = util_removeSiteNameFromHTMLForPaste(Ktml_object, str);
		var sel = Ktml_object.edit.getElementById(uniqueID);
		if (sel) {
			s1.moveToElementText(sel);
			sel.parentNode.removeChild(sel);
			s1.select();
		}
		Ktml_object.logic_updateDOMHierarchy(true, 0);
		try {
			Ktml_object.paste_container.body.innerHTML = retObj.html_content;
			Ktml_object.paste_container.execCommand('SelectAll', false, false);
			Ktml_object.paste_container.execCommand('cut', false, false);
		} catch(e) {}
	} else {
		var oldText = cur_range.htmlText;
		oldText = oldText.replace(/<[pP][^>]*>\s*<br[^>]*[^>]*>\s*<\/[pP]>/gi, '<p>&nbsp;</p>');
		if (oldText == '<P>&nbsp;</P>') {
			oldText = '';
			cur_range.innerHTML = oldText;
		}
		cur_range.pasteHTML(new_html);
	}
	if (Ktml_object.undo) {
		Ktml_object.undo.addEdit();
	}
	Ktml_object.displayChanged();
	return true;
}
// Insert Horizontal Line callback
function hrPropsCallback(data) {
	if (is.ie) Ktml_object.util_restoreSelection(true);
	var sel = Ktml_object.edit.selection;
	if (sel.type == "Text" || sel.type == "None" || sel.type == "Control") {
		var rng = sel.createRange();
		var el = rng.parentElement();
		if (data['align'] == 'default') data['align'] = 'left';
		if (data['noshade'] != 'none') var noShade = 'noshade="noshade"';
		else var noShade = '';
		if (el.tagName.toLowerCase() == 'hr') {
			el.align = data['align'];
			el.color = data['color'];
			if (noShade != '') el.noShade = data['noshade'];
			el.size = data['size'];
			el.title = data['title'];
		} else {
			str = '<hr align="' + data["align"] + '" color="' + data["color"] + '" ' + noShade + ' size="' + data["size"] + '" title="' + data["title"] + '" />';
		}
		if (is.mozilla) {
			var selNode = Ktml_object.logic_getSelectedNode();
			if (selNode.parentNode.children.length == 1 && selNode.parentNode.children[0].nodeName.toLowerCase() == 'br') {
				sel.collapseToEnd();
				Ktml_object.logic_removeTag();
				Ktml_object.logic_removeTag();
				Ktml_object.util_insertTextSel(Ktml_object.edit, str, null);
			} else if (selNode.nodeName.toLowerCase() == 'p') {
				var el = Ktml_object.edit.createElement('hr');
				el.align = data['align'];
				el.color = data['color'];
				if (noShade != '') el.noShade = data['noshade'];
				el.size = data['size'];
				el.title = data['title'];
				utility.dom.insertAfter(el, selNode);
			} else Ktml_object.util_insertTextSel(Ktml_object.edit, str, null);
		} else Ktml_object.insertHTML('</p>' + str);
		Ktml_object.displayChanged();
	} else return false;
}
// Snippets and Insert Character callback
function insertSpecialCallback(c, counter) {
	var _this = ktmls[counter];
	if (is.ie) _this.util_restoreSelection(true);
	var sel = _this.edit.selection;
	if (sel.type == "Text" || sel.type == "None" || sel.type == "Control") {
		if (is.ie) {
			var cut_range = _this.edit.selection.createRange();
			cut_range.pasteHTML(c);
		} else _this.util_insertTextSel(_this.edit, c, null);
		_this.displayChanged();
	}
}
// Foreground Color dialog callback
function forecolorCallback(color, counter) {
	var _this = ktmls[counter];
	if (is.ie) _this.util_restoreSelection(true);
	var sel = _this.edit.selection;
	if (sel.type == "Text" || sel.type == "None") {
		var cur_range = sel.createRange();
		// ensure the selection is still the same
		if (sel.type == "None" || holdForCallback == cur_range.htmlText) _this.edit.execCommand('forecolor', false, color);
	}
	_this.displayChanged();
}
function util_rem_strings(input) {
	var output = input;
	for (var i = 0; i < pasteReplace.length; i++) {
		pairStr = unescape(pasteReplace[i]);
		if (pairStr.length != 0) {
			splitIdx = pairStr.indexOf('~');
			if (splitIdx == -1) {
				searchStr = pairStr;
				replaceStr = '';
			} else {
				searchStr = pairStr.substring(0, splitIdx);
				replaceStr = pairStr.substring(splitIdx + 1);
			}
			searchRE = new RegExp(searchStr, 'gi');
			output = output.replace(searchRE, replaceStr);
		}
	}
	return output;
}
function util_getCleanFunction(clean_type, has_word) {
	has_word = util_defaultValue(has_word, false);
	clean_type = util_defaultValue(clean_type, false);
	if (clean_type) {
		var clean_function = KT_clean_functions[clean_type];
	} else {
		var auto_clean_on_paste = $KTML4_GLOBALS['auto_clean_on_paste'] + '';
		auto_clean_on_paste = (typeof($KTML4_GLOBALS['auto_clean_on_paste']) == 'undefined') ? 'word' : auto_clean_on_paste;
		if (!has_word && auto_clean_on_paste == 'word') {
			auto_clean_on_paste = 'none';
		}
		if (auto_clean_on_paste == 'word' && (pasteRemWord == 0 || pasteRemWord == 3)) {
			auto_clean_on_paste = 'none';
		}
		if (auto_clean_on_paste == 'word') auto_clean_on_paste = 'word_custom';
		var clean_function = KT_clean_functions[auto_clean_on_paste];
	}
	return clean_function;
}
ktml.prototype.util_selectionSplit = function (tagNames, stoppers, select_what) {
	return false;
	tagName = util_defaultValue(tagName, 'P').toLowerCase();
	select_what = util_defaultValue(select_what, 'between').toLowerCase();
	var currentTag = null;
	if (is.mozilla) {
		currentTag = this.cw.getSelection().anchorNode;
	} else {
		currentTag = this.edit.selection.createRange().parentElement();
	}
	var parentTag = utility.dom.getParentByTagName(currentTag, tagName);
	if (!parentTag) {
		return;
	}
	this.insertHTML('<br id="kt_removable">', 'after', false);
	var outer = parentTag.outerHTML;
	var fragments = outer.split(/</);
	var frag = '';
	var where = 'before';
	var sbefore = '';
	var safter = '';
	var starters = [];
	var enders = [];
	var end_done = false;
	for (var i = 0; i < fragments.length; i++) {
		frag = String_trim(fragments[i]);
		if (!frag) {
			continue;
		}
		if (/^br id="?kt_removable"?/i.test(frag)) {
			safter += frag.substring(frag.indexOf(">") + 1);
			where = 'after';
		} else {
			if (where == 'before') {
				if (/^\/+/.test(frag)) {
					starters.pop();
				} else {
					starters.push('<' + frag.substring(0, frag.indexOf('>')) + '>');
				}
				sbefore += '<' + frag;
			} else {
				if (!end_done && /^\/+/.test(frag)) {
					enders.push('<' + frag.substring(0, frag.indexOf('>')) + '>');
				} else {
					end_done = true;
				}
				safter += '<' + frag;
			}
		}
	}
	var unique = this.getUniqueID();
	var signature_html = '<br id="' + unique + '"/>';
	var new_html = '';
	switch (select_what) {
	case 'between':
		sbefore = sbefore + enders.join("") + '</' + tagName + '>';
		sbefore_text = String_trim(sbefore.replace(/(<[^>]*>)/gi, ''));
		if (sbefore_text == '') {
			sbefore = '';
		}
		safter_text = String_trim(safter.replace(/(<[^>]*>)/gi, ''));
		if (safter_text == '') {
			safter = '<' + tagName + '>&nbsp;</' + tagName + '>';
		} else {
			safter = starters.join("") + safter;
		}
		new_html = sbefore + signature_html + safter;
		break;
	case 'second-tag-start':
		sbefore = sbefore + enders.join("") + '</' + tagName + '>';
		safter = starters.join("") + signature_html + safter;
		new_html = sbefore + safter;
		break;
	}
	var insertion_tag = null;
	try {
		parentTag.outerHTML = new_html;
		var insertion_tag = this.edit.getElementById(unique);
		if (insertion_tag) {
			if (is.mozilla) {
				var sel = this.cw.getSelection();
				sel.collapse(insertion_tag, 0);
				var rng = sel.getRangeAt(0);
				rng.setEndBefore(insertion_tag.nextSibling);
			} else {
				var rng = this.edit.body.createTextRange();
				rng.moveToElementText(insertion_tag);
			}
			rng.select();
		}
	}
	catch(err) {}
	return insertion_tag;
};
ktml.prototype.util_selectionInsideTags = function (inside_tags) {
	if (typeof(inside_tags) == "Object") {
		inside_tags = "," + inside_tags.join(",") + ",";
	} else {
		inside_tags = "," + inside_tags + ",";
	}
	var sel = this.edit.selection;
	var rng = sel.createRange();
	var fn = null;
	if (is.ie) {
		if (rng.length) {
			fn = rng.item(0);
		} else {
			fn = rng.parentElement();
		}
	} else {
		fn = rng.commonAncestorContainer;
	}
	while (fn) {
		if (inside_tags.indexOf("," + fn.nodeName.toLowerCase() + ",") >= 0) {
			return fn;
		}
		fn = fn.parentNode;
	}
	return false;
};
ktml.prototype.util_selectionContainsTags = function (forbid_tags) {
	if (typeof(forbid_tags) == "String") {
		forbid_tags = forbid_tags.split(",");
	}
	var sel = this.edit.selection;
	var rng = sel.createRange();
	var selection_html = '';
	if (sel.type == "Control") {
		if (is.ie) {
			selection_html = rng.item(0).outerHTML;
		} else {
			selection_html = rng.startContainer.childNodes[rng.startOffset].outerHTML
		}
	} else {
		selection_html = rng.htmlText;
	}
	var reg = null;
	for (var i = 0; i < forbid_tags.length; i++) {
		reg = new RegExp("<" + forbid_tags[i] + "(?:\\s|\/|>)+", "i");
		if (reg.test(selection_html)) {
			return true;
		}
	}
	return false;
};
ktml.prototype.util_stripTag = function (tag) {
	var iHTML = tag.innerHTML;
	this.util_insertSelectionMark();
	tag.outerHTML = iHTML;
	this.util_removeSelectionMark();
};
ktml.prototype.util_insertSelectionMark = function () {
	var uniqueID = this.getUniqueID();
	this.insertHTML('<span id="' + uniqueID + '" style="display: none;">&nbsp;</span>', "first-node", false);
	this.marker = uniqueID;
};
ktml.prototype.util_removeSelectionMark = function () {
	var marker = this.edit.getElementById(this.marker);
	if (!marker) {
		return;
	}
	var rng = this.edit.selection.createRange();
	marker.style.display = "";
	rng.moveToElementText(marker);
	if (is.mozilla) {
		var ps = marker.previousSibling;
		var psp = 0;
		if (!ps) {
			ps = marker.nextSibling;
		} else {
			psp = ps.nodeValue.length;
			if (marker.nextSibling) {
				if (marker.nextSibling.nodeValue) marker.previousSibling.nodeValue += marker.nextSibling.nodeValue;
				marker.parentNode.removeChild(marker.nextSibling);
			}
		}
	}
	marker.parentNode.removeChild(marker);
	if (is.mozilla && ps) {
		this.edit.selection.collapse(ps, psp);
	} else {
		rng.select();
	}
	this.marker = null;
};
ktml.prototype.ui_logicDoWordFormat = function (cmd, param) {
	if (is.ie) {
		var selType = this.edit.selection.type;
		if (selType == "Control") {
			return false;
		}
		if (cmd == "FontSize" && selType == "Text") {
			var rng = this.edit.selection.createRange();
			var m = -1;
			while (m != 0 && rng.text.replace(/\s*/g, '') != '' && rng.text.match(/\s$/)) {
				m = rng.moveEnd("character", -1);
			}
			rng.select();
		}
		this.edit.execCommand(cmd, false, param);
		return true;
	}
	var selType = this.edit.selection.type;
	if (selType != "None") {
		this.edit.execCommand(cmd, false, param);
		return true;
	}
	var sel = this.edit.selection;
	var rng = this.edit.selection.createRange();
	var sn = rng.startContainer;
	var so = rng.startOffset;
	var en = rng.endContainer;
	var eo = rng.endOffset;
	var st = null;
	var sv = null;
	if (typeof(param) != "undefined") {
		sv = this.edit.queryCommandValue(cmd);
	} else {
		st = this.edit.queryCommandState(cmd);
	}
	var startText = sn.textContent.substring(0, so);
	var endText = en.textContent.substring(eo, en.textContent.length);
	var i = startText.match(/\s?([^\s]*)$/i)[1].length;
	var j = endText.match(/^([^\s]*)\s?/i)[1].length;
	if (i * j != 0) {
		sel.collapse(sn, so - i);
		sel.extend(en, eo + j);
	}
	this.edit.execCommand(cmd, false, param);
	if (i * j == 0) {
		return true;
	}
	this.edit.selection.collapseToEnd();
	var rng = this.edit.selection.createRange();
	if (st || sv) {
		rng.setStart(rng.endContainer, so);
		rng.setEnd(rng.endContainer, eo);
	} else {
		rng.setStart(rng.endContainer, i);
		rng.setEnd(rng.endContainer, i);
	}
	rng.select();
	return true;
};
ktml.prototype.ui_flickerFreeClassSet = function (el, class_name) {
	try {
		if (el.className != class_name) {
			el.className = class_name;
		}
	}
	catch(e) {};
}
ktml.prototype.ui_setButtonState = function () {
	var pbtn, tbtn, cel;
	var qstate;
	var kttype;
	this.displayShouldChange = true;
	for (var i = 0; i < this.toolbar.buttonobjects.length; i++) {
		pbtn = this.toolbar.buttonobjects[i];
		if (pbtn.button_type != "img") {
			continue;
		}
		if (!pbtn.cid && pbtn.name != 'toggle_properties_inspector') {
			continue;
		}
		tbtn = KTStorage.get(pbtn.assoc);
		cel = tbtn.getElement("container");
		try {
			var cmdID = pbtn.cid;
			if (pbtn.name == 'help') {
				if (this.toolbar.getHelpMode()) {
					this.ui_flickerFreeClassSet(cel, "toolbaritem_latched");
				} else {
					this.ui_flickerFreeClassSet(cel, "toolbaritem_flat");
				}
				continue;
			}
			if (this.undo) {
				if (pbtn.name == 'undo') {
					if (this.undo.cursor < 1) {
						this.ui_flickerFreeClassSet(cel, "toolbaritem_disabled");
						tbtn.state = 0;
					} else {
						this.ui_flickerFreeClassSet(cel, "toolbaritem_flat");
						tbtn.state = 1;
					}
					continue;
				}
				if (pbtn.name == 'redo') {
					if (this.undo.cursor == (this.undo.edits.length - 1)) {
						this.ui_flickerFreeClassSet(cel, "toolbaritem_disabled");
						tbtn.state = 0;
					} else {
						this.ui_flickerFreeClassSet(cel, "toolbaritem_flat");
						tbtn.state = 1;
					}
					continue;
				}
			}
			if (pbtn.name == 'toggle_properties_inspector') {
				if (this.ui.pi) {
					this.ui_flickerFreeClassSet(cel, "toolbaritem_latched");
					tbtn.state = 2;
				} else {
					this.ui_flickerFreeClassSet(cel, "toolbaritem_flat");
					tbtn.state = 1;
				}
				continue;
			}
			if (pbtn.name == 'toggle_fullscreen') {
				if (this.fullScreenState) {
					this.ui_flickerFreeClassSet(cel, "toolbaritem_latched");
					tbtn.state = 2;
				} else {
					this.ui_flickerFreeClassSet(cel, "toolbaritem_flat");
					tbtn.state = 1;
				}
				continue;
			}
			if (is.ie) {
				qstate = this.edit.queryCommandSupported(cmdID);
				qvalue = this.edit.queryCommandState(cmdID);
				if (qstate == false) {
					if (qvalue == true) {
						this.ui_flickerFreeClassSet(cel, "toolbaritem_latched");
						tbtn.state = 2;
					} else {
						this.ui_flickerFreeClassSet(cel, "toolbaritem_flat");
						tbtn.state = 0;
					}
				} else {
					if (qvalue == true) {
						this.ui_flickerFreeClassSet(cel, "toolbaritem_latched");
						tbtn.state = 2;
					} else {
						this.ui_flickerFreeClassSet(cel, "toolbaritem_flat");
						tbtn.state = 1;
					}
				}
			} else {
				qstate = this.edit.queryCommandState(cmdID.toLowerCase());
				if (",bold,italic,".indexOf("," + cmdID.toLowerCase() + ",") >= 0) {
					var snode = this.logic_getSelectedNode();
					if (snode)
					{
						var current_tag = snode.tagName.toLowerCase();
						if (current_tag == 'strong' && cmdID.toLowerCase() == 'bold') qstate = true;
						if (current_tag == 'em' && cmdID.toLowerCase() == 'italic') qstate = true;
					}
				}
				if (qstate == false) {
					this.ui_flickerFreeClassSet(cel, "toolbaritem_flat");
					tbtn.state = 1;
				} else {
					this.ui_flickerFreeClassSet(cel, "toolbaritem_latched");
					tbtn.state = 2;
				}
			}
		}
		catch(e) {
			if (pbtn.name == 'help') {
				if (this.toolbar.getHelpMode()) {
					this.ui_flickerFreeClassSet(cel, "toolbaritem_latched");
				} else {
					this.ui_flickerFreeClassSet(cel, "toolbaritem_flat");
				}
			} else if (pbtn.name == "toggle_visible") {
				if (this.viewInvisibles) {
					this.ui_flickerFreeClassSet(cel, "toolbaritem_latched");
					tbtn.state = 2;
				} else {
					this.ui_flickerFreeClassSet(cel, "toolbaritem_flat");
					tbtn.state = 1;
				}
			} else {
				this.ui_flickerFreeClassSet(cel, "toolbaritem_flat");
				tbtn.state = 1;
			}
		}
	}
	this.ui_updateFontFace();
	this.ui_updateFontSize();
	this.ui_updateBlockFormat();
	this.logic_updateDOMHierarchy(true, 0);
	try {
		if (this.inspectedNode) var MediaType = (this.inspectedNode.getAttribute("for") + "").toLowerCase();
		else var MediaType = "none";
	}
	catch(e) {
		var MediaType = "none";
	}
	if (is.mozilla && ",flashmovie,windowsmedia,".indexOf(MediaType) >= 0) {
		window.setTimeout("ktmls[" + this.counter + "].runHooks('onupdatebuttonstate')", 100);
	} else {
		this.runHooks('onupdatebuttonstate');
	}
};
ktml.prototype.ui_updateFontFace = function () {
	var btn;
	if (btn = this.toolbar.font_type) {
		btn = KTStorage.get(btn);
		var fontname = null;
		fontname = this.edit.queryCommandValue(KtmlGetCommand('fontname'));
		if (fontname) {
			fontname = fontname.toLowerCase();
		}
		if (fontname == '' && is.mozilla) {
			try {
				var thisSel = this.cw.getSelection();
				if (thisSel)
					var isSpan = thisSel.anchorNode.parentNode;
				else
					isSpan = null;	
			}
			catch(e) {
				var isSpan = null;
			}
			if (isSpan && isSpan.style) {
				try {
					fontname = isSpan.style.fontFamily.toLowerCase();
				}
				catch(e) {
					fontname = '';
				}
			}
		}
		if ((fontname != "") && (fontname != null)) {
			fcreatenew = true;
			var str = "/" + fontname + "/i";
			for (i = 0; i < btn.options.length; i++) {
				var nm = new String(btn.options[i].value);
				if (nm == fontname || nm.match(str) || (nm.toLowerCase().indexOf(fontname.toLowerCase()) != -1)) {
					btn.pickValue(i);
					fcreatenew = false;
					break;
				}
			}
			if (fcreatenew && false) {
				var ooption = document.createElement("OPTION");
				btn.options.add(ooption);
				ooption.text = fontname;
				ooption.name = fontname;
				ooption.value = fontname;
				ooption.selected = true;
				if (btn.obj) {
					btn.add(fontname, '<font face="' + fontname + '">' + fontname + '</font>');
				}
			}
		} else {
			btn.pickValue(0);
		}
	}
	return true;
};
ktml.prototype.ui_updateFontSize = function () {
	var btn;
	if (! (btn = this.toolbar.font_size)) {
		return;
	}
	btn = KTStorage.get(btn);
	var fs = "";
	if (is.mozilla) {
		try {
			fs = this.edit.queryCommandValue(KtmlGetCommand('fontsize'));
		}
		catch(e) {
			fs = "";
		}
	} else {
		try {
			var sel = this.edit.selection;
			var selRange = sel.createRange();
			if (sel.type == "Text") {
				var obj = utility.dom.getParentByTagName(selRange.parentElement(), "font");
				if (obj == null) {
					fs = "";
				} else {
					var sizeAttribute = obj.getAttribute("SIZE");
					if (sizeAttribute) {
						if (sizeAttribute == "+0") {
							fs = "";
						} else {
							fs = sizeAttribute;
						}
					} else {
						fs = "";
					}
				}
			} else {
				fs = "";
			}
		}
		catch(e) {
			fs = "";
		}
	}
	for (var i = 0; i < btn.options.length; i++) {
		if (btn.options[i].value == fs) {
			btn.pickValue(i);
			return;
		}
	}
	btn.pickValue(0);
};
ktml.prototype.ui_updateBlockFormat = function () {
	var btn;
	if (! (btn = this.toolbar.blockformat)) {
		return;
	}
	btn = KTStorage.get(btn);
	try {
		fs = this.edit.queryCommandValue(KtmlGetCommand('blockfmt'));
		if (is.ie) {
			var tmpprss = this.logic_getSelectedNode();
			if (tmpprss.tagName == "P") {
				fs = 'p';
			}
		}
	}
	catch(e) {
		fs = "";
	}
	if (fs == "Normal" || fs == "") {
		var sn = this.logic_getSelectedNode();
		var additionalFormattingTagNames = "div";
		additionalFormattingTagNames = "^" + additionalFormattingTagNames.toUpperCase().split(",").join("$|^") + "|";
		var lo = sn;
		if (!lo) return true;
		while (lo.tagName && lo.tagName != "BODY" && (m = lo.tagName.match(additionalFormattingTagNames))) {
			fs = m;
			break;
			lo = lo.parentNode;
			if (!lo) continue;
		}
	}
	if (fs != null && fs != "") {
		fsval = '<' + fs + '>';
		for (var i = 0; i < btn.options.length; i++) {
			var it = btn.options[i].text;
			if (it.indexOf(fs) != -1 || btn.options[i].value == fsval || it == fs) {
				btn.pickValue(i);
				break;
			}
		}
	} else {
		btn.pickValue(0);
	}
	return true;
};
ktml.prototype.logic_togglePIDisplay = function () {
	var doShow = this.ui.pi ? false : true;
	this.swapToMode = this.displayMode;
	this.ui.pi = doShow;
	this.collapse(true);
	this.myCustomResize(this.config_var.width, this.config_var.height);
	this.ui_setButtonState();
	return true;
};
ktml.prototype.logic_snippetOnClick = function () {
	var sel = this.edit.selection;
	this.util_saveSelection();
	//alert (sel.type);
	if (sel.type == "Text" || sel.type == "None" || sel.type == "Control") {
		// invoke snippet dialog
		var strurlstring = jsDlgLoader + '?csModule=dhtmledit/insert-snippet&pageid=' + jspageid + '&ktmlFrameName=' + jsFrameName;
		newWindow('cpinsertspecial', strurlstring + '&counter=' + this.counter);
	}
};
ktml.prototype.logic_hrOnClick = function () {
	var sel = this.edit.selection;
	this.util_saveSelection();
	if (sel.type == "Text" || sel.type == "None" || sel.type == "Control") {
		var rng = sel.createRange();
		var el = rng.parentElement();
		var clsname = '';
		var align = 'left';
		var color = '#000000';
		var noshade = true;
		var size = 1;
		var title = '';
		if (el.tagName.toLowerCase() == 'hr') {
			clsname = el.className;
			align = el.align;
			color = el.color;
			noshade = el.noShade;
			size = el.size;
			title = el.title;
		}
		var strurlstring = jsDlgLoader + '?csModule=dhtmledit/hr-prop&pageid=' + jspageid + '&controlid=' + jscontrolid + '&clsname=' + clsname + '&align=' + align + '&color=' + escape(color) + '&ktmlFrameName=' + jsFrameName + '&noshade=' + noshade + '&size=' + size + '&title=' + title;
		newWindow('cpinserthr', strurlstring + '&counter=' + this.counter);
	} else return false;
};
ktml.prototype.logic_openCSColorPalette = function (type, ignore) {
	var sel = cur_range = curcolor = null;
	try {
		sel = this.edit.selection;
	}
	catch(err) {}
	this.util_saveSelection();
	holdForCallback = '';
	if (type == 'f') { //forground color
		cur_range = this.edit.selection.createRange();
		holdForCallback = cur_range.htmlText;
		curcolor = this.edit.queryCommandValue('forecolor');
		curcolor = escape(utility.math.intbgr2hexrgb(curcolor));
		if (this.edit.selection.type == "Text" || this.edit.selection.type == "None") newWindow('colors', jsDlgLoader + '?csModule=dlgcontrols/ct-color-palette&color=' + curcolor + '&ktmlFrameName=' + jsFrameName + '&callback=forecolorCallback&counter=' + this.counter);
		return true;
	}
	if (type == 'b') { //background color
		if (sel) {
			// Begin: FIX (Issue 3513) -- Part 1 of 1.
			// New code: Proceed only if a selection has been made.
			if (sel.type == "None" && !ignore) {
				alert('A background color can only be applied to selected text. Please select the desired text and re-try.');
				return;
			}
			// End: FIX (Issue 3513) -- Part 1 of 1.		
			cur_range = this.edit.selection.createRange();
			holdForCallback = cur_range.htmlText;
			if (this.selectableNodes && this.selectableNodes[0]) {
				if (this.selectableNodes && this.selectableNodes.length) {
					for (var i = 0; i < this.selectableNodes.length; i++) {
						if ((this.selectableNodes[i]).currentStyle != 'undefined') curcolor = (this.selectableNodes[i]).currentStyle;
						else if (window.getComputedStyle) curcolor = document.defaultView.getComputedStyle(this.selectableNodes[i], '').getPropertyValue("background-color");
						else curcolor = (this.selectableNodes[i]).style;
						if (curcolor != 'transparent') break;
						curcolor = null;
					}
				}
			}
			if (!curcolor) curcolor = 'rgb(255,255,255)';
			curcolor = escape(utility.math.intbgr2hexrgb(curcolor));
			newWindow('colors', jsDlgLoader + '?csModule=dlgcontrols/ct-color-palette&color=' + curcolor + '&ktmlFrameName=' + jsFrameName + '&callback=backcolorCallback&counter=' + this.counter);
		}
	}
};
ktml.prototype.logic_doClean = function (type, node, rng) {
	node = util_defaultValue(node, null);
	rng = util_defaultValue(rng, false);
	if (this.displayMode == "CODE") {
		return false;
	}
	var was_invisibles = false;
	if (this.viewInvisibles) {
		was_invisibles = true;
		this.logic_toggleInvisibles();
	}
	var clean_func = null;
	switch (type) {
	case "all":
		clean_func = util_cleanAllTags;
		break;
	case "word":
		clean_func = util_cleanHTMLContent;
		break;
	case "word_custom":
		clean_func = util_cleanHTMLContentCustom;
		break;
	case "formatting":
		clean_func = util_cleanFormattingTags;
		break;
	case "css":
		clean_func = util_cleanCSSStyles;
		break;
	case "script":
		clean_func = util_cleanScriptTags;
		break;
	case "classes":
		clean_func = util_cleanCSSClasses;
		break;
	case "fonts":
		clean_func = util_cleanFontTags;
		break;
	default:
		return;
		break;
	}
	var tmp = "", tmp2 = "";
	if (!node) {
		var sel = this.edit.selection;
		if (!rng && sel.type == 'None' && (is.mozilla && sel.isCollapsed || is.ie)) {
			var sl = this.edit.selection.createRange();
			var uniqueID = this.getUniqueID();
			sl.pasteHTML('<u id="' + uniqueID + '"></u>');
			tmp = this.getPlainSource();
			if (is.mozilla) tmp = util_removeSiteNameFromHTMLForPaste(Ktml_object, clean_func(tmp));
			else tmp = clean_func(tmp);
			this.edit.body.innerHTML = util_plain2translated(tmp, this.counter);
			var sel = this.edit.getElementById(uniqueID);
			if (sel) {
				sl.moveToElementText(sel);
				sel.parentNode.removeChild(sel);
				sl.select();
			}
			this.logic_updateDOMHierarchy(true, 0);
		} else {
			if (sel.focusNode && sel.focusNode.nodeName == 'BODY') {
				sel.selectAllChildren(sel.focusNode);
				rng = sel.getRangeAt(0);
			}
			if (!rng) {
				this.makeValidSelection();
				rng = this.edit.selection.createRange();
			}
			if ((is.mozilla && rng.startContainer.nodeName != 'HTML') || is.ie) {
				var html = rng.htmlText;
				if (is.mozilla) tmp2 = util_removeSiteNameFromHTMLForPaste(Ktml_object, clean_func(rng.htmlText));
				else tmp2 = clean_func(rng.htmlText);
				rng.pasteHTML(tmp2);
				if (is.mozilla) {
					try {
						rng = sel.getRangeAt(0);
						rng.select();
					}
					catch(err) {}
				}
			}
		}
	} else {
		tmp = util_translated2plain(node.innerHTML);
		if (is.mozilla) tmp2 = util_removeSiteNameFromHTMLForPaste(Ktml_object, clean_func(tmp));
		else tmp2 = clean_func(tmp);
		try {
			node.outerHTML = util_plain2translated(tmp2, this.counter);
		}
		catch(e) {}
		if (node && node.nodeType == 1) {
			try {
				var rng = this.edit.body.createTextRange();
				rng.moveToElementText(node);
				rng.collapse(false);
				rng.select();
			}
			catch(e) {}
		}
	}
	if (was_invisibles) {
		this.logic_toggleInvisibles();
	}
	if (this.undo) {
		this.undo.addEdit();
	}
};
ktml.prototype.runHooks = function (hookName) {
	var args = [];
	for (var i = 1; i < ktml.prototype.runHooks.arguments.length; i++) {
		args.push(ktml.prototype.runHooks.arguments[i]);
	}
	for (var i = 0; i < this.hooks[hookName].length; i++) {
		var hook = this.hooks[hookName][i];
		hook.apply(this, args);
	}
};
ktml.prototype.hndlr_onmouseover = function (e) {
	this.runHooks('onmouseover', e);
};
ktml.prototype.invalidate = function () {
	this.readyForSave = false;
};
ktml.prototype.displayChanged = function () {
	this.displayShouldChange = true;
	if (this.MediaPlayer) {
		this.MediaPlayer.stop();
		return;
	}
	if (this.displayShouldChange) {
		if (this.config.hideToolbarTag) {
			this.showToolbar();
		}
		this.invalidate();
		if (this.displayMode != "CODE") {
			this.ui_setButtonState();
		} else {
			this.taginspector.innerHTML = "";
		}
		this.displayShouldChange = false;
	} else {}
};
wait_displayChanged = function (obj, event) {
	if (window['ktml_displayChanged_timeout']) {
		clearTimeout(window['ktml_displayChanged_timeout']);
	}
	window['ktml_displayChanged_timeout'] = setTimeout("window['ktml_" + obj.name + "'].displayChanged();", 200);
};
function HandleOutgoingText(ktml, str2) {
	var str2 = str2 || ktml.getPlainSource();
	if (is.mozilla) str2 = util_removeSiteNameFromHTMLForPaste(ktml, str2);
	str2 = util_removeSiteNameFromHTML(ktml, str2);
	str2 = str2.replace(/(src="?[^\"]+)\?size=\d*("?)/ig, '$1$2');
	str2 = str2.replace(/(background-image:\s*url\([^\)]+)\?size=\d*\)/ig, '$1)');
	str2 = str2.replace(/\skt_onclick=/ig, ' onclick=');
	if (is.ie) {
		str2 = str2.replace(/(<(?:td|th)[^>]*?)\svalign=("?)center/ig, '$1 valign=$2middle');
		str2 = str2.replace(/(<(?:td|th)[^>]*?)\salign=("?)middle/ig, '$1 align=$2center');
	}
	str2 = ktml.replaceTags(str2);
	str2 = String_trim(str2);
	regexp = "[\s\n]*<p[^>]*>\s*<br[\s]*[\/]*>[\s\n]*<\/p>[\s\n]*/gi";
	str2 = str2.replace(regexp, '<p>&nbsp;</p>');
	str2 = str2.replace(/[\s\n]*<p[^>]*>\s*<br[^>]*ktml_hidden ktml_selstart[^>]*>[\s\n]*<\/p>[\s\n]*/gi, '');
	str2 = str2.replace(/\s*<br[^>]*ktml_hidden ktml_selstart[^>]*>[\s\n]*/gi, '');
	str2 = str2.replace(/[\s\n]*<p[^>]*>\s*<br[^>]*ktml_hidden ktml_selend[^>]*>[\s\n]*<\/p>[\s\n]*/gi, '');
	str2 = str2.replace(/<br[^>]*ktml_hidden ktml_selend[^>]*>/gi, '');
	str2 = str2.replace(/<!--SCRIPT_TRANSLATOR<script/gi, '<script');
	str2 = str2.replace(/<\/script>SCRIPT_TRANSLATOR-->/gi, '</script>');
	str2 = str2.replace(/<p[^>]*>\s*<br[^>]*[^>]*>\s*<\/p>/gi, '<p>&nbsp;</p>');
	str2 = str2.replace(/<li[^>]*>[\s\n]*<br[^>]*[^>]*>[\s\n]*<\/li>/gi, '');
	return str2;
};
function HandleIncomingText(ktml, str, mode, obj) {
	if (typeof obj != "undefined") {
		str = obj.getPlainSource();
	}
	if (is.mozilla) str = util_removeSiteNameFromHTMLForPaste(ktml, str);
	str = util_removeSiteNameFromHTML(ktml, str);
	str = str.replace(/(src="?[^\"]+)\?size=\d*("?)/ig, '$1$2');
	str = str.replace(/(background-image:\s*url\([^\)]+)\?size=\d*\)/ig, '$1)');
	str = str.replace(/\skt_onclick=/ig, ' onclick=');
	str = String_trim(str);
	if (str == '' || str.match(/^<br\s*\/?>$/i)) {
		str = "<p>&nbsp;</p>";
	}
	return str;
};
function util_removeSiteNameFromHTMLForDandD(ktml, wrgLink, wrgID) {
	if (wrgID) {
		var clnLink, clnID;
		var re = new RegExp(/<([a-z]+)([^>]+)>/gi);
		var re1 = new RegExp(/\s(id)\s*=\s*\"?([^\"]*)"?/gi);
		var re2 = new RegExp(/\s(src|href)\s*=\s*\"?([^\"]*)"?/gi);
		var clnSourceArr = (ktml.clean_paste_container.body.innerHTML).match(re);
		if (clnSourceArr) {
			for (var j = 0; j < clnSourceArr.length; j++) {
				clnLink = clnSourceArr[j];
				clnID = clnLink.match(re1)[0].replace(re1, '$2');
				if (clnID) {
					if (clnID.length && clnID == wrgID) {
						wrgLink = clnLink.match(re2)[0].replace(re2, '$2');
						return wrgLink;
					}
				}
			}
		}
		return wrgLink;
	}
};
function util_removeSiteNameFromHTMLForPaste(ktml, html) {
	if (blank_location != "") {
		var re = new RegExp(/<([a-z]+)([^>]+)>/gi);
		var re1 = new RegExp(/\s(id)\s*=\s*\"?([^\"]*)"?/gi);
		var re2 = new RegExp(/\s(src|href)\s*=\s*\"?([^\"]*)"?/gi);
		var clnSourceArr = (ktml.clean_paste_container.body.innerHTML).match(re);
		var wrgSourceArr = html.match(re);
		var wrgLink, wrgLink2, clnLink, wrgID, clnID, wrgSrc, clnSrc;
		if (wrgSourceArr && clnSourceArr) {
			for (var i = 0; i < wrgSourceArr.length; i++) {
				wrgLink = wrgSourceArr[i];
				wrgLink2 = wrgLink;
				wrgID = wrgLink.match(re1);
				if (wrgID) {
					for (var j = 0; j < clnSourceArr.length; j++) {
						clnLink = clnSourceArr[j];
						clnID = clnLink.match(re1);
						if (clnID) {
							if (clnID.length && clnID[0] == wrgID[0]) {
								clnSrc = clnLink.match(re2);
								if (clnSrc) {
									wrgLink = wrgLink.replace(/\s(src|href)\s*=\s*\"?([^\"]*)"?/gi, clnSrc[0]);
									html = html.replace(wrgLink2, wrgLink);
								}
							}
						}
					}
				}
			}
		}
	}
	return html;
};
function util_removeSiteNameFromHTML(ktml, html) {
	if (blank_location != "") {
		html = html.replace(/<([a-z]+)([^>]+)>/gi, function (a, b, c) {
			return '<' + b + c.replace(/\s(src|href)\s*=\s*\"?([^\"]*)"?/gi, function (a, b, c) {
				return ' ' + b + '="' + encodeURI(decodeURI(util_removeSiteNameFromHREF(ktml, c))) + '"';
			}) + '>';
		});
		html = html.replace(/<([a-z]+)([^>]+)>/gi, function (a, b, c) {
			return '<' + b + c.replace(/(background-image:\s*url\s*\(([^\(]*)\))/gi, function (a, b, c) {
				return 'background-image:url(' + encodeURI(decodeURI(util_removeSiteNameFromHREF(ktml, c))) + ')';
			}) + '>';
		});
	}
	return html;
};
function util_removeSiteNameFromHREF(ktml, href, showIT) {
	var tmp_href, tmp_href2;
	if (!ktml) ktml = this;
	if (blank_location == "" || !href) {
		return href;
	}
	var blank_common = blank_location.pathname.substring(blank_location.ktml_root.length);
	var unescapedhref = unescape(unescape(unescape(String_htmldecode(href))));
	var unescapedpart = unescapedhref.substring(unescapedhref.indexOf('editor&frameName'));
	if (unescapedpart.length) {
		unescapedpart = unescapedpart.slice(0, unescapedpart.indexOf('#'));
		if ((blank_location.frame_src).indexOf(unescapedpart) >= 0 && unescapedhref.indexOf('editor&frameName=') >= 0 && unescapedhref.indexOf('#') >= 0) return href.substring(href.indexOf('#'));
	}
	if (is.mozilla) {
		if (ktml && /(\.\.\/){3}/.test(href)) {
			var j = 0;
			for (var i = 15; i >= 3; i--) {
				j = i + 1;
				reg = new RegExp("(\.\.\/){" + i + "," + j + "}");
				if (reg.test(href)) {
					k = (i <= 4) ? i : i - 1;
					href = href.substring(k * 3);
					break;
				}
			}
			href = ktml_location.full + blank_common + href;
		} else if (href.indexOf("/") != 0 && href.indexOf(ktml_location.server) == -1 && !/^[a-zA-Z]+:/.test(href)) {
			href = ktml_location.full + blank_common + href;
		}
		var tmp_href = ktml_location.server;
		while (/\/[^\/]*\/\.\./.test(href)) {
			if (href.indexOf(tmp_href) == 0) href = href.substring(tmp_href.length);
			href = href.replace((new RegExp("\\/[^\\/]*\\/\\.\\.\\/")), '/');
		}
	}
	if (href.indexOf(ktml_location.server) == 0) {
		tmp_href = href.substring(ktml_location.server.length);
		if (tmp_href && tmp_href != "/") {
			href = tmp_href;
		} else {
			return href;
		}
	}
	if (/^[a-zA-Z]+:/.test(href)) {
		return href;
	}
	var updir = 0;
	var spl1 = blank_common.split(new RegExp("\\/", "gi"));
	var spl2 = href.replace(/^\//, '').split(new RegExp("\\/", "gi"));
	var i = 0;
	for (j = 0; j < Math.min(spl1.length, spl2.length); j++) {
		if (spl1[j] != spl2[j]) {
			break;
		}
		i += spl1[j].length + 1;
	}
	var trail = href.substring(i);
	if (/blank\.html#/.test(trail)) {
		trail = trail.substring(trail.indexOf('#'));
	}
	if (i > 0) {
		updir = blank_common.substring(i);
		updir = updir.split("/").length;
		if (updir > 1) {
			var s = '';
			for (var j = 1; j < updir; j++) {
				s += '../';
			}
			trail = s + trail;
		}
	} else {
		if (trail.indexOf("/") < 0) {} else if (trail.indexOf("/") != 0) {
			trail = blank_location.ktml_root + trail;
		}
	}
	href = trail;
	// do we still need this part ??
	var hrefTemp = unescape(unescape(unescape(String_htmldecode(href))));
	if (hrefTemp.indexOf(blank_location.frame_src) == 0) {
		href = hrefTemp.substring(blank_location.frame_src.length);
	}
	if (href.indexOf(blank_location.ktml_root + '#') == 0) {
		href = href.substring(blank_location.ktml_root.length);
	}
	if (!ktml.config_var.strip_server_location) {
		if (href.indexOf("/") == 0) {
			href = ktml_location.server + href;
		} else {
			if (updir > 1) {
				var spl = blank_location.ktml_root.split("/");
				href = blank_location.ktml_root + href;
				for (var j = 0; j < spl.length - 1; j++) {
					href = href.replace((new RegExp("\\/[^\\/]*\\/\\.\\.\\/", "i")), '/');
				}
				href = ktml_location.server + href;
			} else {
				href = ktml_location.server + blank_location.ktml_root + href;
			}
		}
	}
	return href;
};
function util_setGlobalLocationVars() {
	if (ktml_location == "") {
		ktml_location = {};
		if (/includes\/ktm\/core\/htm\/full.html/i.test(window.location.pathname)) {
			var loca = opener.location;
		} else {
			var loca = window.location;
		}
		var colons = loca.port ? ":" : "";
		ktml_location.pathname = (loca.pathname + "").replace(/[^\/]*$/, '');
		ktml_location.server = loca.protocol + "//" + loca.hostname + colons + loca.port;
		ktml_location.site = ktml_location.server + jsSiteURL;
		ktml_location.full = ktml_location.server + jsSubsiteURL;
	}
};
var ktml_location = '';
ktml.prototype.addTagReplacementRule = function (tagRuleName, sTagName, sTagRule) {
	this.tagReplacementRules[tagRuleName] = {
		tagName: sTagName,
		tagRule: sTagRule
	};
};
ktml.prototype.replaceTags = function (string) {
	// Begin: FIX (Issue 3053) -- Part 1 of 1.
	// Old code:		 
	// var allowed_empty_tags=['td','th','a','embed','noembed','iframe'];
	// New code:
	var allowed_empty_tags = ['td', 'th', 'a', 'embed', 'noembed', 'iframe', 'br', 'div', 'script', 'link'];
	// End: FIX (Issue 3053) -- Part 1 of 1.
	var re1 = '<(' + allowed_empty_tags.join('|') + ')';
	var re2 = '<z(' + allowed_empty_tags.join('|') + ')';
	var preserve_tags_re = new RegExp(re1, "gi");
	var restore_tags_re = new RegExp(re2, "gi");
	string = string.replace(preserve_tags_re, "<z$1");
	while (/<([a-zA-Z0-9]+)[^>]*>[\s\r\n]*<\/\1>/.test(string)) {
		string = string.replace(/<([a-zA-Z0-9]+)[^>]*>[\s\r\n]*<\/\1>/gi, '');
	}
	string = string.replace(restore_tags_re, "<$1");
	var sRuleName = '';
	var oRule = null;
	for (sRuleName in this.tagReplacementRules) {
		oRule = this.tagReplacementRules[sRuleName];
		if (oRule.tagRule == "striptagandcontent") {
			string = string.replace(new RegExp("<(?:" + oRule.tagName + ")[^>]*>", "gi"), '<!--STRIP');
			string = string.replace(new RegExp("<\/?(?:" + oRule.tagName + ")>", "gi"), 'STRIP-->');
			string = string.replace(/<!--STRIP(?:[\w\W\s\r\n]*?)STRIP-->/gi, '');
		} else if (oRule.tagRule == "striptag") {
			string = string.replace(new RegExp("<(?:" + oRule.tagName + ")[^>]*>", "gi"), "");
			string = string.replace(new RegExp("<\/" + oRule.tagName + ">", "gi"), "");
		} else {
			string = string.replace(new RegExp("<" + oRule.tagName + "( |>){1}", "gi"), "<" + oRule.tagRule + "$1");
			string = string.replace(new RegExp("<\/" + oRule.tagName + ">", "gi"), "</" + oRule.tagRule + ">");
		}
	}
	if (this.allowed_tags_list) {
		var tag_split = /<\/?([a-z]*)[^>]*>/gi;
		var allowed_tags_list = "," + this.allowed_tags_list.join(",") + ",";
		string = string.replace(tag_split, function (a, tag_name, c) {
			if (allowed_tags_list.indexOf("," + tag_name.toLowerCase() + ",") == -1) {
				return '';
			}
			return a;
		});
	}
	return string;
};
ktml.prototype.logic_recCommand = function (cmd, param1, param2) {
	var tmpcont = this.getPlainSource();
	var i = 0;
	do {
		if (this.edit.execCommand(cmd, param1, param2)) {
			i++;
		} else {
			break;
		}
		var str = this.getPlainSource();
		if (str != tmpcont || i >= 101) {
			break;
		}
	}
	while (1);
};
// reverting back to original KTML function.  
ktml.prototype.getPlainSource = function () {
	var text_content = '';
	var html_content = this.edit.body.innerHTML;
	if (is.ie) {
		text_content = this.edit.body.innerText;
	} else {
		text_content = this.edit.body.textContent;
	}
	text_content = String_trim(text_content);
	var str2 = '';
	if (text_content == "") {
		var dont_strip = /<(?:img|table|hr|a|fieldset|form|input|button|textarea|select|object|embed|script|iframe)/i;
		if (dont_strip.test(html_content)) {
			str2 = util_translated2plain(html_content);
		}
	} else {
		str2 = util_translated2plain(html_content);
	}
	// strip all empty spaces between tags ex.<tr>and <td> tag.
	// 29/apr/08 Surya: commented the following line of code as problem is elsewhere. 
	//str2=str2.replace(/>[\s]*/gi,'>');
	if (String_trim(str2) == "") {
		return '';
	} else {
		return str2;
	}
};
ktml.prototype.logic_toggleInvisibles = function () {
	var tdarr, j;
	var sw = false;
	if (this.viewInvisibles != null) {
		sw = this.viewInvisibles;
	}
	this.viewInvisibles = !sw;
	this.utils_setInvisibles(sw);
};
ktml.prototype.utils_setInvisibles = function (flag) {
	var tarr = this.edit.getElementsByTagName("TABLE");
	for (var i = 0; i < tarr.length; i++) {
		if (!flag && (!tarr[i].getAttribute("KT_modified") || tarr[i].getAttribute("KT_modified") == "0") && (!tarr[i].border || tarr[i].border == 0 || tarr[i].border == null)) {
			this.utils_makeTableCallback(tarr[i], this.utils_makeOutline);
		} else if (flag) {
			this.utils_makeTableCallback(tarr[i], this.utils_unmakeOutline);
		}
	}
};
ktml.prototype.utils_makeTableCallback = function (t, fun) {
	var tdarr, j;
	tdarr = t.getElementsByTagName("TD");
	for (j = 0; j < tdarr.length; j++) {
		if (utility.dom.getParentByTagName(tdarr[j], 'TABLE') == t) {
			fun(tdarr[j]);
		}
	}
	fun(t);
};
ktml.prototype.utils_makeOutline = function (t) {
	t.setAttribute("KT_modified", "1");
	var borders = ["Top", "Right", "Bottom", "Left"];
	var brd, brds, brdc, brdw, bs, bc, bw, bs2, bc2, bw2, attr;
	var matr = {};
	for (var i = 0; i < borders.length; i++) {
		brd = borders[i];
		brds = is.ie ? "border" + brd + "Style" : "border-" + brd + "-style";
		brdc = is.ie ? "border" + brd + "Color" : "border-" + brd + "-color";
		brdw = is.ie ? "border" + brd + "Width" : "border-" + brd + "-width";
		try {
			bs = utility.dom.getStyleProperty(t, brds);
		}
		catch(e) {};
		try {
			bc = utility.dom.getStyleProperty(t, brdc);
		}
		catch(e) {};
		try {
			bw = utility.dom.getStyleProperty(t, brdw);
		}
		catch(e) {};
		bs2 = t.style[brds];
		bc2 = t.style[brdc];
		bw2 = t.style[brdw];
		if (bs == "" || bs == "none" || bc == "" || bw == "0px" || bw == "") {
			matr["border" + brd] = "1px dashed black";
			t.setAttribute("KT_rem" + brd, "1");
			if (bs != bs2) {
				t.setAttribute("KT_rem" + brd + "Style", "1");
			} else if (bs2) {
				t.setAttribute("KT_add" + brd + "Style", bs2);
			}
			if (bw != bw2) {
				t.setAttribute("KT_rem" + brd + "Width", "1");
			} else if (bw2) {
				t.setAttribute("KT_add" + brd + "Width", bw2);
			}
			if (bc != bc2) {
				t.setAttribute("KT_rem" + brd + "Color", "1");
			} else if (bc2) {
				t.setAttribute("KT_add" + brd + "Color", bc2);
			}
		}
	}
	for (var i = 0; i < borders.length; i++) {
		brd = "border" + borders[i];
		if (matr[brd]) {
			t.style[brd] = matr[brd];
		}
	}
};
ktml.prototype.utils_unmakeOutline = function (t) {
	if (t.getAttribute("KT_modified") && (t.getAttribute("KT_modified") == 1)) {
		t.removeAttribute("KT_modified");
		var borders = ["Top", "Right", "Bottom", "Left"];
		var brd, addw, addc, adds;
		for (var i = 0; i < borders.length; i++) {
			brd = borders[i];
			if (t.getAttribute("KT_rem" + brd)) {
				t.style["border" + brd] = "";
				t.removeAttribute("KT_rem" + brd);
			}
			if (t.getAttribute("KT_rem" + brd + "Style")) {
				t.style["border" + brd + "Style"] = "";
				t.removeAttribute("KT_rem" + brd + "Style");
			}
			if (t.getAttribute("KT_rem" + brd + "Width")) {
				t.style["border" + brd + "Width"] = "";
				t.removeAttribute("KT_rem" + brd + "Width");
			}
			if (t.getAttribute("KT_rem" + brd + "Color")) {
				t.style["border" + brd + "Color"] = "";
				t.removeAttribute("KT_rem" + brd + "Color");
			}
			addw = t.getAttribute("KT_add" + brd + "Width");
			if (addw) {
				t.style["border" + brd + "Width"] = addw;
				t.removeAttribute("KT_add" + brd + "Width");
			}
			addc = t.getAttribute("KT_add" + brd + "Color");
			if (addc) {
				t.style["border" + brd + "Color"] = addc;
				t.removeAttribute("KT_add" + brd + "Color");
			}
			adds = t.getAttribute("KT_add" + brd + "Style");
			if (adds) {
				t.style["border" + brd + "Style"] = adds;
				t.removeAttribute("KT_add" + brd + "Style");
			}
		}
	}
};
ktml.prototype.logic_InsertHeading = function (hName) {
	if (hName != '') {
		if (is.mozilla) {
			hName = hName.replace(/[<>]/gi, "");
		}
		this.edit.execCommand(KtmlGetCommand('blockfmt'), false, hName);
	} else {
		// issue 3142
		// modified the change done for 3142 to fix issue it caused (4690)
		try {
			var fs = this.edit.queryCommandValue(KtmlGetCommand('blockfmt'));
			if (fs == '' || fs == 'Normal' || fs == 'p') {
				var tempTag = this.logic_getSelectedNode();
				if (tempTag.tagName.toLowerCase() == 'div' || tempTag.tagName.toLowerCase() == 'p') fs = tempTag;
			}
			if (fs != 'Normal' && fs != '') this.logic_removeTag();
		}
		catch(err) {}
	}
};
ktml.prototype.logic_FindReplace = function () {
	this.toolbar.openFindReplace();
};
ktml.prototype.logic_openPalette = function (o, value) {
	if (this.displayMode == "CODE") {
		return false;
	}
	if (this.cpalette.isVisible) {
		this.cpalette.setVisible(false);
	} else {
		this.cpalette.showAtElement(o);
		this.cpalette.setSelected(value);
	}
};
ktml.prototype.logic_openChrPalette = function () {
	var sel = this.edit.selection;
	if (sel.type == "Text" || sel.type == "None" || sel.type == "Control") {
		var rng = sel.createRange();
		if (is.mozilla && (sel.focusNode.nodeName == "BR" || sel.type == "Control" && sel.focusNode.childNodes[sel.anchorOffset].nodeName == "BR")) {
			this.logic_removeTag();
			var rng = sel.createRange();
			var ln = rng.startContainer.childNodes.length;
			rng.setStartAfter(rng.startContainer.childNodes[ln - 1]);
		}
		var contents = rng.htmlText.toLowerCase();
		// parse out the field tag
		var str = '';
		var start = contents.indexOf('&');
		if (start != -1) {
			var end = contents.indexOf(';');
			if (end == -1) end = contents.length;
			str = contents.substring(start, end);
		}
		var theFont = this.edit.queryCommandValue('fontname');
		var strurlstring = jsDlgLoader + '?csModule=dhtmledit/special-prop' + '&ktmlFrameName=' + jsFrameName + '&pageid=' + jspageid + '&controlid=' + jscontrolid + '&counter=' + this.counter + '&selectedchar=' + escape(str) + '&currentFont=' + escape(theFont);
		newWindow('cpinsertspecial', strurlstring);
	} else return false;
};
ktml.prototype.logic_openCharacterPalette = function (o, value) {
	if (this.displayMode == "CODE") {
		return false;
	}
	if (this.charpalette.isVisible) {
		this.charpalette.setVisible(false);
	} else {
		this.charpalette.showAtElement(o);
		this.charpalette.setSelected(value);
	}
};
ktml.prototype.logic_openSmileysPalette = function (o) {
	if (this.displayMode == "CODE") {
		return false;
	}
	if (this.smileyspalette.isVisible) {
		this.smileyspalette.setVisible(false);
	} else {
		this.smileyspalette.showAtElement(o);
		this.smileyspalette.setVisible(true);
	}
};
ktml.prototype.logic_InsertTable = function () {
	if (this.displayMode == "CODE") {
		return false;
	}
	if (this.undo) {
		this.undo.addEdit();
	}
	this.toolbar.openInsertTable();
	if (this.undo) {
		this.undo.addEdit();
	}
};
ktml.prototype.getUniqueID = function () {
	return Math.round(Math.random() * 100000000000000000);
};
ktml.prototype.logic_domSelect = function (selectionTarget, ind, collapse) {
	if (selectionTarget == null) {
		return;
	}
	collapse = collapse || "no";
	var calledFromTI = false;
	if (typeof selectionTarget == "number") {
		calledFromTI = true;
		this.selectableNodes = this.selectableNodes.reverse();
		while (selectionTarget > 0) {
			this.selectableNodes.pop();
			selectionTarget--;
		}
		this.selectableNodes = this.selectableNodes.reverse();
		selectionTarget = this.selectableNodes[selectionTarget];
	}
	var selTagName = selectionTarget.nodeName.toLowerCase();
	if (ind == null) {
		if (",img,table,hr,input,textarea,fieldset,select,".indexOf("," + selTagName + ",") > -1) {
			ind = 2;
		} else {
			ind = 1;
		}
	}
	var realSelectionElement = selectionTarget.translated ? selectionTarget.translated : selectionTarget;
	if (ind == 1) {
		try {
			if (is.mozilla) {
				var rng = this.edit.createRange();
				rng.selectNodeContents(realSelectionElement);
				switch (collapse) {
				case "no":
					break;
				case "begin":
					rng.collapse(true);
					break;
				case "end":
					rng.collapse(false);
					break;
				}
				rng.select();
			} else {
				var tmp1 = this.edit.body.createTextRange();
				tmp1.moveToElementText(realSelectionElement);
				tmp1.select();
				if (collapse != "no") {
					tmp1.collapse(collapse == "begin" ? true : false);
					tmp1.select();
				}
			}
			if (!calledFromTI) {
				this.logic_updateDOMHierarchy(true, 0);
			} else {
				this.logic_updateDOMHierarchy(true, 0, false);
			}
		}
		catch(e) {}
	} else if (ind == 2) {
		if (is.mozilla) {
			var sel = this.cw.getSelection();
			var pn = realSelectionElement.parentNode;
			for (var i = 0; i < pn.childNodes.length; i++) {
				if (pn.childNodes[i] == realSelectionElement) {
					sel.removeAllRanges();
					sel.collapse(pn, i);
					var range = this.edit.createRange();
					range.selectNode(realSelectionElement);
					sel.addRange(range);
					break;
				}
			}
		} else {
			var tmp1 = this.edit.body.createControlRange();
			try {
				tmp1.add(realSelectionElement);
			}
			catch(e) {
				this.cw.focus();
			}
			tmp1.select();
		}
		if (!calledFromTI) {
			this.logic_updateDOMHierarchy(true, 0);
		} else {
			this.logic_updateDOMHierarchy(true, 0, false);
		}
	}
	this.selectableNodeClick = selectionTarget;
	this.runHooks('ondomselect');
	this.cw.focus();
};
ktml.prototype.logic_removeTag = function () {
	try {
		if (this.selectableNodes && this.selectableNodes[0]) {
			var tmpel = this.selectableNodes[0];
		} else {
			var tmpel = this.logic_getSelectedNode();
		}
		var tagname = tmpel.tagName.toLowerCase();
		if (tagname == 'a') {
			// Begin: FIX (Issue 3034) -- Part 1 of 1.
			// Old code:		 
			/*
    	var innertmpel=tmpel.getElementsByTagName('IMG');
      if(innertmpel) {
      	var imgID=innertmpel[0].id;
      	var newimgID=imgID.split('|');
        if(newimgID.length>3) {
        	newimgID=newimgID.splice(2,(newimgID.length-2));
        	newimgID=newimgID.join('|');
        	innertmpel[0].setAttribute('id','||'+newimgID);
          }
        }
		 */
			// New code:
			tmpel.outerHTML = tmpel.innerHTML;
			// End: FIX (Issue 3034) -- Part 1 of 1.
		}
		if (tagname == 'img' && tmpel.getAttribute("orig") != null && tmpel.getAttribute("for") == "anchor") {
			var inspected = new WMedia_Translator(this);
			this.insertHTML(inspected.getAttribute("content"), "first-node");
			this.logic_updateDOMHierarchy(true, 0);
			if (this.introspector) {
				this.introspector.update();
				this.cw.focus();
			}
			return;
		} else if (Array_indexOf(['table', 'img', 'hr', 'input', 'textarea'], tagname) >= 0) {
			if (is.ie) {
				var parentel;
				parentel = tmpel.parentNode;
				if (parentel.tagName == "A" && String_trim(parentel.innerText) == "") {
					tmpel = parentel;
					parentel = parentel.parentNode;
				}
				parentel.removeChild(tmpel);
			} else {
				var parentel = tmpel.parentNode;
				if (parentel.nodeName == "A" && String_trim(parentel.textContent) == "") {
					tmpel = parentel;
					parentel = parentel.parentNode;
				}
				var rng = this.cw.getSelection().getRangeAt(0);
				rng.selectNode(tmpel);
				try {
					this.edit.execCommand("inserthtml", false, '<br id="kt_removable">');
				}
				catch(e) {}
				var br = this.edit.getElementById('kt_removable');
				if (br) {
					try {
						rng.setStartBefore(br);
						rng.setEndBefore(br);
					}
					catch(e) {}
					br.parentNode.removeChild(br);
				}
				rng.select();
			}
		} else if (Array_indexOf(['tr'], tagname) >= 0) {
			var pNode = tmpel.parentNode;
			var pNode2 = tmpel.parentNode;
			pNode.removeChild(tmpel);
			if (Array_indexOf(['TBODY', 'THEAD', 'TFOOT'], pNode.nodeName) >= 0) {
				pNode2 = pNode.parentNode;
			}
			if (pNode2.rows.length == 0) {
				pNode2.parentNode.removeChild(pNode2);
			} else if (pNode.rows.length == 0) {
				pNode.parentNode.removeChild(pNode);
			}
		} else if (Array_indexOf(['ul', 'li', 'ol'], tagname) >= 0) {
			var lis = tmpel.getElementsByTagName('LI');
			for (var i = lis.length - 1; i >= 0; i--) {
				lis[i].outerHTML = lis[i].innerHTML + '<br/>';
			}
			tmpel.outerHTML = tmpel.innerHTML;
		} else {
			if (this.edit.body.contains(tmpel)) {
				tmpel.outerHTML = tmpel.innerHTML;
			}
		}
		this.cw.focus();
		this.displayChanged();
		if (this.undo) {
			this.undo.addEdit();
		}
	}
	catch(e) {}
};
ktml.prototype.logic_removeClasses = function () {
	try {
		var tmpel = null;
		if (this.selectableNodeClick) {
			tmpel = this.selectableNodeClick;
		} else {
			if (this.selectableNodes && this.selectableNodes[0]) {
				tmpel = this.selectableNodes[0];
			} else {
				tmpel = this.logic_getSelectedNode();
			}
		}
		if (tmpel.tagName) {
			tmpel.className = "";
		}
		this.cw.focus();
		this.displayChanged();
		if (this.undo) {
			this.undo.addEdit();
		}
	}
	catch(e) {}
};
ktml.prototype.insertObject = function (nNode, bOverwriteSelection) {
	if (typeof(bOverwriteSelection) == "undefined") {
		bOverwriteSelection = true;
	}
	return this.insertNodeAtSelection(nNode, bOverwriteSelection);
};
ktml.prototype.doSelectFromAnchor = function (e) {
	if (is.ie) {
		var hoverElement = this.cw.event.srcElement;
	} else {
		var hoverElement = e.target;
	}
	utility.dom.stopEvent(is.ie ? this.cw.event : e);
	if (hoverElement.id == HIDDEN_TAG_ID) {
		hoverElement = hoverElement.parentElement;
		this.logic_domSelect(hoverElement, null);
	}
};
function util_getValidContainerParent(el) {
	var invalid_parents = ",td,th,tr,tbody,li";
	while (el) {
		if (el.nodeType == 1 && invalid_parents.indexOf("," + el.tagName.toLowerCase() + ",") < 0) {
			break;
		}
		el = el.parentNode;
	}
	return el;
}
ktml.prototype.makeValidSelection = function () {
	if (this.edit.selection.type == "Control") {
		return;
	}
	try {
		if (this.edit.selection.type != "Text") {
			return;
		}
		var rng = this.edit.selection.createRange();
		var common_parent = rng.parentElement();
		common_parent = util_getValidContainerParent(common_parent);
		if (!common_parent) {
			return;
		}
		var s_rng = rng.duplicate();
		s_rng.collapse(true);
		var s_node = s_rng.parentElement();
		s_node = util_getValidContainerParent(s_node);
		if (s_node && s_node != common_parent) {
			while (s_node && s_node.parentNode != common_parent) {
				s_node = s_node.parentNode;
			}
		}
		var e_rng = rng.duplicate();
		e_rng.collapse(false);
		var e_node = e_rng.parentElement();
		if (e_node && e_node != common_parent) {
			while (e_node && e_node.parentNode != common_parent) {
				e_node = e_node.parentNode;
			}
		}
		if (is.mozilla) {
			var rng = this.edit.selection.getRangeAt(0);
			rng.setStartBefore(s_node);
			rng.setEndAfter(e_node);
			rng.select();
		} else {
			var rng = this.edit.selection.createRange();
			if (s_node) {
				var rStart = rng.duplicate();
				rStart.moveToElementText(s_node);
				if (s_node.tagName == "TABLE") {
					rStart.moveStart("character", -1);
				}
				rStart.collapse(true);
				rng.setEndPoint("StartToStart", rStart);
			}
			if (e_node) {
				var rEnd = rng.duplicate();
				rEnd.moveToElementText(e_node);
				if (s_node) {
					moved_back = rStart.moveEnd("character", 1);
					moved_back = rStart.moveEnd("character", -1);
				}
				rEnd.collapse(false);
				rng.setEndPoint("EndToEnd", rEnd);
			}
			rng.select();
		}
		this.util_saveSelection();
		this.displayChanged();
	}
	catch(e) {
		al(e);
	}
}
ktml.prototype.getSelectionHTML = function () {
	var ret = '';
	var was_invisibles = false;
	if (this.viewInvisibles) {
		was_invisibles = true;
		this.logic_toggleInvisibles();
	}
	if (is.ie) {
		var selType = this.edit.selection.type;
		var selRange = this.edit.selection.createRange();
		if (selType == "Control") {
			ret = selRange.item(0).outerHTML;
		} else {
			ret = selRange.htmlText;
		}
	} else {
		var sel = this.edit.selection;
		for (var i = 0; i < sel.rangeCount; i++) {
			ret += sel.getRangeAt(i).htmlText;
		}
	}
	ret = ret.replace(/<\/?body[^>]*>/gi, '');
	if (was_invisibles) {
		this.logic_toggleInvisibles();
	}
	return ret;
};
ktml.prototype.insertText = function (sText, select_what) {
	var new_text = this.edit.createTextNode(sText);
	this.insertNodeAtSelection(new_text, select_what);
}
ktml.prototype.insertHTML = function (sHTML, select_what, add_undo) {
	if (this.displayMode != 'RICH') {
		return;
	}
	add_undo = util_defaultValue(add_undo, true);
	select_what = util_defaultValue(select_what, "");
	if (add_undo && this.undo) {
		this.undo.update();
	}
	var tr;
	tr = this.edit.selection.createRange();
	var newID = this.getUniqueID();
	if (select_what == "after") {
		sHTML += '<br id="kt_removable">';
	} else if (select_what == "first-node" || select_what == "first-leaf") {
		var before = '';
		var after = '';
		if (/</.test(sHTML)) {
			before = sHTML.substring(0, sHTML.indexOf("<"));
		}
		if (/>/.test(sHTML)) {
			after = sHTML.substring(sHTML.lastIndexOf(">") + 1);
		}
		sHTML = sHTML.substring(before.length, sHTML.length - after.length);
		sHTML = before + '<span id="' + newID + '">' + sHTML + '</span>' + after;
	}
	if (this.edit.selection.type == "None" || this.edit.selection.type == "Text") {
		if (tr.parentElement().ownerDocument == this.edit) {
			tr.pasteHTML(sHTML);
		}
	} else {
		if (is.ie) {
			if (tr(0).ownerDocument == this.edit) {
				this.edit.selection.clear();
				tr = this.edit.selection.createRange();
				tr.pasteHTML(sHTML);
			}
		} else {
			if (tr.parentElement().ownerDocument == this.edit) {
				tr.pasteHTML(sHTML);
			}
		}
	}
	if (select_what == "after") {
		var newSpan = this.edit.getElementById("kt_removable");
		if (newSpan) {
			if (is.mozilla) {
				try {
					tr.setEndBefore(newSpan);
				}
				catch(err) {}
				try {
					tr.setStartBefore(newSpan);
				}
				catch(err) {}
				this.cw.focus();
				tr.select();
			}
			newSpan.parentNode.removeChild(newSpan);
		}
	} else if (select_what == "first-node") {
		var newSpan = this.edit.getElementById(newID);
		if (newSpan) {
			var newEl = newSpan.firstChild;
			while (newEl && newEl.nodeType != 1) {
				newEl = newEl.nextSibling;
			}
			if (newEl) {
				if (newEl.nodeType == 1) {
					newSpan.parentNode.replaceChild(newEl, newSpan);
					this.logic_domSelect(newEl);
				}
			} else {
				if (is.ie) {
					var selRng = this.edit.body.createTextRange();
					selRng.moveToElementText(newSpan);
					selRng.select();
					var selBefore = selRng.duplicate();
					selBefore.collapse(true);
					var selAfter = selRng.duplicate();
					selAfter.collapse(false);
				}
				var parNode = newSpan.parentNode;
				var textNode = this.edit.createTextNode(newSpan.innerText);
				parNode.replaceChild(textNode, newSpan);
				if (is.ie) {
					selRng.setEndPoint("StartToStart", selBefore);
					selRng.setEndPoint("EndToEnd", selAfter);
					selRng.select();
				} else {
					this.edit.selection.removeAllRanges();
					this.edit.selection.selectAllChildren(textNode);
					this.edit.selection.collapse(textNode, 0);
					this.edit.selection.extend(textNode, textNode.textContent.length);
				}
			}
		}
	} else if (select_what == "first-leaf") {
		var newSpan = this.edit.getElementById(newID);
		if (newSpan) {
			var newEl = newSpan;
			var firstEl = newEl.firstChild;
			while (true) {
				var tmp = newEl.firstChild;
				while (tmp && tmp.nodeType != 1) {
					tmp = tmp.nextSibling;
				}
				if (tmp) {
					if (firstEl == null) {
						firstEl == tmp;
					}
					newEl = tmp;
				} else {
					break;
				}
			}
			if (newEl) {
				if (newEl.nodeType == 1) {
					newSpan.parentNode.replaceChild(firstEl, newSpan);
					this.logic_domSelect(newEl, null);
				}
			} else {
				if (is.ie) {
					var selRng = this.edit.body.createTextRange();
					selRng.moveToElementText(newSpan);
					selRng.select();
					var selBefore = selRng.duplicate();
					selBefore.collapse(true);
					var selAfter = selRng.duplicate();
					selAfter.collapse(false);
				}
				var parNode = newSpan.parentNode;
				var textNode = this.edit.createTextNode(newSpan.innerText);
				parNode.replaceChild(textNode, newSpan);
				if (is.ie) {
					selRng.setEndPoint("StartToStart", selBefore);
					selRng.setEndPoint("EndToEnd", selAfter);
					selRng.select();
				} else {
					this.edit.selection.removeAllRanges();
					this.edit.selection.selectAllChildren(textNode);
					this.edit.selection.collapse(textNode, 0);
					this.edit.selection.extend(textNode, textNode.textContent.length);
				}
			}
		}
	}
	if (add_undo && this.undo) {
		this.undo.addEdit();
	}
};
ktml.prototype.getNextElementName = function (tagName, attrName, attrValue) {
	var elTags = this.edit.body.getElementsByTagName(tagName.toUpperCase());
	var elCount = elTags.length;
	var ret = 1;
	var ocu = [];
	var rex = new RegExp(attrValue + '(\\d+)', 'i');
	for (var i = 0; i < elCount; i++) {
		var oEl = elTags[i];
		var m = oEl[attrName].match(rex);
		if (m) {
			var curCnt = parseInt(m[1], 10);
			ocu.push(curCnt);
		}
	}
	ocu.sort();
	if (ocu.length > 0 && ocu[0] > 1) {
		return 1;
	}
	for (var i = 1; i < ocu.length; i++) {
		if (ocu[i] > (ocu[i - 1] + 1)) {
			return ocu[i - 1] + 1;
		}
	}
	return ocu.length + 1;
};
ktml.prototype.logic_setDisplayMode = function (runHooks) {
	var mode = this.swapToMode;
	var btn = KTStorage.get(this.toolbar.swap);
	if (mode == 'CODE') {
		if (this.MediaPlayer) {
			var idx = this.counter;
			this.MediaPlayer.stop(function () {
				ktmls[idx].logic_setDisplayMode();
			});
			return;
		}
		this.preserveSelection(false);
		var a, i, s = "",	ua;
		ua = navigator.userAgent;
		if (is.mozilla && (ua.indexOf("Win95") != -1 || ua.indexOf("Win98") != -1 || ua.indexOf("Win 9x 4.90") != -1)) {
			a = this.selectableNodes;
			for (i = 0; i < a.length; i++) {
				if (a[i].tagName == "TABLE" || a[i].tagName == "IMG" || a[i].tagName == "OBJECT") {
					alert(utility.string.sprintf(translate("move pointer"), a[i].tagName));
					return;
				}
				s += a[i].tagName + ", ";
			}
		}
		utility.window.blockInterface();
		btn.getElement("container").className = "toolbaritem_latched";
		btn.state = 2;
		this.runHooks('onsetdisplaymode_beforeinvisible');
		if (this.ui.showPI) {
			pi_el = document.getElementById(this.name + '_LoadingPI');
			if (pi_el) {
				pi_el.style.display = 'none';
			}
			pi_el = document.getElementById(this.name + '_PI');
			if (pi_el) {
				pi_el.style.display = 'none';
			}
		}
		this.Resize();
		this.textarea.value = HandleOutgoingText(this, this.getPlainSource());
		this.iframe.style.display = "none";
		if (this.viewInvisibles) {
			this.utils_setInvisibles(true);
		}
		var tdEle = (this.iframe).parentNode;
		this.preserveSelection(false);
		if (tdEle.style.width != '') {
			this.textarea.style.width = ((tdEle.style.width).replace('px', '') - 4) + 'px';
		}
		this.textarea.style.display = "block";
		this.textarea.focus();
		this.textarea.select();
		this.displayMode = "CODE";
		for (var i = 0; i < this.toolbar.buttonobjects.length; i++) {
			var tbtn = this.toolbar.buttonobjects[i];
			if (tbtn.name == "find_replace" || tbtn.name == "toggle_editmode" || tbtn.name == "about") {
				continue;
			}
			var pbtn = KTStorage.get(tbtn.assoc);
			switch (tbtn.button_type) {
			case "img":
				pbtn.getElement("container").className = "toolbaritem_disabled";
				pbtn.state = 0;
				break;
			case "combo":
				pbtn.getElement("container").className = "ccontainer_disabled";
				pbtn.state = 0;
				break;
			case "select":
				pbtn.getElement("container").className = "lcontainer_disabled";
				pbtn.state = 0;
				break;
			}
		}
		if (is.ie) {
			var outerHTML = this.taginspector.outerHTML;
			outerHTML = outerHTML.replace(/(<div[^>]*>).*$/ig, '$1</DIV>');
			this.taginspector.outerHTML = outerHTML;
			this.taginspector = document.getElementById(this.name + '_ti').getElementsByTagName('div')[0];
		} else {}
		this.taginspector.innerHTML = translate("Not Available in Source View", this.config.UILanguage);
		if (this.textarea.style.height && this.ui.showPI) {
			var txtHt = parseInt((this.textarea.style.height).replace('px', ''));
			var tgHt = parseInt((this.taginspector.style.height).replace('px', ''));
			var fxHt = is.ie ? 0 : 12;
			this.textarea.style.height = parseInt(txtHt + tgHt + fxHt) + 'px';
		}
		this.collapse(false);
		utility.window.unblockInterface();
		if (runHooks) this.runHooks('onsetdisplaymode');
	} else {
		btn.getElement("container").className = "toolbaritem_flat";
		btn.state = 0;
		if (is.mozilla && this.fullScreenState) {
			document.body.style.MozUserSelect = 'none';
		}
		this.textarea.style.display = "none";
		this.iframe.style.display = "block";
		this.displayMode = "RICH";
		this.collapse(true);
		var toundo = false;
		if (this.undo && this.textarea.value != this.getPlainSource()) {
			toundo = true;
		}
		if (this.textarea.value != "") {
			this.setContent(HandleIncomingText(this, this.textarea.value, mode));
		} else {
			this.edit.body.innerHTML = "<p></p>";
		}
		if (is.mozilla) {
			this.edit.designMode = 'on';
			this.edit.execCommand("useCSS", false, true);
			this.edit.execCommand("styleWithCSS", true, false);
			this.fixMozEditor();
		}
		if (this.viewInvisibles) {
			if (is.ie) {
				this.utils_setInvisibles(false);
			} else {
				setTimeout("ktmls[" + this.counter + "].utils_setInvisibles(false)", 1);
			}
		}
		if (toundo) {
			try {
				this.undo.addEdit();
			}
			catch(e) {}
		}
		if (this.iframe.focus) {
			this.iframe.focus();
		}
		this.cw.focus();
		if (is.ie) {
			var rng = this.edit.body.createTextRange();
			rng.collapse(true);
			rng.select();
			this.util_saveSelection();
		} else {
			try {
				var sel = this.cw.getSelection();
				sel.collapse(this.edit.body.firstChild, 0);
			}
			catch(e) {}
		}
		for (var i = 0; i < this.toolbar.buttonobjects.length; i++) {
			var tbtn = this.toolbar.buttonobjects[i];
			if (tbtn.name == "toggle_editmode") {
				continue;
			}
			var pbtn = KTStorage.get(tbtn.assoc);
			switch (tbtn.button_type) {
			case "img":
				if (this.viewInvisibles && tbtn.name == "toggle_visible") {
					pbtn.getElement("container").className = "toolbaritem_latched";
				} else {
					pbtn.getElement("container").className = "toolbaritem_flat";
				}
				pbtn.state = 1;
				break;
			case "combo":
				pbtn.getElement("container").className = "ccontainer";
				pbtn.state = 1;
				break;
			case "select":
				pbtn.getElement("container").className = "lcontainer";
				pbtn.state = 1;
				break;
			}
		}
		this.taginspector.innerHTML = "";
		this.displayShouldChange = true;
		//this.myCustomResize(this.config_var.width,this.config_var.height);
		wait_displayChanged(this);
	}
};
ktml.prototype.setContent = function (text) {
	if (text.match(/^\s*$/) || text.match(/^\s*<br\s*\/?>$/i)) {
		text = "<p>&nbsp;</p>";
	}
	text = text.replace(/\sonclick=/ig, ' kt_onclick=');
	this.edit.body.innerHTML = util_plain2translated(text, this.counter);
};
function util_plain2translated(str, counter) {
	if (typeof KTML_Translators != "undefined") {
		for (var i in KTML_Translators) {
			eval("str = " + KTML_Translators[i] + "_translateMarkup(str,'" + i + "', " + counter + ");");
		}
	}
	return str;
};
function util_translated2plain(str) {
	var m = str.match(new RegExp("<img[^>]*>", "gi"));
	var idxs1 = {};
	var vals1 = {};
	if (!m) {
		return str;
	}
	var i = m.length;
	while (i--) {
		var orig = m[i].match(/\sorig=['"]?([^'">]*)['"]?/i);
		if (orig) {
			vals1["KT_REPLACEMENT" + i] = decodeURIComponent(unescape(orig[1]));
			idxs1["KT_REPLACEMENT" + i] = m[i];
		}
	}
	var ostr = str;
	for (var idx in idxs1) {
		var i1 = str.indexOf(idxs1[idx]);
		str = str.substr(0, i1) + vals1[idx] + str.substr(i1 + idxs1[idx].length);
	}
	return str;
};
ktml.prototype.getModuleProperty = function (moduleName, propertyName) {
	if (typeof(this.config_var['module_props'][moduleName]) != "undefined" && typeof(this.config_var['module_props'][moduleName][propertyName]) != "undefined") {
		return this.config_var['module_props'][moduleName][propertyName];
	} else {
		return undefined;
	}
};
ktml.prototype.setModuleProperty = function (moduleName, propertyName, propertyValue) {
	if (typeof(this.config_var['module_props'][moduleName]) == "undefined") {
		this.config_var['module_props'][moduleName] = {};
	}
	this.config_var['module_props'][moduleName][propertyName] = propertyValue;
};
ktml.prototype.hasModuleProperty = function (moduleName, propertyName) {
	try {
		return (typeof this.config_var['module_props'][moduleName][propertyName] != 'undefined')
	}
	catch(e) {
		return false;
	}
};
ktml.prototype.makeRequest = function (module, method, postParams, fct, show_error) {
	if (KtmlDevelopment) {
		show_error = true;
	} else {
		if (!this.visible) {
			show_error = false;
		} else {
			if (typeof(show_error) == "undefined") {
				show_error = true;
			}
		}
	}
	var url = KtmlAbsoluteServicePath;
	url += ((ktml_init_object.server == "asp" && module == "spellcheck" && method == "spellcheck") ? ((/\?/.test(url) ? "&" : "?") + "develmoduleid=spellcheck") : "");
	try {
		this.rpc = new utility.req.request();
	}
	catch(e) {
		this.rpc = false;
	}
	var counter = this.counter;
	var completeEvent = function (sock) {
		var obj = null;
		var str = '';
		var err = null;
		try {
			str = sock.responseText;
			obj = eval('(' + str + ')');
		}
		catch(err) {}
		if (err && is.ie && err.number == -1072896658) {
			err = null;
			try {
				window.execScript("Function BinaryToString(Binary)\r\nDim I,S\r\nFor I = 1 to LenB(Binary)\r\nS = S & Chr(AscB(MidB(Binary,I,1)))\r\nNext\r\nBinaryToString = S\r\nEnd Function", "VBScript");
				str = BinaryToString(sock.responseBody);
				obj = eval('(' + str + ')');
			}
			catch(err) {}
		}
		if (err && err.number != -2146827286) {
			if (KtmlDevelopment) {
				alert("Cannot parse server response: \n==== Error number:" + (err ? err.number : "NA") + "\n==== Module, method:" + module + ", " + method + "\n==== Server response " + (is.ie ? "(CTRL+C to copy)" : "") + "\n" + str + "==== End server response");
			} else {
				if (show_error) {
					alert(translate("cannot parse server"));
				}
			}
			ktmls[counter].logger.log(LOG_ERROR, 'SP', 'Module ' + module + ', method ' + method + "<br>==== Server response ====\r\n<xmp class=\"sp_error\">" + str + "</xmp>\r\n==== End server response ====");
			return;
		} else if (obj === null || err && err.number == -2146827286) {
			var err_str = '';
			if (KtmlDevelopment) {
				err_str = str.replace(/<(\/?)(body|head|style|html|meta|script)[^>]*>/gi, "");
			} else {
				err_str = translate("cannot parse server")
				//err_str='4646';
				//err_str=str.replace(/<(\/?)(body|head|style|html|meta|script)[^>]*>/gi,"");
			}
			obj = {
				thumbnail: "ERROR",
				error: {
					code: 'INVALID_SERVER_RESPONSE',
					message: err_str
				}
			};
			ktmls[counter].logger.log(LOG_ERROR, 'SP', 'Module ' + module + ', method ' + method + "<br>==== Server response ====\r\n<xmp class=\"sp_error\">" + str + "</xmp>\r\n==== End server response ====");
		}
		if (fct) {
			try {
				fct(obj);
			}
			catch(err) {
				if (err.number != -2147418094 && err.number != -2146823277) {
					throw (err);
				}
			}
		}
	};
	var default_post = {
		'id': this.id,
		'module': module,
		'method': method,
		'encoding': this.charset
	};
	Object_weave(default_post, postParams);
	this.rpc.initialize(url, {
		'method': 'post',
		'async': true,
		'get': {
			'encoding': this.charset
		},
		'post': default_post,
		'onComplete': completeEvent
	});
};
ktml.prototype.wrapSelection = function () {
	this.selectedNode = this.logic_getSelectedNode();
	var rng = this.edit.selection.createRange();
	if (this.edit.selection.type == 'None') {
		var nodesArray = [rng.parentElement()];
	} else {
		var nodesArray = this.getSelectionAsNodes(rng);
	}
	var first = nodesArray[0];
	if (!first) {
		return;
	}
	var last = nodesArray[nodesArray.length - 1];
	var startSel = utility.dom.createElement('br', {
		'style': 'display: none',
		'class': 'ktml_hidden ktml_selstart'
	}, this.cw);
	var endSel = utility.dom.createElement('br', {
		'style': 'display: none',
		'class': 'ktml_hidden ktml_selend'
	}, this.cw);
	if (Array_indexOf(['img', 'table', 'hr'], first.tagName.toLowerCase()) >= 0 && nodesArray.length == 1) {
		var par = first.parentNode;
		par.insertBefore(startSel, first);
		utility.dom.insertAfter(endSel, first);
	} else {
		if (first.childNodes.length) {
			first.insertBefore(startSel, first.childNodes[0]);
		} else {
			first.appendChild(startSel);
		}
		last.appendChild(endSel);
	}
};
ktml.prototype.save = function (ready_func) {
	var simple_save = false;
	if (this.viewInvisibles == true) {
		this.logic_toggleInvisibles();
	}
	if (this.hasModule('xhtml')) {
		if (typeof(this.formatter) != "undefined" && this.getModuleProperty('xhtml', 'xhtml_save') == 'true') {
			if (this.formatter.type == "js") {
				this.formatter.save();
				this.readyForSave = true;
				this.runHooks('onsavetext');
				if (ready_func) {
					ready_func();
				}
			} else {
				var counter = this.counter;
				this.formatter.save(function () {
					ktmls[counter].readyForSave = true;
					ktmls[counter].runHooks('onsavetext');
					if (ready_func) {
						ready_func();
					}
				});
			}
			simple_save = false;
		} else {
			simple_save = true;
		}
	} else {
		simple_save = true;
	}
	if (simple_save) {
		this.formElement.value = HandleOutgoingText(this);
		this.readyForSave = true;
		this.runHooks('onsavetext');
		if (ready_func) {
			ready_func();
		}
	}
};
ktml.submit_all = function (e) {
	var o = utility.dom.setEventVars(e);
	if (o.targ) {
		fire_starter = o.targ;
	}
	fire_starter = utility.dom.getParentByTagName(fire_starter, "FORM");
	check_func = function () {
		var ktmlsready = 0, ktmls_length = 0;
		for (var i = 0; i < ktmls.length; i++) {
			if (fire_starter && fire_starter != ktmls[i].formElement.form) {
				continue;
			}
			ktmls_length++;
			if (ktmls[i].readyForSave) {
				ktmlsready++;
			}
		}
		if (ktmls_length == ktmlsready) {
			util_formAddActionButton(fire_starter);
			var ret = KT_formSubmittalHandler(check_func.eventArg);
			if (ret) {
				fire_starter.submit();
			}
		}
	};
	check_func.eventArg = o.e;
	var ktmlsready = 0, ktmls_length = 0;
	var stop_it = false;
	for (var i = 0; i < ktmls.length; i++) {
		if (fire_starter && fire_starter != ktmls[i].formElement.form) {
			continue;
		}
		if (ktmls[i].displayMode == "CODE") {
			stop_it = true;
			alert(translate("submit disabled in source view"));
			break;
		}
		ktmls_length++;
		if (!ktml_isElementVisible(i)) {
			ktmls[i].readyForSave = true;
			continue;
		}
		if (!ktmls[i].readyForSave) {
			if (ktmls[i].flags.xhtml_exists && HandleOutgoingText(ktmls[i])) {
				stop_it = true;
				ktmls[i].save(check_func);
			} else {
				stop_it = stop_it || false;
				ktmls[i].save();
				ktmlsready++;
			}
		} else {
			ktmlsready++;
		}
	}
	if (stop_it) {
		utility.dom.stopEvent(o.e);
		return false;
	} else {
		if (ktmlsready == ktmls_length) {
			util_formAddActionButton(fire_starter);
		}
		return true;
	}
};
function util_formAddActionButton(frm) {
	if (typeof(nxt_form_attach) == "function") {
		if (typeof window.UNI_buttonpressed != 'undefined') {
			var button_regexp = window.UNI_buttonpressed;
		} else {
			$UNI_DELETE_BUTTON_NAME = /delete/i;
			$UNI_INSERT_BUTTON_NAME = /insert/i;
			$UNI_UPDATE_BUTTON_NAME = /update/i;
			$UNI_CANCEL_BUTTON_NAME = /cancel/i;
			$UNI_LOGIN_BUTTON_NAME = /login/i;
			var form_buttons = [];
			Array_each(frm.getElementsByTagName('input'), function (button, i) {
				if (button.type && (button.type.toLowerCase() == 'submit' || button.type.toLowerCase() == 'button')) {
					Array_push(form_buttons, button);
				}
			});
			if (form_buttons.length == 1) {
				var button_regexp = form_buttons[0].name;
			} else {
				var update = false;
				var insert = false;
				var login = false;
				for (var i = 0; i < form_buttons.length; i++) {
					var button = form_buttons[i];
					if (button.name.toString().match($UNI_UPDATE_BUTTON_NAME)) {
						update = true;
					}
					if (button.name.toString().match($UNI_INSERT_BUTTON_NAME)) {
						insert = true;
					}
					if (button.name.toString().match($UNI_LOGIN_BUTTON_NAME)) {
						login = true;
					}
				}
				if (update) {
					var button_regexp = $UNI_UPDATE_BUTTON_NAME;
				} else {
					if (insert) {
						var button_regexp = $UNI_INSERT_BUTTON_NAME;
					} else {
						if (login) {
							var button_regexp = $UNI_LOGIN_BUTTON_NAME;
						}
					}
				}
			}
		}
		Array_each(frm.getElementsByTagName('input'), function (button, i) {
			if (button.type && (button.type.toLowerCase() == 'submit' || button.type.toLowerCase() == 'button')) {
				if (button.className == 'mxw_v' || button.className == 'mxw_add') {
					return true;
				}
				if (button.name.match(button_regexp)) {
					var hd = utility.dom.createElement('input', {
						'type': 'hidden',
						'name': button.name,
						'value': button.value
					});
					hd = frm.appendChild(hd);
				}
			}
		});
	} else {
		if (clickedSubmitButton) {
			var already = null;;
			while ((already = document.getElementById('kt_form_submit_button'))) {
				already.parentNode.removeChild(already);
			}
			var hd = utility.dom.createElement('input', {
				'id': 'kt_form_submit_button',
				'type': 'hidden',
				'name': clickedSubmitButton.name,
				'value': clickedSubmitButton.value
			});
			hd = frm.appendChild(hd);
			clickedSubmitButton = null;
		}
	}
};
ktml.prototype.toggleFullScreen = function () {
	if (!this.fullScreenState) {
		this.formElement.value = HandleOutgoingText(this);
		window.slaveKtml = this;
		wnd = utility.window.openWindow("ktml_full_window_editor", ktml_init_object.path + "core/htm/full.html", window.screen.availWidth - 5, window.screen.availHeight - 45);
		if (wnd) {
			this.fullScreenState = true;
			this.preserveSelection(false);
			wnd.moveTo(-3, -3);
			var el = document.getElementById('modalBlocker');
			try {
				el.focus();
			}
			catch(err) {}
		}
	} else {
		if (!opener || opener && opener.closed) {
			return;
		}
		var new_html = this.getPlainSource();
		if (is.mozilla) {
			new_html = new_html.replace(/<img[^>]*>/gi, function (a, b, c) {
				return a.replace(/\ssrc="(?:\.\.\/){4}/, ' src="' + opener.ktml_init_object.path + '../../');
			});
			new_html = new_html.replace(/<a[^>]*>/gi, function (a, b, c) {
				return a.replace(/\shref="(?:\.\.\/){4}/, ' href="' + opener.ktml_init_object.path + '../../');
			});
		}
		opener.slaveKtml.formElement.value = HandleOutgoingText(this, new_html);
		opener.slaveKtml.setContent(new_html);
		opener.slaveKtml.fullScreenState = false;
		utility.window.close();
		opener.focus();
		opener.slaveKtml.invalidate();
		opener.slaveKtml.cw.focus();
	}
}
function ktml_doBold() {
	this.logic_doFormat(DECMD_BOLD);
}
function ktml_doItalic() {
	this.logic_doFormat(DECMD_ITALIC);
}
function ktml_doUnderline() {
	this.logic_doFormat('Underline');
}
function ktml_doUndo() {
	if (this.undo) {
		this.undo.undo();
	}
}
function ktml_doRedo() {
	if (this.undo) {
		this.undo.redo();
	}
}
function ktml_addUndoContext() {
	if (this.undo) {
		this.undo.addEdit();
	}
}
ktml.prototype.doBold = ktml_doBold;
ktml.prototype.doItalic = ktml_doItalic;
ktml.prototype.doUnderline = ktml_doUnderline;
ktml.prototype.doUndo = ktml_doUndo;
ktml.prototype.doRedo = ktml_doRedo;
ktml.prototype.addUndoContext = ktml_addUndoContext;
ktml.prototype.getSelectedNode = ktml.prototype.logic_getSelectedNode;
ktml.prototype.removeSelectedNode = ktml.prototype.logic_removeTag;
ktml.prototype.applyHeadingStyle = ktml.prototype.logic_InsertHeading;
$KT_CMD_ID = 0;
$KT_JS_STRING = 1;
$KT_JS_FUNCTION = 2;
$KT_JS_CALLBACK = 3;
function ComboButton(button_id, deferred) {
	if (typeof deferred == 'undefined') {
		deferred = false;
	}
	this.deferred = deferred;
	KTStorage.add(this);
	var cb_id = this.id;
	this.toolbar_button = button_id;
	this.rendered = false;
	this.visible = true;
	var button = KTStorage.get(button_id);
	this.title = button.alt ? translate(button.alt, button.ktml.config.UILanguage) : translate(button.name, button.ktml.config.UILanguage);
	this.secTitle = button.secAlt ? translate(button.secAlt, button.ktml.config.UILanguage) : this.title;
	this.default_value = button.default_value;
	this.htmlstring = '<table border="0" cellspacing="0" cellpadding="0" class="ccontainer" onmouseover="combobutton_mouseover(event)" onmouseout="combobutton_mouseout(event)" onmousedown="combobutton_mousedown(event)" onmouseup="combobutton_mouseup(event)" toolbar_button="' + button_id + '" button="' + this.id + '" kttype="combo" id="' + this.id + '">\
   <tr>\
    <td title="' + this.title + '" class="drop_down_image" onmouseup="combobutton_mouseup1(event)" id="' + cb_id + '_cell"></td>\
    <td title="' + this.secTitle + '" onmouseup="combobutton_mouseup2(event)"><div class="drop_down_arrow"><div style="background-image:url(' + KtmlRelativeImagePath + 'arrow2.gif) !important; width:12px !important; height:16px !important; border-width:0px !important; margin: 0px !important; padding:0px !important; overflow:hidden !important;"></div></div></td>\
   </tr>\
  </table>';
	this.setTooltip = function (_title, _secTitle) {
		if (typeof _title == "undefined") {
			return;
		}
		if (typeof _secTitle == "undefined") {
			_secTitle = _title;
		}
		var _cell1 = this.getElement("table").rows[0].cells[0];
		var _cell2 = this.getElement("table").rows[0].cells[1];
		_cell1.title = _title;
		_cell2.title = _secTitle;
		this.title = _title;
		this.secTitle = _secTitle;
	}
	this.setValue = function (newValue) {
		this.value = newValue;
		this.paint();
	};
	this.getValue = function () {
		return this.value;
	};
	this.closeCallback = function () {};
	this.width = button.width = 41;
	this.paint = function () {
		var button = KTStorage.get(button_id);
		var cb = KTStorage.get(cb_id);
		button.params.paint.call(cb);
	};
	this.element = this.id;
	this.table = this.id;
	this.cell = cb_id + "_cell";
	var _this = this;
	if (button.params.title) {
		this.getTitle = function () {
			return button.params.title.call(_this);
		}
	}
	if (this.deferred) {} else {
		button.ktml.toolbar.addAfterAction(function () {
			_this.rendered = true;
			var button = KTStorage.get(_this.toolbar_button);
			button.width = _this.width = _this.getWidth();
			_this.setVisible(_this.visible);
			_this.setValue(_this.default_value);
		});
	}
};
ComboButton.prototype.transformToImageButton = function () {
	if (this.transformedToImageButton) {
		return;
	}
	this.transformedToImageButton = true;
	var cell = this.getElement("table").rows[0].cells[1];
	cell.firstChild.firstChild.className = "drop_down_image_disabled";
};
ComboButton.prototype.deferredAfterAction = function () {
	if (this.deferred) {
		this.rendered = true;
		var button = KTStorage.get(this.toolbar_button);
		button.width = this.width = this.getWidth();
		this.setVisible(this.visible);
		this.setValue(this.default_value);
	}
};
ComboButton.prototype.getAsElement = function () {
	var tmp = document.createElement('span');
	tmp.innerHTML = this.htmlstring;
	return tmp.childNodes[0];
};
ComboButton.prototype.getElement = function (what) {
	switch (what) {
	case "container":
		return document.getElementById(this.element);
		break;
	case "ccontainer":
		return document.getElementById(this.element).getElementsByTagName('div');
		break;
	case "table":
		return document.getElementById(this.table);
		break;
	case "cell":
		return document.getElementById(this.cell);
		break;
	}
};
ComboButton.prototype.getWidth = function () {
	return 41;
};
ComboButton.prototype.dispose = function () {};
var ignore_next = false;
function combobutton_mouseover(e) {
	if (ignore_next) {
		ignore_next = false;
		return;
	}
	var obj = utility.dom.setEventVars(e);
	var src = obj.targ;
	if (src.tagName.toLowerCase() != 'table') {
		src = utility.dom.getParentByTagName(src, 'table');
	}
	var _this = KTStorage.get(src.getAttribute('button'));
	if (_this.state == 0) {
		return;
	}
	var comboDownArrow = src.rows[0].cells[1].firstChild;
	if (src.className != "ccontainer_disabled") {
		src.className = "ccontainer ccontainer_hover";
		comboDownArrow.className = "drop_down_arrow_hover";
	};
}
function combobutton_mouseout(e) {
	var obj = utility.dom.setEventVars(e);
	var src = obj.targ;
	if (src.tagName.toLowerCase() != 'table') {
		src = utility.dom.getParentByTagName(src, 'table');
	}
	var _this = KTStorage.get(src.getAttribute('button'));
	if (_this.state == 0) {
		return;
	}
	var comboDownArrow = src.rows[0].cells[1].firstChild;
	if (src.className != "ccontainer_disabled") {
		src.className = "ccontainer";
		comboDownArrow.className = "drop_down_arrow";
	};
}
function combobutton_mousedown(e) {
	var obj = utility.dom.setEventVars(e);
	var src = obj.targ;
	if (src.tagName.toLowerCase() != 'table') {
		src = utility.dom.getParentByTagName(src, 'table');
	}
	var _this = KTStorage.get(src.getAttribute('button'));
	if (_this.state == 0) {
		return;
	}
	var comboDownArrow = src.rows[0].cells[1].firstChild;
	if (src.className != "ccontainer_disabled") {
		src.className = "ccontainer_inset";
	};
}
function combobutton_mouseup(e) {
	if (ignore_next) {
		return;
	}
	var obj = utility.dom.setEventVars(e);
	var src = obj.targ;
	if (src.tagName.toLowerCase() != 'table') {
		src = utility.dom.getParentByTagName(src, 'table');
	}
	var _this = KTStorage.get(src.getAttribute('button'));
	if (_this.state == 0) {
		return;
	}
	var comboDownArrow = src.rows[0].cells[1].firstChild;
	if (src.className != "ccontainer_disabled") {
		src.className = "ccontainer ccontainer_hover";
	};
}
function combobutton_mouseup1(e) {
	var obj = utility.dom.setEventVars(e);
	var src = obj.targ;
	var btn = utility.dom.getParentByTagName(src, 'table');
	var cb = KTStorage.get(btn.getAttribute("button"));
	if (cb.state == 0) {
		return;
	}
	var tlb = KTStorage.get(btn.getAttribute("toolbar_button"));
	if (tlb.ktml.toolbar.checkHelp()) {
		tlb.ktml.toolbar.showHelp(tlb.helpId);
		return false;
	}
	utility.popup.force = true;
	utility.popup.removeModal();
	utility.popup.force = false;
	ignore_next = true;
	tlb.params.command.call(cb, cb.value);
}
function combobutton_mouseup2(e) {
	var obj = utility.dom.setEventVars(e);
	var src = obj.targ;
	var btn = utility.dom.getParentByTagName(src, 'table');
	var cb = KTStorage.get(btn.getAttribute("button"));
	if (cb.state == 0) {
		return;
	}
	var tlb = KTStorage.get(btn.getAttribute("toolbar_button"));
	if (tlb.ktml.toolbar.checkHelp()) {
		tlb.ktml.toolbar.showHelp(tlb.helpId);
		return false;
	}
	var cb = KTStorage.get(btn.getAttribute("button"));
	ignore_next = true;
	tlb.params.open.call(cb);
}
function HtmlDropdownButton(button_id) {
	KTStorage.add(this);
	this.toolbar_button = button_id;
	this.rendered = false;
	this.visible = true;
	var button = KTStorage.get(button_id);
	this.title = button.alt ? translate(button.alt, button.ktml.config.UILanguage) : translate(button.name, button.ktml.config.UILanguage);
	this.options = button.options;
	this.imagesize = {
		width: 11,
		height: 15
	};
	var calc1 = 79 - this.imagesize.width;
	this.htmlstring = '<table border="0" cellspacing="0" cellpadding="0" \  class="lcontainer" toolbar_button="' + button_id + '" button="' + this.id + '" id="' + this.id + '">\  <tr valign="middle">\   <td nowrap="nowrap"><div title="' + this.title + '" class="lcontainer_text" style="width:' + (calc1 + (is.ie ? 0 : 0)) + 'px;">' + button.options[0].attributes.HTMLValue + '</div></td>\   <td bgcolor="buttonface"><div title="' + this.title + '" class="lcontainer_vrule"><div id="' + this.id + '_arrow" style="background-image:url(' + KtmlDirDepth + 'core/img/arrow.gif) !important;height:' + this.imagesize.height + 'px !important;width:' + this.imagesize.width + 'px !important;border-width:0px !important;margin: 0px !important;padding:0px !important;overflow:hidden !important;"></div></div></td>\  </tr>\ </table>\ ';
	this.width = button.width = 90;
	var _this = this;
	button.ktml.toolbar.addAfterAction(function () {
		_this.rendered = true;
		_this.selectedIndex = -1;
		_this.highlightedIndex = -1;
		_this.mustResize = true;
		_this.initialize();
		_this.render();
		var button = KTStorage.get(_this.toolbar_button);
		_this.setVisible(_this.visible);
		button.width = _this.width = _this.getWidth();
	});
};
HtmlDropdownButton.prototype.getElement = function (what) {
	switch (what) {
	case "container":
		return document.getElementById(this.id);
	case "table":
		return document.getElementById(this.id);
	case "cell0":
		return document.getElementById(this.id).rows[0].cells[0];
	case "arrow":
		return document.getElementById(this.id + '_arrow');
	case "optcontainer":
		return document.getElementById(this.id + '_optcontainer');
	}
	return null;
};
HtmlDropdownButton.prototype.pickValue = function (idx) {
	var tbl = this.optContainerTable;
	var cell0 = this.getElement("cell0");
	var toret = null;
	this.selectedIndex = idx;
	if (is.ie) {
		var newText = tbl.rows[idx].cells[0].innerText;
		if (cell0.childNodes[0].innerText != newText) {
			cell0.childNodes[0].innerText = newText;
		}
	} else {
		var newText = tbl.rows[idx].cells[0].textContent;
		if (cell0.childNodes[0].textContent != newText) {
			cell0.childNodes[0].textContent = newText;
		}
	}
	cell0.parentElement.parentElement.parentElement.lastHi = tbl.rows[idx].cells[0];
};
HtmlDropdownButton.prototype.getWidth = function () {
	return 90;
};
function htmldropdown_table_click(e) {
	var targetObjectCounter = false;
	var o = utility.dom.setEventVars(e);
	var src = o.targ;
	var src = utility.dom.getParentByTagName(src, 'table');
	var toolbar_button = KTStorage.get(src.getAttribute('toolbar_button'));
	var _this = KTStorage.get(src.getAttribute('button'));
	if (_this.state == 0) {
		return;
	}
	if (targetObjectCounter != null) {
		utility.dom.stopEvent(e);
		if (!_this.disabled) {
			if (toolbar_button.ktml.toolbar.checkHelp()) {
				toolbar_button.ktml.toolbar.showHelp(toolbar_button['helpId']);
				return false;
			}
			_this.toggleDisplay();
		}
	}
};
function htmldropdown_select_mouseover() {
	if (tmpObj.select.className != "lcontainer_disabled") {
		tmpObj.select.className = "lcontainer lcontainer_hover";
		downArrButton.className = "lcontainer_vrule_hover";
	}
};
function htmldropdown_select_mouseout() {
	if (tmpObj.select.className != "lcontainer_disabled") {
		tmpObj.select.className = "lcontainer";
		downArrButton.className = "lcontainer_vrule"
	}
};
function hndlr_htmldropdown_key(e) {
	var o = utility.dom.setEventVars(e);
	var targetObjectCounter = null;
	var src = o.targ;
	var src = utility.dom.getParentByTagName(src, 'div');
	var obj = KTStorage.get(src.getAttribute('button'));
	var btn = KTStorage.get(obj.toolbar_button);
	if (o.e.keyCode == 9) {
		obj.toggleDisplay(0);
		btn.ktml.util_restoreSelection();
	}
	if (o.e.keyCode == 27) {
		obj.toggleDisplay(0);
		utility.dom.stopEvent(o.e);
		btn.ktml.util_restoreSelection();
	}
	if (o.e.keyCode == 38) {
		utility.dom.stopEvent(o.e);
		var newindex = obj.highlightedIndex - 1;
		if (newindex < 0) newindex = 0;
		var tr = obj.setHighlightedIndex(newindex);
		if (utility.dom.getStyleProperty(obj.optcontainer, 'display') != 'none') {
			var c = obj.getScrollCoords();
			var min_display_y = parseInt(c.divpos.y) + parseInt(obj.optcontainer.scrollTop);
			var max_display_y = min_display_y + parseInt(obj.optcontainer.offsetHeight);
			var min_tr_y = parseInt(c.trpos.y) - parseInt(obj.optcontainer.scrollTop);
			var max_tr_y = min_tr_y + parseInt(obj.optContainerTable.rows[obj.highlightedIndex].offsetHeight);
			if (min_tr_y < min_display_y) {
				obj.optcontainer.scrollTop = -parseInt(c.divpos.y) + parseInt(c.trpos.y);
			}
		}
	}
	if (o.e.keyCode == 40) {
		utility.dom.stopEvent(o.e);
		var newindex = obj.highlightedIndex + 1;
		if (newindex >= (btn.options.length - 1)) newindex = (btn.options.length - 1);
		var tr = obj.setHighlightedIndex(newindex);
		if (utility.dom.getStyleProperty(obj.optcontainer, 'display') != 'none') {
			var c = obj.getScrollCoords();
			var min_display_y = parseInt(c.divpos.y);
			var max_display_y = min_display_y + parseInt(obj.optcontainer.offsetHeight);
			var min_tr_y = parseInt(c.trpos.y);
			var max_tr_y = min_tr_y + parseInt(obj.optContainerTable.rows[obj.highlightedIndex].offsetHeight);
			if (max_display_y < max_tr_y) {
				obj.optcontainer.scrollTop = max_tr_y - max_display_y;
			}
		}
	}
	if (o.e.keyCode == 13) {
		if (utility.dom.getStyleProperty(obj.optcontainer, 'display') != 'none') {
			btn.ktml.util_restoreSelection();
			obj.setSelectedIndex(obj.highlightedIndex, true);
			obj.toggleDisplay(0);
			utility.dom.stopEvent(o.e);
		}
	}
	return false;
};
HtmlDropdownButton.prototype.getScrollCoords = function () {
	var tr = this.optContainerTable.rows[this.selectedIndex];
	var divpos = utility.dom.getAbsolutePos(this.optcontainer);
	var trpos = utility.dom.getAbsolutePos(tr);
	return {
		'trpos': trpos,
		'divpos': divpos
	};
};
HtmlDropdownButton.prototype.initialize = function () {
	var toolbar_button = KTStorage.get(this.toolbar_button);
	var tmp = '';
	for (var i = 0; i < this.options.length; i++) {
		this.options[i].attributes["HTMLValue"] = lang_translatepage(this.options[i].attributes["HTMLValue"], toolbar_button.ktml.config.UILanguage, window);
	}
};
HtmlDropdownButton.prototype.render = function () {
	this.select = this.getElement("container");
	var tlb = KTStorage.get(this.toolbar_button);
	this.optcontainer = document.createElement("DIV");
	this.optcontainer.className = "optcontainer";
	this.optcontainer = tlb.ktml.toolbar.base.insertBefore(this.optcontainer, tlb.ktml.toolbar.base.lastChild);
	this.optcontainer.setAttribute("toolbar_button", this.toolbar_button);
	this.optcontainer.setAttribute("button", this.id);
	this.optcontainer.setAttribute("button", this.id);
	this.optcontainer.id = this.id + '_optcontainer';
	this.table0 = this.getElement("container");
	this.table0.rows[0].cells[0].firstChild.textContent = this.options[0].attributes['HTMLValue'];
	this.table0.rows[0].cells[0].firstChild.innerText = this.options[0].attributes['HTMLValue'];
	var innerhtml = '<table counter="' + this.counter + '" cellspacing="0" cellpadding="0">';
	for (var i = 0; i < this.options.length; i++) {
		innerhtml += '<tr><td><div class="opt">' + this.options[i].attributes["HTMLValue"] + '</div></td></tr>';
	}
	innerhtml += '</table>';
	this.optcontainer.innerHTML = innerhtml;
	utility.dom.attachEvent(this.optcontainer, 'onmousedown', function (e) {
		var o = utility.dom.setEventVars(e);
		if (o.targ.scrollWidth <= o.e.offsetX && o.e.offsetX < o.targ.offsetWidth) {
			tlb.ktml.preserveSelection(false);
		}
	});
	utility.dom.attachEvent(this.select, 'onmouseup', function (e) {
		htmldropdown_table_click(e);
	});
	var downArrButton = utility.dom.getElementsBySelector('.lcontainer_vrule', this.table0);
	if (downArrButton) downArrButton = downArrButton[0];
	var _this = this;
	utility.dom.attachEvent(this.select, 'onmouseover', function () {
		if (_this.state != 0) {
			_this.select.className = "lcontainer lcontainer_hover";
			downArrButton.className = "lcontainer_vrule_hover";
		}
	});
	utility.dom.attachEvent(this.select, 'onmouseout', function () {
		if (_this.state != 0) {
			_this.select.className = "lcontainer";
			downArrButton.className = "lcontainer_vrule"
		}
	});
	this.optContainerTable = this.optcontainer.getElementsByTagName('table')[0];
	utility.dom.attachEvent(this.optcontainer, 'keydown', hndlr_htmldropdown_key, 1);
	utility.dom.setUnselectable(this.select);
	utility.dom.setUnselectable(this.optcontainer);
	for (var i = 0; i < this.options.length; i++) {
		var newOptionCell = this.optContainerTable.rows[i].cells[0];
		newOptionCell.noWrap = "true";
		newOptionCell.onmouseover = HtmlDropdownButton.rowHi;
		newOptionCell.onmouseup = HtmlDropdownButton.set_selected_index_and_close;
	}
	this.rendered = true;
	if (is.ie) {
		utility.dom.attachEvent(this.optcontainer, "onmousewheel", function (e) {
			var amount = window.event.wheelDelta;
			amount = amount / 120;
			utility.dom.stopEvent(window.event);
			this.scrollTop -= amount * 45;
			return false;
		}, false);
	} else {
		this.optcontainer.addEventListener("DOMMouseScroll", function (e) {
			try {
				this.scrollTop += e.detail * 15;
				utility.dom.stopEvent(e);
				return false;
			}
			catch(err) {}
		}, true);
	}
};
HtmlDropdownButton.prototype.show = function () {
	this.optcontainer.style.top = '-20000px';
	this.optcontainer.style.display = 'block';
	utility.dom.putElementAt(this.optcontainer, this.table0, '03', {
		x: is.ie ? 0 : 2,
		y: is.ie ? -1 : -3
	}, false);
	HtmlDropdownButton.sizeToContent(this.id);
	utility.dom.bringIntoView(this.optcontainer);
	this.open = 1;
	this.optcontainer.style.zIndex = 200;
	var _this = this;
	utility.popup.makeModal(function () {
		_this.hide();
	}, this.optcontainer);
	if (this.highlightedIndex >= 0) {
		this.scrollToIndex(this.highlightedIndex);
	};
	var _ktml = KTStorage.get(this.toolbar_button).ktml;
	_ktml.util_saveSelection();
	if (is.ie) {
		utility.dom.toggleSpecialTags(this.optcontainer, false, 1, _ktml.edit, _ktml.iframe);
	}
};
HtmlDropdownButton.prototype.scrollToIndex = function (idx) {
	var tbl = this.optContainerTable;
	var sOf = 0;
	for (var i = 0; i < tbl.rows.length; i++) {
		if (i == idx) {
			sOf = tbl.rows[i].offsetTop;
			break;
		};
	}
	this.optcontainer.scrollTop = sOf;
};
HtmlDropdownButton.prototype.hide = function () {
	this.optcontainer.style.display = 'none';
	this.open = 0;
	if (is.ie) {
		var _ktml = KTStorage.get(this.toolbar_button).ktml;
		utility.dom.toggleSpecialTags(this.optcontainer, false, 0, _ktml.edit, _ktml.iframe);
	}
};
HtmlDropdownButton.rowHi = function (targEl) {
	var wantedHighlightedIndex = -1;
	var obj = null;
	var button = null;
	if (typeof targEl == "number") {
		wantedHighlightedIndex = targEl;
		obj = this;
	} else if (typeof targEl == "undefined") {
		targEl = event.srcElement;
		while (targEl && (!(button = targEl.getAttribute("button")))) {
			if (targEl.tagName == "TR") {
				wantedHighlightedIndex = targEl.rowIndex;
			}
			targEl = targEl.parentElement;
		}
		if (button === null) {
			return;
		}
		obj = KTStorage.get(button);;
	} else if (is.mozilla) {
		if (typeof(targEl.target) != "undefined") {
			targEl = targEl.target;
		}
		while (targEl && (!(button = targEl.getAttribute("button")))) {
			if (targEl.tagName == "TR") {
				wantedHighlightedIndex = targEl.rowIndex;
			}
			targEl = targEl.parentElement;
		}
		if (button === null) {
			return true;
		}
		obj = KTStorage.get(button);;
	} else {
		utility.dom.stopEvent(window.event);
		while (targEl && (!(button = targEl.getAttribute("button")))) {
			if (targEl.tagName == "TR") {
				wantedHighlightedIndex = targEl.rowIndex;
			}
			targEl = targEl.parentElement;
		}
		if (button === null) {
			return true;
		}
		obj = KTStorage.get(button);;
	}
	if (typeof(obj.highlightedIndex) != "undefined" && obj.highlightedIndex != wantedHighlightedIndex) {
		obj.unsetHighlightedIndex(obj.highlightedIndex);
	}
	obj.highlightedIndex = wantedHighlightedIndex;
	var mouseovertext = '';
	if (0 <= obj.highlightedIndex && obj.highlightedIndex < obj.optContainerTable.rows.length) {
		mouseovertext = obj.optContainerTable.rows[obj.highlightedIndex].cells[0].innerText;
		obj.optContainerTable.rows[obj.highlightedIndex].cells[0].firstChild.title = mouseovertext;
		obj.optContainerTable.rows[obj.highlightedIndex].cells[0].firstChild.style.margin = '0px';
		obj.optContainerTable.rows[obj.highlightedIndex].cells[0].firstChild.style.border = '1px solid black';
	}
};
HtmlDropdownButton.rowLow = function (wantedHilightedIndex) {
	var toolbar_button = KTStorage.get(this.toolbar_button);
	if (0 <= wantedHilightedIndex && wantedHilightedIndex < this.optContainerTable.rows.length) {
		this.optContainerTable.rows[wantedHilightedIndex].cells[0].firstChild.style.margin = '1px';
		this.optContainerTable.rows[wantedHilightedIndex].cells[0].firstChild.style.border = '0px solid black';
	}
};
HtmlDropdownButton.prototype.setHighlightedIndex = HtmlDropdownButton.rowHi;
HtmlDropdownButton.prototype.unsetHighlightedIndex = HtmlDropdownButton.rowLow;
HtmlDropdownButton.setDisabled = function (flag) {
	this.disabled = flag;
	this.select.className = "lcontainer" + (flag ? " lcontainer_disabled" : "");
};
HtmlDropdownButton.prototype.setDisabled = HtmlDropdownButton.setDisabled;
HtmlDropdownButton.updateState = function (flag) {
	this._disabled = flag;
	this.select.className = "lcontainer" + (flag ? " lcontainer_disabled" : "");
};
HtmlDropdownButton.prototype.updateState = HtmlDropdownButton.updateState;
HtmlDropdownButton.sizeToContent = function (obj_id) {
	var obj = KTStorage.get(obj_id);
	if (obj.mustResize) {
		var oldtop = obj.optcontainer.style.top;
		obj.optcontainer.style.top = "-10000px";
	}
	obj.optcontainer.style.display = 'block';
	if (obj.mustResize) {
		var nw = obj.optContainerTable.offsetWidth + (obj.optContainerTable.offsetHeight <= obj.optcontainer.offsetHeight ? 0 : 0);
		if (obj.optContainerTable.offsetHeight < obj.optcontainer.offsetHeight) {
			obj.optcontainer.style.height = (obj.optContainerTable.offsetHeight + (is.ie ? (document.compatMode == "BackCompat" ? 2 : 0) : 0)) + "px";
			nw += (is.ie ? (document.compatMode == "BackCompat" ? 2 : 0) : 0);
		} else {
			nw += obj.optcontainer.offsetWidth - obj.optcontainer.clientWidth + (is.ie ? (document.compatMode == "BackCompat" ? 0 : -2) : -2);
		}
		obj.optcontainer.style.width = (nw) + "px";
		obj.optcontainer.style.top = oldtop;
		obj.mustResize = false;
	}
	obj.setHighlightedIndex(obj.selectedIndex);
	if (is.ie) {
		obj.optcontainer.focus();
	}
};
HtmlDropdownButton.set_selected_index_and_close = function (e) {
	var button = null;
	var o = utility.dom.setEventVars(e);
	utility.dom.stopEvent(o.e);
	var startEl = o.targ;
	while (startEl && (button = startEl.getAttribute("button")) == null) {
		startEl = startEl.parentElement;
	}
	if (button != null) {
		var obj = KTStorage.get(button);
	} else {
		return;
	}
	var tbl = o.targ;
	var td = o.targ;
	while (tbl.tagName.toLowerCase() != 'table') {
		if (tbl.tagName.toLowerCase() == 'td') {
			td = tbl;
		}
		tbl = tbl.parentNode;
	}
	var idx = 0;
	for (var i = 0; i < tbl.rows.length; i++) {
		if (tbl.rows[i].cells[0] == td) {
			idx = i;
			break;
		}
	}
	obj.setSelectedIndex(idx, true);
	obj.toggleDisplay(0);
	var toolbar_button = KTStorage.get(obj.toolbar_button);
	toolbar_button.value = obj.options[idx].value;
	toolbar_button.run(o.e, startEl);
};
HtmlDropdownButton.prototype.setSelectedIndex = function (idx, setLogic) {
	var toolbar_button = KTStorage.get(this.toolbar_button);
	if (this.selectedIndex < 0) {
		this.selectedIndex = 0;
	}
	if (setLogic) {
		this.selectedIndex = idx;
	}
	var tbl = this.optContainerTable;
	var cell0 = this.table0.rows[0].cells[0];
	var toret = null;
	for (var i = 0; i < tbl.rows.length; i++) {
		if (i == idx) {
			tbl.lastHi = tbl.rows[i].cells[0];
			toret = tbl.rows[i];
			this.setHighlightedIndex(i);
			if (setLogic) {
				var new_text = is.ie ? tbl.rows[i].cells[0].innerText : tbl.rows[i].cells[0].textContent;
				cell0.childNodes[0].textContent = new_text;
				cell0.childNodes[0].innerText = new_text;
				toolbar_button.ktml.util_restoreSelection();
			}
		}
	}
	return toret;
};
HtmlDropdownButton.prototype.toggleDisplay = function () {
	if (this.selectedIndex < 0) {
		this.selectedIndex = 0;
	}
	var el = this.optcontainer;
	var val = utility.dom.getDisplay(el);
	if (arguments.length == 0) {
		if (val == 'none') {
			this.show();
		} else if (val == 'block' || val == '') {
			this.hide();
		}
	} else {
		var mode = arguments[0];
		if (mode == 1) {
			this.show();
		} else if (mode == 0) {
			this.hide();
		}
	}
};
HtmlDropdownButton.prototype.remove = function (index) {
	this.options.splice(index, 1);
	this.optContainerTable.deleteRow(index);
};
HtmlDropdownButton.prototype.removeAll = function () {
	for (var index = this.optContainerTable.rows.length - 1; index >= 1; index--) {
		this.remove(index);
	}
};
HtmlDropdownButton.prototype.add = function (value, text) {
	var newOptionRow = this.optContainerTable.insertRow(this.optContainerTable.rows.length);
	var newOptionCell = newOptionRow.insertCell(0);
	newOptionCell.noWrap = "true";
	newOptionCell.onmouseover = HtmlDropdownButton.rowHi;
	newOptionCell.onmouseup = HtmlDropdownButton.set_selected_index_and_close;
	newOptionCell.innerHTML = '<div class="opt">' + text + '</div>';
	this.options.push({
		value: value,
		text: text,
		attributes: {
			HTMLValue: value
		}
	});
	this.mustResize = true;
};
HtmlDropdownButton.prototype.set = function (idx, text, value, htmlValue) {
	if (idx < 0 || idx >= this.options.length) {
		return;
	}
	var optionRow = this.optContainerTable.rows[idx];
	var optionCell = optionRow.cells[0];
	optionCell.innerHTML = '<div class="opt">' + htmlValue + '</div>';
	this.mustResize = true;
};
HtmlDropdownButton.prototype.indexOfValue = function (value) {
	var i = this.options.length;
	while (i--) {
		if (this.options[i].value == value) {
			return i;
		}
	}
	return -1;
};
HtmlDropdownButton.prototype.setVisible = ImageButton.prototype.setVisible = ComboButton.prototype.setVisible = function (flag) {
	this.visible = flag;
	if (this.rendered) {
		try {
			this.getElement("container").style.display = flag ? '' : 'none';
		}
		catch(e) {}
	}
};
var KT_icon_images = "about.gif align_center.gif align_justify.gif align_left.gif align_right.gif bold.gif bulleted_list.gif clean.gif cleancss.gif clean_menu.gif copy.gif cut.gif find_replace.gif help.gif horizontal_rule.gif indent.gif insert_anchor.gif insert_button.gif insert_checkbox.gif insert_fieldset.gif insert_file.gif insert_filefield.gif insert_flash.gif insert_form.gif insert_hiddenfield.gif insert_image.gif insert_label.gif insert_link.gif insert_listmenu.gif insert_quicktime.gif insert_radiobutton.gif insert_table.gif insert_template.gif insert_textarea.gif insert_textfield.gif insert_windowsmedia.gif italic.gif linkremove.gif numbered_list.gif outdent.gif paste.gif pasteword.gif redo.gif spellcheck.gif subscript.gif superscript.gif toggle_editmode.gif toggle_fullscreen.gif toggle_visible.gif underline.gif undo.gif pi.gif";
KT_icon_images = KT_icon_images.replace(/\.[^\s]*/gi, '');
KT_icon_images = KT_icon_images.split(" ");
KT_icon_indexes = {};
for (var i = 0; i < KT_icon_images.length; i++) {
	KT_icon_indexes[KT_icon_images[i]] = i;
}
function ImageButton(button_id, deferred) {
	if (typeof deferred == 'undefined') {
		deferred = false;
	}
	this.deferred = deferred;
	KTStorage.add(this);
	this.rendered = false;
	this.visible = true;
	this.toolbar_button = button_id;
	var button = KTStorage.get(button_id);
	this.image = this.id;
	this.title = button.alt ? translate(button.alt, button.ktml.config.UILanguage) : translate(button.name, button.ktml.config.UILanguage);
	var idx = parseInt(KT_icon_indexes[button.name], 10) || 0;
	var pos = -idx * 32 - 6;
	this.htmlstring = '<div class="toolbaritem_flat" \ toolbar_button="' + button_id + '" \ button="' + this.id + '" \ id="' + this.id + '"\ title="' + this.title + '" \ onmouseover="toolbar_mouseover(event, \'' + this.id + '\')" \ onmousedown="toolbar_mousedown(event, \'' + this.id + '\')" \ onmouseup="toolbar_mouseup(event, \'' + this.id + '\')" \ onmouseout="toolbar_mouseout(event, \'' + this.id + '\')" ';
	if (button.button_icon) {
		this.htmlstring += 'style="background-image: url(' + button.button_icon + '?' + KtmlVersion + ');background-repeat: no-repeat;background-position: center;"';
	} else {
		this.htmlstring += 'style="background-image: url(' + KtmlRelativeImagePath + 'montage.gif?' + KtmlVersion + ');background-position: ' + (pos) + 'px 2px;background-repeat: no-repeat;"';
	}
	this.htmlstring += '></div>';
	this.width = button.width = 26;
	var _this = this;
	if (this.deferred) {} else {
		button.ktml.toolbar.addAfterAction(function () {
			_this.rendered = true;
			var button = KTStorage.get(_this.toolbar_button);
			button.width = _this.width = _this.getWidth();
			_this.setVisible(_this.visible);
		});
	}
};
ImageButton.prototype.deferredAfterAction = function () {
	this.rendered = true;
	var button = KTStorage.get(this.toolbar_button);
	button.width = this.width = this.getWidth();
};
ImageButton.prototype.getAsElement = function () {
	var tmp = document.createElement('span');
	tmp.innerHTML = this.htmlstring;
	return tmp.childNodes[0];
};
ImageButton.prototype.getElement = function (what) {
	switch (what) {
	case "container":
		return document.getElementById(this.id);
	case "image":
		return document.getElementById(this.id);
	}
	return null;
};
ImageButton.prototype.getWidth = function () {
	return 26;
	return this.getElement("container").offsetWidth + 6;
};
function ToolbarButton(options, params) {
	KTStorage.add(this);
	this.ktml = null;
	this.button_type = options['button_type'];
	this.group = options['group'];
	this.name = options['name'];
	this.alt = options['alt_text'];
	this.secAlt = options['second_alt_text'];
	this.button_icon = options['button_icon'];
	this.config_display_button = 1;
	this.in_floater = false;
	this.width = 0;
	this.cid = options['command_id'];
	this.options = options;
	this.params = params || {};
	this.helpId = options['help'] || options['name'].toLowerCase();
	var default_value = options['default_value'];
	if (typeof(default_value) != 'undefined') {
		this.default_value = default_value;
	} else {
		this.default_value = {};
	}
	if (this.button_type == 'select') {
		this.options = params.options;
		this.styleProperties = this.default_value;
	} else {
		this.styleProperties = {};
	}
	commandType = options['command_type'] || $KT_CMD_ID;
	if (options['command_type'] == $KT_JS_STRING && options['command_string'] == '') {
		command = '';
	} else {
		command = options['command_string'] || options['name'];
	}
	if (typeof(open_command) != 'undefined') {
		this.open = open_command;
	}
	if (typeof(paint_command) != 'undefined') {
		this.paint = paint_command;
	}
	var defaultcommandstr = '';
	if (commandType == $KT_JS_FUNCTION) {
		var s = command.toString();
		defaultcommandstr = s.substring(s.indexOf("{") + 1, s.lastIndexOf("}") - 1);
	} else if (commandType == $KT_JS_CALLBACK) {
		defaultcommandstr = command;
	} else if (commandType == $KT_JS_STRING) {
		defaultcommandstr = command;
	} else {
		defaultcommandstr = 'this.ktml.logic_doFormat("' + command + '")';
	}
	this.command = defaultcommandstr;
};
ToolbarButton.prototype.checkFocus = function (obj, mandatory) {
	if (obj.className == "toolbaritem_disabled") {
		return false;
	}
	var propname = '';
	var par = utility.dom.getParentByTagName(obj, 'span');
	if (par) {
		propname = par.id.replace(/Property_/, "");
	}
	if (!par) {
		var par = utility.dom.getParentByTagName(obj, 'div');
		propname = par.parentNode.id;
		propname = propname.replace(/^toolbar_floater_/, '');
		propname = propname.replace(/_([^_]*)$/, '');
	}
	if (propname != this.ktml.name) {
		if (mandatory) {
			alert(translate("not active context"));
			return false;
		}
	}
	if (this.ktml.savedSelection) {
		try {
			this.ktml.savedSelection.select();
		}
		catch(e) {}
	} else {
		this.ktml.cw.focus();
	}
	return true;
};
ToolbarButton.prototype.run = function (e, src) {
	if (this.ktml.toolbar.checkHelp()) {
		if (this.name == "help") {
			this.ktml.toolbar.setHelpMode(false, this);
			return true;
		}
		if (this.name != "about") {
			this.ktml.toolbar.showHelp(this.helpId);
			return false;
		}
	}
	var isFocused = this.checkFocus(src, true);
	if (!isFocused) {
		return;
	}
	eval(this.command);
	this.clearselection();
	utility.popup.force = true;
	utility.popup.removeModal();
	utility.popup.force = false;
};
ToolbarButton.prototype.dispose = function () {
	var button_instance = KTStorage.get(this.assoc);
	if (typeof(button_instance['dispose']) == "function") {
		button_instance.dispose();
		button_instance = null;
	}
};
ToolbarButton.prototype.clearselection = function () {
	if (is.ie) {
		document.selection.clear();
	} else {
		window.getSelection().removeAllRanges();
	}
}
function background_color_command(new_value) {
	var tlb = KTStorage.get(this.toolbar_button);
	tlb.ktml.util_restoreSelection(true);
	var cb = KTStorage.get(this.id);
	if (is.ie) {
		tlb.ktml.edit.execCommand(KtmlGetCommand('backcolor'), false, new_value);
	} else {
		tlb.ktml.util_expandSelection('FONT', ['style', 'background-color: ' + new_value + ';']);
	}
	if (tlb.ktml.undo) {
		tlb.ktml.undo.addEdit();
	}
	this.closeCallback();
};
function background_color_open() {
	var tlb = KTStorage.get(this.toolbar_button);
	var cb = KTStorage.get(this.id);
	if (typeof tlb.ktml.cpalette == 'undefined') {
		var cpaletteSrc = window.KtmlRoot + 'core/js/lib/colorpicker.js';
		KtmlIncludeJs(cpaletteSrc, function () {
			tlb.ktml.cpalette = new ColorPalette(tlb.ktml);
			tlb.params.open.call(cb);
			return;
		});
		return;
	}
	tlb.ktml.cpalette.onSelect = function (new_value) {
		cb.setValue(new_value);
		tlb.params.command.call(cb, cb.value);
	};
	var el = cb.getElement("container");
	tlb.ktml.logic_openPalette(el, cb.value);
};
function background_color_paint() {
	var el = this.getElement("cell");
	el.innerHTML = '<div><img src="' + KtmlRelativeImagePath + 'bgcolor.gif" width="16" height="12" style="display: block;"><span style="display: block;width: 16px;height: 4px;overflow: hidden;margin-bottom: 2px;background-color: ' + this.value + '"></span></div>';
}
function clean_menu_command(new_value) {
	var tlb = KTStorage.get(this.toolbar_button);
	var cb = KTStorage.get(this.id);
	tlb.ktml.logic_doClean(new_value);
	tlb.ktml.displayChanged();
	this.closeCallback();
};
function clean_menu_open() {
	var tlb = KTStorage.get(this.toolbar_button);
	var cb = KTStorage.get(this.id);
	if (typeof(tlb.ktml.cleantypespicker) == "undefined") {
		var cleantypespickerSrc = window.KtmlRoot + 'core/js/lib/cleantypespicker.js';
		KtmlIncludeJs(cleantypespickerSrc, function () {
			tlb.ktml.cleantypespicker = new CleanTypesPicker(tlb.ktml);
			tlb.params.open.call(cb);
			return;
		});
		return;
	}
	tlb.ktml.cleantypespicker.onSelect = function (new_value) {
		cb.setValue(new_value);
		tlb.params.command.call(cb, cb.value);
	};
	tlb.ktml.cleantypespicker.showAtElement(cb.getElement("table"));
	if (is.ie) {
		var _elm = tlb.ktml.cleantypespicker.div;
		var _ktml = tlb.ktml;
		var docObj = _ktml.edit;
		var docBox = _ktml.iframe;
		utility.dom.toggleSpecialTags(_elm, false, 1, docObj, docBox);
	};
};
function clean_menu_paint() {
	var img_src = '<img src="' + KtmlRelativeImagePath;
	if (this.value == "word") {
		img_src += "cleanword";
	} else if (this.value == "formatting") {
		img_src += "clean";
	} else if (this.value == "all") {
		img_src += "cleanalltags";
	} else if (this.value == "css") {
		img_src += "cleancss";
	}
	img_src += '.gif" width="16" height="16" ' + (is.ie ? 'style="margin-bottom:-2px;"' : '') + '> ';
	var el = this.getElement("cell");
	el.innerHTML = img_src;
	el = this.getElement("table");
	el.title = translate(this.value, KTStorage.get(this.toolbar_button).ktml.config.UILanguage);
};
function hyperlink_picker_command(new_value) {
	var tlb = KTStorage.get(this.toolbar_button);
	tlb.ktml.logic_InsertLink();
};
function hyperlink_picker_open() {
	var tlb = KTStorage.get(this.toolbar_button);
	var linksSrc = tlb.ktml.getModuleProperty("hyperlink_browser", "ServiceProvider");
	if (!linksSrc) {
		return;
	}
	var cb = KTStorage.get(this.id);
	if (typeof(tlb.ktml.hyperlinkPicker) == "undefined") {
		var hyperlinkPickerSrc = window.KtmlRoot + 'core/js/lib/hyperlinkpicker.js';
		KtmlIncludeJs(hyperlinkPickerSrc, function () {
			tlb.ktml.hyperlinkPicker = new HyperlinkPicker(tlb.id, linksSrc);
			tlb.params.open.call(cb);
			return;
		});
		return;
	}
	tlb.ktml.hyperlinkPicker.onSelect = function (url, title) {
		cb.setValue({
			url: url,
			title: title
		});
		tlb.ktml.logic_InsertLink(url, title);
	};
	tlb.ktml.hyperlinkPicker.showAtElement(cb.getElement("table"));
	if (is.ie) {
		utility.dom.toggleSpecialTags(tlb.ktml.hyperlinkPicker.container, false, 1, ktml.edit, ktml.iframe);
	};
};
function insert_table_command(new_value) {
	if (!new_value || new_value && (new_value.cx == 0) || new_value && (new_value.cy == 0)) {
		return;
	}
	var table_html = '<table cellpadding="2" cellspacing="2" summary="Table Summary" border="1" width="100%">\r\n';
	for (var i = 0; i < new_value.cy; i++) {
		table_html += '<tr>\r\n';
		for (var j = 0; j < new_value.cx; j++) {
			table_html += '<td>&nbsp;</td>\r\n';
		}
		table_html += '</tr>\r\n';
	}
	table_html += '</table>';
	var tlb = KTStorage.get(this.toolbar_button);
	if (is.mozilla) table_html += '<br />';
	tlb.ktml.insertHTML(table_html, is.mozilla ? "after" : "first-leaf");
	var _assoc_combo = KTStorage.get(tlb.assoc);
	if (_assoc_combo) {
		_assoc_combo.getTitle();
	};
};
function insert_table_open() {
	var tlb = KTStorage.get(this.toolbar_button);
	var cb = KTStorage.get(this.id);
	if (typeof tlb.ktml.inserttablepicker == 'undefined') {
		var inserttablepickerSrc = window.KtmlRoot + 'core/js/lib/inserttable.js';
		KtmlIncludeJs(inserttablepickerSrc, function () {
			tlb.ktml.inserttablepicker = new InsertTablePicker(tlb.ktml);
			tlb.params.open.call(cb);
		});
		return;
	}
	tlb.ktml.inserttablepicker.onSelect = function (new_value) {
		cb.setValue(new_value);
		tlb.params.command.call(cb, cb.value);
	};
	tlb.ktml.inserttablepicker.showAtElement(cb.getElement("table"));
	if (is.ie) {
		utility.dom.toggleSpecialTags(tlb.ktml.inserttablepicker.div, false, 1, tlb.ktml.edit, tlb.ktml.iframe);
	};
};
function insert_table_paint() {
	var el = this.getElement("cell");
	el.innerHTML = '<img src="' + KtmlRelativeImagePath + 'insert_table.gif" width="16" height="16">';
	el = this.getElement("table");
	el.title = this.getTitle();
};
function insert_table_getTitle() {
	var ktml = KTStorage.get(this.toolbar_button).ktml;
	var title = translate("insert_table", ktml.config.UILanguage);
	var secTitle = translate(this.title, ktml.config.UILanguage);
	secTitle = secTitle.replace(/\d+/g, '%s');
	secTitle = utility.string.sprintf(secTitle, this.value.cy, this.value.cx);
	this.setTooltip(secTitle, title);
	return secTitle;
};
function insert_character_command(new_value) {
	var tlb = KTStorage.get(this.toolbar_button);
	tlb.ktml.insertHTML(new_value, is.mozilla ? "after" : "");
};
function insert_character_open() {
	var tlb = KTStorage.get(this.toolbar_button);
	var cb = KTStorage.get(this.id);
	if (typeof(tlb.ktml.charpalette) == "undefined") {
		var charpaletteSrc = window.KtmlRoot + 'core/js/lib/characterpicker.js';
		KtmlIncludeJs(charpaletteSrc, function () {
			tlb.ktml.charpalette = new CharacterPalette(tlb.ktml);
			tlb.params.open.call(cb);
			return;
		});
		return;
	}
	tlb.ktml.charpalette.onSelect = function (new_value) {
		cb.setValue(new_value);
		tlb.params.command.call(cb, cb.value);
	};
	tlb.ktml.logic_openCharacterPalette(cb.getElement("table"), cb.value);
	if (is.ie) {
		utility.dom.toggleSpecialTags(tlb.ktml.charpalette.div, false, 1, tlb.ktml.edit, tlb.ktml.iframe);
	};
};
function insert_character_paint() {
	var el = this.getElement("cell");
	el.innerHTML = '<div style="margin-top: -1px;width: 14px;font-size: 14px;line-height: 12px !important;">' + this.value + '</div>';
}
KtmlToolbarRows = {
	'standard': '1',
	'formatting': '1',
	'insert': '2',
	'styles': '2',
	'form': '3'
};
KtmlToolbarButtonsIndexMap = {
	'about': 0,
	'align_center': 1,
	'align_justify': 2,
	'align_left': 3,
	'align_right': 4,
	'bold': 7,
	'bulleted_list': 8,
	'clean_menu': 9,
	'copy': 10,
	'cut': 11,
	'find_replace': 12,
	'fontsize_list': 13,
	'fonttype_list': 14,
	'heading_list': 16,
	'help': 17,
	'indent': 19,
	'insert_anchor': 20,
	'insert_label': 31,
	'insert_listmenu': 33,
	'insert_table': 35,
	'italic': 39,
	'numbered_list': 40,
	'outdent': 41,
	'paste': 42,
	'redo': 43,
	'spellcheck': 44,
	'style_list': 45,
	'subscript': 46,
	'superscript': 47,
	'toggle_editmode': 48,
	'toggle_fullscreen': 49,
	'toggle_visible': 50,
	'underline': 51,
	'undo': 52,
	'toggle_properties_inspector': 53,
	'csforeground': 54,
	'csbackground': 55,
	'csimage': 56,
	'cslink': 57,
	'cssnippet': 58,
	'csfield': 59,
	'cshr': 60,
	'cscharacter': 61
};
function KtmlDefaultButtons() {
	function opt(obj1, obj2) {
		var tmp = {};
		for (var i in obj1) {
			tmp[i] = obj1[i];
		}
		for (var i in obj2) {
			tmp[i] = obj2[i];
		}
		return tmp;
	}
	var tmp = [];
	/*
	stdIconList = "cut.gif,copy.gif,paste.gif,undo.gif,redo.gif,find.gif,toggle_visible.gif,toggle_editmode.gif,toggle_fullscreen.gif,help.gif";
	formtIconList = "bold.gif,italic.gif,under.gif,left.gif,center.gif,right.gif,justify.gif,numlist.gif,bullist.gif,deindent.gif,inindent.gif,blank.gif,fgcolor.gif,csbgcolor.gif,superscript.gif,subscript.gif";
	stylIconList = "blank.gif,blank.gif,blank.gif,blank.gif";

	insertIcontList = "cslink.gif,csimage.gif,instable.gif,snippet.gif,inserthr.gif,insertspecial.gif,csfield.gif";

*/
	var options = {
		'command_type': $KT_CMD_ID,
		'button_type': 'img'
	};
	tmp.push(new ToolbarButton(opt(options, {
		'name': 'spellcheck',
		'help': 'spellcheck_button'
	})));
	tmp.push(new ToolbarButton(opt(options, {
		'name': 'cut'
	})));
	tmp.push(new ToolbarButton(opt(options, {
		'name': 'copy',
		'help': 'copy_button'
	})));
	tmp.push(new ToolbarButton(opt(options, {
		'name': 'paste'
	})));
	tmp.push(new ToolbarButton(opt(options, {
		'name': 'find_replace',
		'help': 'findreplace_button',
		'command_type': $KT_JS_STRING,
		'command_string': "this.ktml.logic_FindReplace()"
	})));
	tmp.push(new ToolbarButton(opt(options, {
		'name': 'undo',
		'command_id': 'undo'
	})));
	tmp.push(new ToolbarButton(opt(options, {
		'name': 'redo',
		'command_id': 'redo'
	})));
	tmp.push(new ToolbarButton(opt(options, {
		'name': 'toggle_visible',
		'help': 'show_hide_html',
		'command_id': 'toggle_visible'
	})));
	tmp.push(new ToolbarButton(opt(options, {
		'name': 'toggle_editmode',
		'help': 'show_hide_table_borders',
		'command_id': 'toggle_editmode'
	})));
	tmp.push(new ToolbarButton(opt(options, {
		'name': 'toggle_properties_inspector',
		button_type: 'img',
		help: 'show_hide_property_inspector',
		'command_type': $KT_JS_STRING,
		'command_string': 'this.ktml.logic_togglePIDisplay()',
		'alt_image': 'pi.gif',
		'group': 'standard',
		'button_icon': KtmlRelativeImagePath + 'pi.gif'
	})));
	tmp.push(new ToolbarButton(opt(options, {
		'name': 'csforeground',
		button_type: 'img',
		help: 'text_color',
		'command_type': $KT_JS_STRING,
		'command_string': "this.ktml.logic_openCSColorPalette('f')",
		'alt_image': 'fgcolor.gif',
		'group': 'format',
		'button_icon': KtmlRelativeImagePath + 'fgcolor.gif'
	})));
	tmp.push(new ToolbarButton(opt(options, {
		'name': 'csbackground',
		button_type: 'img',
		help: 'background_color',
		'command_type': $KT_JS_STRING,
		'command_string': "this.ktml.logic_openCSColorPalette('b')",
		'alt_image': 'bgcolor.gif',
		'group': 'format',
		'button_icon': KtmlRelativeImagePath + 'bgcolor.gif'
	})));
	tmp.push(new ToolbarButton(opt(options, {
		'name': 'cssnippet',
		button_type: 'img',
		help: 'insert_snippets',
		'command_type': $KT_JS_STRING,
		'command_string': "this.ktml.logic_snippetOnClick()",
		'alt_image': 'snippet.gif',
		'group': 'format',
		'button_icon': KtmlRelativeImagePath + 'snippet.gif'
	})));
	tmp.push(new ToolbarButton(opt(options, {
		'name': 'csfield',
		button_type: 'img',
		help: 'insert_field',
		'command_type': $KT_JS_STRING,
		'command_string': 'this.ktml.logic_fieldOnClick()',
		'alt_image': 'csfield.gif',
		'group': 'insert',
		'button_icon': KtmlRelativeImagePath + 'csfield.gif'
	})));
	tmp.push(new ToolbarButton(opt(options, {
		'name': 'cslink',
		button_type: 'img',
		help: 'adding_removing_hyperlinks',
		'command_type': $KT_JS_STRING,
		'command_string': 'this.ktml.logic_linkOnClick()',
		'alt_image': 'cslink.gif',
		'group': 'insert',
		'button_icon': KtmlRelativeImagePath + 'cslink.gif'
	})));
	tmp.push(new ToolbarButton(opt(options, {
		'name': 'csimage',
		button_type: 'img',
		help: 'insert_image',
		'command_type': $KT_JS_STRING,
		'command_string': 'this.ktml.logic_imageOnClick()',
		'alt_image': 'csimage.gif',
		'group': 'insert',
		'button_icon': KtmlRelativeImagePath + 'csimage.gif'
	})));
	tmp.push(new ToolbarButton(opt(options, {
		'name': 'toggle_fullscreen',
		'help': 'toggle_fullscreen',
		'command_type': $KT_JS_STRING,
		'command_string': 'this.ktml.toggleFullScreen()'
	})));
	tmp.push(new ToolbarButton(opt(options, {
		'name': 'help',
		'command_id': 'help',
		'command_type': $KT_JS_STRING,
		'command_string': 'if (this.ktml.toolbar.getHelpMode()) {this.ktml.toolbar.setHelpMode(false, this);}else{this.ktml.toolbar.setHelpMode(true, this);}'
	})));
	options = {
		'command_type': $KT_CMD_ID,
		'button_type': 'img'
	};
	tmp.push(new ToolbarButton(opt(options, {
		'name': 'bold',
		'command_id': KtmlGetCommand('bold')
	})));
	tmp.push(new ToolbarButton(opt(options, {
		'name': 'italic',
		'command_id': KtmlGetCommand('italic')
	})));
	tmp.push(new ToolbarButton(opt(options, {
		'name': 'underline',
		'command_id': KtmlGetCommand('underline')
	})));
	tmp.push(new ToolbarButton(opt(options, {
		'name': 'superscript',
		'command_id': KtmlGetCommand('superscript')
	})));
	tmp.push(new ToolbarButton(opt(options, {
		'name': 'subscript',
		'command_id': KtmlGetCommand('subscript')
	})));
	tmp.push(new ToolbarButton(opt(options, {
		'name': 'align_left',
		'command_id': KtmlGetCommand('justifyleft'),
		'command_type': $KT_CMD_ID,
		'command_string': 'JustifyLeft'
	})));
	tmp.push(new ToolbarButton(opt(options, {
		'name': 'align_center',
		'command_id': KtmlGetCommand('justifycenter'),
		'command_type': $KT_CMD_ID,
		'command_string': 'JustifyCenter',
		'help':'center'
	})));
	tmp.push(new ToolbarButton(opt(options, {
		'name': 'align_right',
		'command_id': KtmlGetCommand('justifyright'),
		'command_type': $KT_CMD_ID,
		'command_string': 'JustifyRight'
	})));
	tmp.push(new ToolbarButton(opt(options, {
		'name': 'align_justify',
		'command_id': KtmlGetCommand('justifyfull'),
		'command_type': $KT_CMD_ID,
		'command_string': 'JustifyFull',
		'help':'justify'
	})));
	tmp.push(new ToolbarButton(opt(options, {
		'name': 'numbered_list',
		'command_id': KtmlGetCommand('orderlist'),
		'command_type': $KT_CMD_ID,
		'command_string': 'InsertOrderedList'
	})));
	tmp.push(new ToolbarButton(opt(options, {
		'name': 'bulleted_list',
		'command_id': KtmlGetCommand('unorderlist'),
		'command_type': $KT_CMD_ID,
		'command_string': 'InsertUnorderedList'
	})));
	tmp.push(new ToolbarButton(opt(options, {
		'name': 'indent',
		'help':'increase_decrease_indent'
	})));
	tmp.push(new ToolbarButton(opt(options, {
		'name': 'outdent',
		'help':'increase_decrease_indent'
	})));
	options = {
		'command_type': $KT_JS_STRING,
		'button_type': 'select'
	};
	tmp.push(new ToolbarButton(opt(options, {
		'name': 'heading_list',
		'alt_text': 'Format',
		'help': 'applying_formatting_styles',
		'command_id': KtmlGetCommand('blockfmt'),
		'command_string': "this.ktml.logic_doFormat('InsertHeading',this.value)"
	}), {
		'options': [{
			'value': '',
			'text': '||Normal||',
			'attributes': {
				'HTMLValue': '||Normal||'
			}
		},{
			'value': '<DIV>',
			'text': 'div',
			'attributes': {
				'HTMLValue': '<div style="margin: 0px 0px 0px 0px">Div</div>'
			}
		},{
			'value': '<p>',
			'text': 'Paragraph',
			'attributes': {
				'HTMLValue': '<p style="margin: 0px 0px 0px 0px">Paragraph</p>'
			}
		},{
			'value': '<h1>',
			'text': 'Heading 1',
			'attributes': {
				'HTMLValue': '<h1 style="margin: 0px 0px 0px 0px">Heading 1</h1>'
			}
		},{
			'value': '<h2>',
			'text': 'Heading 2',
			'attributes': {
				'HTMLValue': '<h2 style="margin: 0px 0px 0px 0px">Heading 2</h2>'
			}
		},{
			'value': '<h3>',
			'text': 'Heading 3',
			'attributes': {
				'HTMLValue': '<h3 style="margin: 0px 0px 0px 0px">Heading 3</h3>'
			}
		},{
			'value': '<h4>',
			'text': 'Heading 4',
			'attributes': {
				'HTMLValue': '<h4 style="margin: 0px 0px 0px 0px">Heading 4</h4>'
			}
		},{
			'value': '<h5>',
			'text': 'Heading 5',
			'attributes': {
				'HTMLValue': '<h5 style="margin: 0px 0px 0px 0px">Heading 5</h5>'
			}
		},{
			'value': '<h6>',
			'text': 'Heading 6',
			'attributes': {
				'HTMLValue': '<h6 style="margin: 0px 0px 0px 0px">Heading 6</h6>'
			}
		},{
			'value': '<address>',
			'text': 'Address',
			'attributes': {
				'HTMLValue': '<address style="margin: 0px 0px 0px 0px">Address</address>'
			}
		},{
			'value': '<pre>',
			'text': 'Formatted',
			'attributes': {
				'HTMLValue': '<pre style="margin: 0px 0px 0px 0px">Formatted</pre>'
			}
		}]
	}));
	tmp.push(new ToolbarButton(opt(options, {
		'name': 'style_list',
		'alt_text': 'Style',
		'help': 'css_styles',
		'command_string': 'alert("CSS module not available!")'
	}), {
		'options': [{
			'value': '',
			'text': '||No Style||',
			'attributes': {
				'HTMLValue': '||No Style||'
			}
		}]
	}));
	var fonttype_options = [{
		'value': '',
		'text': "||Default Font Face||",
		'attributes': {
			'HTMLValue': "||Default Font Face||"
		}
	}];
	var config_fonttypes_string = util_defaultValue($KTML4_GLOBALS['fonts'], null);
	if (config_fonttypes_string != null) {
		config_fonttypes_string = config_fonttypes_string.split("|");
		var config_fonttypes = [];
		var one_font = '';
		for (var i = 0; i < config_fonttypes_string.length; i++) {
			one_font = config_fonttypes_string[i].replace(/[";]/gi, '');
			config_fonttypes.push({
				value: one_font,
				text: one_font,
				attributes: {
					HTMLValue: '<font face="' + one_font + '">' + one_font + '</font>'
				}
			});
		}
		fonttype_options = fonttype_options.concat(config_fonttypes);
	} else {
		var default_fonttypes = [{
			'value': 'Arial, Helvetica, sans-serif',
			'text': 'Arial, Helvetica, sans-serif',
			'attributes': {
				'HTMLValue': '<font face="Arial, Helvetica, sans-serif">Arial, Helvetica, sans-serif</font>'
			}
		},{
			'value': 'Times New Roman, Times, serif',
			'text': 'Times New Roman, Times, serif',
			'attributes': {
				'HTMLValue': '<font face="Times New Roman, Times, serif">Times New Roman, Times, serif</font>'
			}
		},{
			'value': 'Courier New, Courier, mono',
			'text': 'Courier New, Courier, mono',
			'attributes': {
				'HTMLValue': '<font face="Courier New, Courier, mono">Courier New, Courier, mono</font>'
			}
		},{
			'value': 'Georgia',
			'text': 'Georgia',
			'attributes': {
				'HTMLValue': '<font face="Georgia">Georgia</font>'
			}
		},{
			'value': 'Verdana, Helvetica',
			'text': 'Verdana, Helvetica',
			'attributes': {
				'HTMLValue': '<font face="Verdana, Helvetica">Verdana, Helvetica</font>'
			}
		},{
			'value': 'System',
			'text': 'System',
			'attributes': {
				'HTMLValue': '<font face="System">System</font>'
			}
		}];
		fonttype_options = fonttype_options.concat(default_fonttypes);
	}
	tmp.push(new ToolbarButton(opt(options, {
		'name': 'fonttype_list',
		'alt_text': 'Font Face',
		'help': 'font_face',
		'command_string': "this.ktml.logic_doFormat('fonttype',this.value)"
	}), {
		'options': fonttype_options
	}));
	tmp.push(new ToolbarButton(opt(options, {
		'name': 'fontsize_list',
		'alt_text': 'Font Size',
		'help': 'font_size',
		'command_string': "this.ktml.logic_doFormat('fontsize',this.value)"
	}), {
		'options': [{
			'value': '',
			'text': '||Font Size||',
			'attributes': {
				'HTMLValue': "||Font Size||"
			}
		},{
			'value': '1',
			'text': '8px',
			'attributes': {
				'HTMLValue': '<font size="1">1 (8px)</font>'
			}
		},{
			'value': '2',
			'text': '11px',
			'attributes': {
				'HTMLValue': '<font size="2">2 (11px)</font>'
			}
		},{
			'value': '3',
			'text': '14px',
			'attributes': {
				'HTMLValue': '<font size="3">3 (14px)</font>'
			}
		},{
			'value': '4',
			'text': '16px',
			'attributes': {
				'HTMLValue': '<font size="4">4 (16px)</font>'
			}
		},{
			'value': '5',
			'text': '20px',
			'attributes': {
				'HTMLValue': '<font size="5">5 (20px)</font>'
			}
		},{
			'value': '6',
			'text': '24px',
			'attributes': {
				'HTMLValue': '<font size="6">6 (24px)</font>'
			}
		}]
	}));
	tmp.push(new ToolbarButton(opt(options, {
		'name': 'clean_menu',
		'alt_text': 'Clean HTML Content',
		'help': 'clean_html_content',
		'button_type': "combo",
		'alt_image': "cleanword.gif",
		'default_value': 'word'
	}), {
		'command': clean_menu_command,
		'open': clean_menu_open,
		'paint': clean_menu_paint
	}));
	options = {
		'command_type': $KT_JS_STRING,
		'button_type': 'img'
	};
	tmp.push(new ToolbarButton(opt(options, {
		'name': 'insert_anchor',
		'command_type': $KT_CMD_ID,
		'command_id': KtmlGetCommand('insert_anchor')
	})));
	tmp.push(new ToolbarButton(opt(options, {
		'name': 'insert_table',
		'button_type': "combo",
		'alt_text': "Insert %s x %s Table",
		'default_value': {
			cx: 2,
			cy: 2
		}
	}), {
		'command': insert_table_command,
		'open': insert_table_open,
		'paint': insert_table_paint,
		'title': insert_table_getTitle
	}));
	tmp.push(new ToolbarButton(opt(options, {
		'name': 'cshr',
		button_type: 'img',
		help: 'insert_horizontal_rule',
		'command_type': $KT_JS_STRING,
		'command_string': 'this.ktml.logic_hrOnClick()',
		'alt_image': 'inserthr.gif',
		'group': 'insert',
		'button_icon': KtmlRelativeImagePath + 'inserthr.gif'
	})));
	tmp.push(new ToolbarButton(opt(options, {
		'name': 'cscharacter',
		button_type: 'img',
		help: 'insert_special_character',
		'command_type': $KT_JS_STRING,
		'command_string': 'this.ktml.logic_openChrPalette()',
		'alt_image': 'insertspecial.gif',
		'group': 'insert',
		'button_icon': KtmlRelativeImagePath + 'insertspecial.gif'
	})));
	return tmp;
};
function ToolbarNameGenerator(toolbar) {
	this.toolbar = toolbar;
	this.uid = new UIDGenerator("toolbar_" + toolbar.owner.name);
};
ToolbarNameGenerator.prototype.gen = function () {
	return this.uid.generate();
};
function Toolbar(element, element2, owner) {
	KTStorage.add(this);
	this.after_actions = [];
	this.owner = owner;
	this.base = element;
	this.buttons = new Array();
	this.buttonobjects = new Array();
	this.lateLoaded = false;
	this.deferredcommands = {};
	this.deferredfunctors = [];
	this.name_generator = new ToolbarNameGenerator(this);
	this.groups = {};
	this.rows = [];
	this.helpMode = false;
	this.loadConfig();
};
Toolbar.prototype.addAfterAction = function (functor) {
	this.after_actions.push(functor);
};
Toolbar.prototype.initializeUI = function () {
	this.base.innerHTML = "";
};
function toolbar_mousedown(e, btn_id) {
	var button = KTStorage.get(btn_id);
	if (button.state == 0) {
		return;
	}
	button.getElement("container").className = "toolbaritem_inset";
};
function toolbar_mouseup(e, btn_id) {
	var button = KTStorage.get(btn_id);
	if (button.state == 0) {
		return;
	}
	button.getElement("container").className = button.state == 0 ? "toolbaritem_latched" : "toolbaritem_outset";
	var tlb = KTStorage.get(button.toolbar_button);
	var o = utility.dom.setEventVars(e);
	tlb.run(o.e, o.targ);
	utility.dom.stopEvent(o.e);
	return false;
};
function toolbar_mouseover(e, btn_id) {
	var button = KTStorage.get(btn_id);
	if (button.state == 0) {
		return;
	}
	button.getElement("container").className = "toolbaritem_outset";
};
function toolbar_mouseout(e, btn_id) {
	var button = KTStorage.get(btn_id);
	if (button.state == 0) {
		return;
	}
	button.getElement("container").className = button.state == 2 ? "toolbaritem_latched" : "toolbaritem_flat";
};
Toolbar.prototype.showFloater = function (group_id, o) {
	var pos = utility.dom.getBox(o.targ);
	var obj = this;
	var floater = null;
	var floater_id = 'toolbar_floater_' + this.owner.name + '_' + group_id;
	var div_id = floater_id + '_div';
	var sep_image_id = floater_id + '_image';
	if (this.groups[group_id]['floater'] == null) {
		floater = utility.dom.createElement('div', {
			'className': 'div_floater',
			'id': floater_id
		});
		floater.innerHTML = '\
   <div id="' + div_id + '" ></div>\
   <div style="clear:both;text-align: center;vertical-align: center;"><img class="sep" id="' + sep_image_id + '" src="' + KtmlRelativeImagePath + 's.gif"/></div>\
   <div class="open">\
   <nobr>' + translate("Add/Remove Buttons", this.owner.config.UILanguage); + '</nobr>\
   </div>\
  ';
		floater = this.base.appendChild(floater);
		if (is.mozilla && is.mac) {
			floater.style.overflow = "auto";
		}
		utility.dom.attachEvent(floater, 'onmouseover', function (e) {
			obj.owner.preserveSelection(true);
		});
		utility.dom.attachEvent(floater, 'onmouseout', function (e) {
			obj.owner.preserveSelection(false);
		});
		this.groups[group_id]['floater'] = floater;
		var obj = this;
		var action = floater.getElementsByTagName('div')[2];
		utility.dom.attachEvent(action, 'onmouseup', function (e) {
			obj.openToolbarConfig(group_id);
		});
		utility.dom.attachEvent(action, 'onmouseover', function (e) {
			utility.dom.classNameAdd(action, 'highlight');
		});
		utility.dom.attachEvent(action, 'onmouseout', function (e) {
			utility.dom.classNameRemove(action, 'highlight');
		});
	} else {
		floater = this.groups[group_id]['floater'];
	}
	var buttons = this.groups[group_id].buttons;
	var button_instance = null;
	var move_it = false;
	var cnt = 0;
	for (var i = 0; i < buttons.length; i++) {
		button_instance = KTStorage.get(buttons[i].assoc);
		if (this.config_display_buttons[buttons[i].name] && buttons[i].in_floater) {
			cnt++;
			this.moveButton(group_id, button_instance, 'floater');
			button_instance.setVisible(true);
		}
	}
	this.groups[group_id]['display_hidden'] = 1;
	floater.style.top = '-20000px';
	floater.style.display = '';
	document.getElementById(sep_image_id).style.display = cnt ? "" : "none";
	utility.dom.putElementAt(floater, o.targ, '03');
	floater.style.zIndex = 10;
	utility.popup.makeModal(function () {
		obj.hideFloater(group_id, false);
	}, floater);
	if (is.ie) {
		var _ktml = this.owner;
		var docObj = _ktml.edit;
		var docBox = _ktml.iframe;
		utility.dom.toggleSpecialTags(floater, false, 1, docObj, docBox);
	};
};
Toolbar.prototype.moveButton = function (group_id, button, where) {
	if (where == 'floater') {
		var div_id = 'toolbar_floater_' + this.owner.name + '_' + group_id + '_div';
		var div = document.getElementById(div_id);
		var container = button.getElement("container");
		container.parentNode.style.display = "none";
		div.appendChild(container);
	} else {
		var div = document.getElementById("toolbar_button_container_" + KTStorage.get(button.toolbar_button).id);
		var container = button.getElement("container");
		div.appendChild(container);
		container.parentNode.style.display = "";
	}
};
Toolbar.prototype.hideFloater = function (group_id, force) {
	if (!this.groups[group_id]['display_hidden']) {
		return;
	};
	for (var i = 0; i < this.groups[group_id].buttons.length; i++) {
		var button = this.groups[group_id].buttons[i];
		if (button.in_floater) {
			var button_instance = KTStorage.get(button.assoc);
			button_instance.setVisible(false);
			this.moveButton(group_id, button_instance, 'back');
		}
	}
	this.groups[group_id]['floater'].style.display = 'none';
	this.groups[group_id]['display_hidden'] = false;
	this.Resize();
};
Toolbar.toggleHiddenButtons = function (e, toolbar_id, group_id) {
	var o = utility.dom.setEventVars(e);
	var tlb = KTStorage.get(toolbar_id);
	if (!tlb.groups[group_id]['display_hidden']) {
		tlb.showFloater(group_id, o);
	}
};
Toolbar.prototype.addBuiltinButtons = function (arr) {
	ToolbarRowTemplate = '\
 <table class="toolbar_table" id="@@id@@" cellspacing="0" cellpadding="0" border="0">\
  <tbody>\
   <tr>\
    @@content@@\
   </tr>\
  </tbody>\
 </table>\
 ';
	ToolbarGroupTemplate = '\
 <td>\
 <div class="toolbar_group">\
  <table class="toolbar_icons" id="@@id@@" cellspacing="0" cellpadding="0" border="0">\
   <tbody>\
    <tr>\
     <td class="toolbar_left"><div style="width:6px !important; height:1px !important; border-width:0px !important; margin: 0px !important; padding:0px !important; overflow:hidden !important;"></div></td>\
     <td class="toolbar_icon_td">\
      <div class="toolbar_icon_container" id="@@id@@_element" style="width:@@toolbar_icon_container_width@@;">\
      <table cellspacing="0" cellpadding="0" border="0">\
       <tr>\
        @@content@@\
       </tr>\
      </table>\
      </div>\
     </td>\
     <td class="toolbar_right" title="' + translate("Show/Hide Buttons", this.owner.config.UILanguage) + '" onmouseup="Toolbar.toggleHiddenButtons(event, \'@@toolbar_id@@\', \'@@group_name@@\');"><div style="width:13px !important; height:1px !important; border-width:0px !important; margin: 0px !important; padding:0px !important; overflow:hidden !important;"></div></td>\
    </tr>\
   </tbody>\
  </table>\
 </div>\
 </td>\
 ';
	ToolbarHtmlString = [];
	var rows = [];
	for (var i = 0; i < arr.length; i++) {
		var row = arr[i];
		var rowIndex = row[0];
		if (typeof rows[rowIndex] == 'undefined') {
			rows[rowIndex] = [];
		}
		rows[rowIndex].push(row[1]);
	}
	var inserted_rows = [];
	var inserted_groups = [];
	for (var i = 0; i < arr.length; i++) {
		if (!arr[i] || !arr[i][2] || !arr[i][2].length) {
			continue;
		}
		var row = arr[i];
		var rowIndex = row[0];
		var rowLogicIndex = rowIndex - 1;
		var groupName = row[1];
		var _tmp = ToolbarRowTemplate;
		if (Array_indexOf(inserted_rows, rowIndex) < 0) {
			_tmp = ToolbarRowTemplate.replace("@@id@@", "Toolbar_row_" + rowIndex + "_" + this.owner.name);
			this.rows[rowLogicIndex] = {
				'index': rowIndex,
				'element': null,
				'groups': [],
				'_string': _tmp
			};
			inserted_rows.push(rowIndex);
		}
		var _tmp = ToolbarGroupTemplate;
		var group_id = '';
		if (Array_indexOf(inserted_groups, groupName) < 0) {
			group_id = "Toolbar_group_" + groupName + "_" + this.owner.name;
			_tmp = _tmp.replace(/@@toolbar_id@@/g, this.id);
			_tmp = _tmp.replace(/@@group_name@@/g, groupName);
			_tmp = _tmp.replace(/@@id@@/g, group_id);
			var groupDescriptor = {
				'name': groupName,
				'element': group_id + '_element',
				'display_hidden': false,
				'floater': null,
				'buttons': [],
				'width': 0,
				'button_strings': [],
				'row': rowIndex,
				'_string': _tmp,
				'_buttons': []
			};
			this.groups[groupName] = groupDescriptor;
			inserted_groups.push(groupName);
			this.rows[rowLogicIndex].groups.push(groupName);
		}
	}
	var reference = KtmlDefaultButtons();
	var existing_groups = [];
	for (var x = 0; x < arr.length; x++) {
		Array_push(existing_groups, arr[x][1]);
	};
	var _standard_Exists = (Array_indexOf(existing_groups, "standard") >= 0) ? true : false;
	var _targGroupName = _standard_Exists ? "standard" : existing_groups[0];
	var _aboutBtnObj = null;
	for (var y = 0; y < reference.length; y++) {
		if (reference[y].name == "about") {
			_aboutBtnObj = reference[y];
			break;
		}
	}
	var _addedAbout = true;
	for (var i = 0; i < arr.length; i++) {
		var row = arr[i];
		var _thisGroupName = row[1];
		for (var j = 0; j < row[2].length; j++) {
			for (var k = 0; k < reference.length; k++) {
				if (row[2][j] == reference[k].name) {
					reference[k].group = _thisGroupName;
					reference[k].ktml = this.owner;
					this.addButton(reference[k]);
					break;
				}
			}
		}
	}
	var _tmp2 = '';
	var row_width = this.owner.width - 2 - 9 - 2;
	var drawableRowWidth = 0;
	var drawableIconWidth = 0;
	var visible_buttons_width = 0;
	for (var row_index = 0; row_index < this.rows.length; row_index++) {
		var row = this.rows[row_index];
		if (!row) {
			continue
		};
		var num_groups = row.groups.length;
		drawableRowWidth = row_width - num_groups * 6;
		drawableIconWidth = (drawableRowWidth - row.groups.length * (6 + 13 + 4));
		visible_buttons_width = 0;
		var _tmp = '';
		var group_index = 0;
		var all_buttons = 0;
		for (group_index = 0; group_index < row.groups.length; group_index++) {
			var groupName = row.groups[group_index];
			var group = this.groups[groupName];
			group.width = 0;
			group.occupiedSpace = 0;
			for (var i = 0; i < group.buttons.length; i++) {
				var button = group.buttons[i];
				if (this.config_display_buttons[button.name]) {
					group.occupiedSpace += button.width;
				}
			}
			visible_buttons_width += group.occupiedSpace;
			all_buttons += group.buttons.length;
		}
		visible_buttons_width = visible_buttons_width || 1;
		for (group_index = 0; group_index < row.groups.length; group_index++) {
			var groupName = row.groups[group_index];
			var group = this.groups[groupName];
			if (group.name == 'standard' || group.name == 'insert') group.availableSpace = group.occupiedSpace;
			else group.availableSpace = Math.floor(drawableIconWidth * group.occupiedSpace / visible_buttons_width);
		}
		var button_index = 0;
		group_index = 0;
		var added_buttons = 0;
		var cat_au_butoanele_din_row_pana_acum = 0;
		while (added_buttons < all_buttons) {
			for (group_index = 0; group_index < row.groups.length; group_index++) {
				var groupName = row.groups[group_index];
				var group = this.groups[groupName];
				if (button_index >= group.buttons.length) {
					continue;
				}
				var button = group.buttons[button_index];
				var target_group_width = group.width + button.width;
				var target_row_width = cat_au_butoanele_din_row_pana_acum + button.width;
				if (!this.config_display_buttons[button.name]) {
					this.setButtonDisplay(button, false);
					button.in_floater = false;
				} else if (target_group_width > group.availableSpace || target_row_width > drawableIconWidth) {
					this.setButtonDisplay(button, false);
					button.in_floater = true;
					if (target_group_width > group.availableSpace) {
						if (!group.substracted_partial_button_width) {
							group.substracted_partial_button_width = true;
							var nextGroupName = row.groups[group_index + 1];
							if (nextGroupName) {
								var nextGroup = this.groups[nextGroupName];
								nextGroup.availableSpace += (group.availableSpace - group.width);
							}
						}
					}
				} else {
					this.setButtonDisplay(button, true);
					button.in_floater = false;
					group.width += button.width;
					cat_au_butoanele_din_row_pana_acum += button.width;
				}
				added_buttons++;
				group.button_strings.push('<td id="toolbar_button_container_' + button.id + '">' + group._buttons[button_index] + '</td>');
			}
			button_index++;
		}
		for (group_index = 0; group_index < row.groups.length; group_index++) {
			var groupName = row.groups[group_index];
			var group = this.groups[groupName];
			group._string = group._string.replace("@@content@@", group.button_strings.join("\r\n"));
			group._string = group._string.replace("@@toolbar_icon_container_width@@", (group.width) + "px");
			_tmp += group._string;
		}
		row._string = row._string.replace("@@content@@", _tmp);
		_tmp2 += row._string;
	}
	this.base.innerHTML = _tmp2;
	for (var i = 0; i < this.after_actions.length; i++) {
		this.after_actions[i]();
	}
};
Toolbar.prototype.addCustomButtons = function (arr) {
	for (var i = 0; i < arr.length; i++) {
		this.insertButtonAfter(arr[i][0], arr[i][1], arr[i][2]);
	}
};
Toolbar.prototype.Resize = function () {
	var row_width = this.owner.width - 13;
	var drawableRowWidth = 0;
	var drawableIconWidth = 0;
	var visible_buttons_width = 0;
	for (var row_index = 0; row_index < this.rows.length; row_index++) {
		var row = this.rows[row_index];
		if (!row) {
			continue;
		}
		var num_groups = row.groups.length;
		drawableRowWidth = row_width - (num_groups * 6);
		//alert('6700--'+num_groups+'\nrow_width--'+row_width+'\ndrawableRowWidth--'+drawableRowWidth);
		drawableIconWidth = (drawableRowWidth - row.groups.length * (6 + 13 + 4));
		visible_buttons_width = 0;
		var group_index = 0;
		var all_buttons = 0;
		for (group_index = 0; group_index < row.groups.length; group_index++) {
			var groupName = row.groups[group_index];
			var group = this.groups[groupName];
			group.width = 0;
			group.substracted_partial_button_width = false;
			group.occupiedSpace = 0;
			for (var i = 0; i < group.buttons.length; i++) {
				var button = group.buttons[i];
				if (this.config_display_buttons[button.name]) {
					group.occupiedSpace += button.width;
				}
			}
			visible_buttons_width += group.occupiedSpace;
			all_buttons += group.buttons.length;
		}
		visible_buttons_width = visible_buttons_width || 1;
		for (group_index = 0; group_index < row.groups.length; group_index++) {
			var groupName = row.groups[group_index];
			var group = this.groups[groupName];
			if (group.name == 'standard' || group.name == 'insert') group.availableSpace = group.occupiedSpace;
			else group.availableSpace = Math.floor(drawableIconWidth * group.occupiedSpace / visible_buttons_width);
		}
		var button_index = 0;
		group_index = 0;
		var added_buttons = 0;
		var cat_au_butoanele_din_row_pana_acum = 0;
		while (added_buttons < all_buttons) {
			for (group_index = 0; group_index < row.groups.length; group_index++) {
				var groupName = row.groups[group_index];
				var group = this.groups[groupName];
				if (button_index >= group.buttons.length) {
					continue;
				}
				var button = group.buttons[button_index];
				var target_group_width = group.width + button.width;
				var target_row_width = cat_au_butoanele_din_row_pana_acum + button.width;
				if (!this.config_display_buttons[button.name]) {
					this.setButtonDisplay(button, false);
					button.in_floater = false;
				} else if (target_group_width > group.availableSpace || target_row_width > drawableIconWidth) {
					this.setButtonDisplay(button, false);
					button.in_floater = true;
					if (target_group_width > group.availableSpace) {
						if (!group.substracted_partial_button_width) {
							group.substracted_partial_button_width = true;
							var nextGroupName = row.groups[group_index + 1];
							if (nextGroupName) {
								var nextGroup = this.groups[nextGroupName];
								nextGroup.availableSpace += (group.availableSpace - group.width);
							}
						}
					}
				} else {
					this.setButtonDisplay(button, true);
					button.in_floater = false;
					group.width += button.width;
					cat_au_butoanele_din_row_pana_acum += button.width;
				}
				added_buttons++;
			}
			button_index++;
		}
		for (group_index = 0; group_index < row.groups.length; group_index++) {
			var groupName = row.groups[group_index];
			var group = this.groups[groupName];
			var groupElement = document.getElementById(group.element);
			groupElement.style.width = (group.width) + "px";
		}
	}
};
function select_onclick(e) {
	var tlb = KTStorage.get(this.tlb_id);
	if (tlb.ktml.toolbar.checkHelp()) {
		tlb.ktml.toolbar.showHelp(tlb.helpId);
	}
};
Toolbar.prototype.addButton = function (button, index) {
	if (button == null) {
		return;
	}
	if (button.name == "style_list" && !this.owner.hasModule('css')) {
		return;
	}
	var rowIndex = KtmlToolbarRows[button.group];
	var rowLogicIndex = rowIndex - 1;
	button.ktml = this.owner;
	var btn_html = '';
	switch (button.button_type) {
	case "img":
		var __tmp = new ImageButton(button.id);
		btn_html = __tmp.htmlstring;
		break;
	case "combo":
		var __tmp = new ComboButton(button.id);
		btn_html = __tmp.htmlstring;
		break;
	case "select":
		var __tmp = new HtmlDropdownButton(button.id);
		btn_html = __tmp.htmlstring;
		break;
	default:
		break;
	}
	button.assoc = __tmp.id;
	this.groups[button.group].buttons.push(button);
	if (typeof this.config_display_buttons[button.name] != 'undefined') {
		button.config_display_button = this.config_display_buttons[button.name];
	} else {
		this.config_display_buttons[button.name] = button.config_display_button = 1;
		this.saveConfig();
	}
	if (typeof(alt) != "undefined" && alt != null) {
		button.alt = lang_translatepage(button.alt, this.owner.config.UILanguage, window);
	}
	if (this.buttonobjects.length > index) {
		this.buttonobjects.splice(index, 0, button);
	} else {
		this.buttonobjects[this.buttonobjects.length] = button;
	}
	switch (button.name) {
	case "fonttype_list":
		this.font_type = __tmp.id;
		break;
	case "fontsize_list":
		this.font_size = __tmp.id;
		break;
	case "style_list":
		this.styler = __tmp.id;
		break;
	case "heading_list":
		this.blockformat = __tmp.id;
		break;
	case "toggle_editmode":
		this.swap = __tmp.id;
		break;
	}
	if (!button.config_display_button) {
		__tmp.setVisible(false);
	}
	Array_push(this.groups[button.group]['_buttons'], btn_html);
};
Toolbar.prototype.addButtonDeferred = function (button, group_index, index) {
	if (button == null) {
		return;
	}
	var rowIndex = KtmlToolbarRows[button.group];
	var rowLogicIndex = rowIndex - 1;
	button.ktml = this.owner;
	var btn_html = null;
	switch (button.button_type) {
	case "img":
		var __tmp = new ImageButton(button.id, true);
		btn_html = __tmp.htmlstring;
		break;
	case "combo":
		var __tmp = new ComboButton(button.id, true);
		btn_html = __tmp.htmlstring;
		break;
	case "select":
		var __tmp = new HtmlDropdownButton(button.id, true);
		btn_html = __tmp.htmlstring;
		break;
	default:
		var __tmp = new ImageButton(button.id, true);
		btn_html = __tmp.htmlstring;
		break;
	}
	button.assoc = __tmp.id;
	this.groups[button.group].buttons.splice(group_index, 0, button);
	if (typeof this.config_display_buttons[button.name] != 'undefined') {
		button.config_display_button = this.config_display_buttons[button.name];
	} else {
		this.config_display_buttons[button.name] = button.config_display_button = 1;
		this.saveConfig();
	}
	if (typeof(alt) != "undefined" && alt != null) {
		button.alt = lang_translatepage(button.alt, this.owner.config.UILanguage, window);
	}
	this.buttonobjects.splice(index, 0, button);
	if (!button.config_display_button) {
		__tmp.setVisible(false);
	}
	this.groups[button.group]._buttons.splice(group_index, 0, btn_html);
	return __tmp;
};
Toolbar.prototype.insertButtonAfter = function (btn, insert_after_btn_name, insert_after_tlb_index, autoCall) {
	var LoadMode = this.owner.config_var['show_toolbar'];
	if ((LoadMode == "focus" || LoadMode == "manual") && !autoCall) {
		var tl_ob = this;
		var bt_ob = btn;
		var bt_nm = insert_after_btn_name;
		var bt_in = insert_after_tlb_index;
		var deferedCall = function () {
			tl_ob.insertButtonAfter(bt_ob, bt_nm, bt_in, true)
		};
		this.addAfterAction(deferedCall);
		return;
	}
	if (typeof(this.groups[btn.group]) == 'undefined') {
		var gn = null;
		for (var gn in this.groups) {
			btn.group = gn;
			break;
		}
		if (!gn) {
			return;
		}
	}
	var arr = this.owner.config.buttons;
	_outer: for (var z = 0; z < arr.length; z++) {
		var _tmpRow = isNaN(insert_after_tlb_index) ? arr[z] : arr[insert_after_tlb_index];
		var _customGroupName = _tmpRow[1];
		var _buttons = _tmpRow[2];
		_inner: for (var y = 0; y < _buttons.length; y++) {
			if (_buttons[y] == insert_after_btn_name) {
				Array_splice(_buttons, y + 1, null, btn.name);
				btn.group = _customGroupName;
				break _outer;
			}
		}
		_customGroupName = _tmpRow[1];
		arr[z][2].push(insert_after_btn_name);
		btn.group = _customGroupName;
		if (!isNaN(insert_after_tlb_index)) {
			break;
		}
	}
	var found_button = null, found_group = null;
	var old_btn = null;
	var groupName = '';
	for (var row_index = 0; row_index < this.rows.length; row_index++) {
		var row = this.rows[row_index];
		if (!row) {
			continue
		};
		var num_groups = row.groups.length;
		for (var group_index = row.groups.length - 1; group_index >= 0; group_index--) {
			groupName = row.groups[group_index];
			if (groupName != btn.group) {
				continue;
			}
			for (var i = 0; i < this.groups[groupName].buttons.length; i++) {
				old_btn = this.groups[groupName].buttons[i];
				if (old_btn.name == insert_after_btn_name) {
					found_button = old_btn;
					break;
				}
			}
		}
	}
	if (!found_button && old_btn) {
		found_button = old_btn;
	}
	found_group = document.getElementById(this.groups[btn.group].element);
	if (found_group) {
		if (found_button) {
			var group_index = this.groupIndexOfName(found_button.name);
			var index = this.indexOfName(found_button.name);
			var found_button_element = KTStorage.get(found_button.assoc).getElement("container");
			var button = this.addButtonDeferred(btn, group_index + 1, index + 1);
			var td = found_button_element.parentNode;
			var tr = td.parentNode;
			td = tr.insertCell(td.cellIndex + 1);
			td.id = "toolbar_button_container_" + btn.id;
			td.appendChild(button.getAsElement());
		} else {
			var last_group_index = this.groups[btn.group].buttons.length - 1;
			var found_button = this.groups[btn.group].buttons[last_group_index];
			if (found_button) {
				var last_index = this.indexOfName(found_button.name);
				var found_button_element = KTStorage.get(found_button.assoc).getElement("container");
				var td = found_button_element.parentNode;
				var tr = td.parentNode;
			} else {
				var first_index = 0;
				var table = found_group.getElementsByTagName('table')[0];
				var tr = table.rows[0];
			}
			var button = this.addButtonDeferred(btn, last_group_index + 1, last_index + 1);
			td = tr.insertCell(-1);
			td.id = "toolbar_button_container_" + btn.id;
			td.appendChild(button.getAsElement());
		}
		if (typeof button.deferredAfterAction == 'function') {
			button.deferredAfterAction();
		}
		this.Resize();
	} else {};
};
Toolbar.prototype.insertButtonBefore = function (btn, insert_before_btn_name, insert_before_tlb_index, autoCall) {
	var LoadMode = this.owner.config_var['show_toolbar'];
	if ((LoadMode == "focus" || LoadMode == "manual") && !autoCall) {
		var tl_ob = this;
		var bt_ob = btn;
		var bt_nm = insert_before_btn_name;
		var bt_in = insert_before_tlb_index;
		var deferedCall = function () {
			tl_ob.insertButtonBefore(bt_ob, bt_nm, bt_in, true)
		};
		this.addAfterAction(deferedCall);
		return;
	}
	if (typeof(this.groups[btn.group]) == 'undefined') {
		var gn = null;
		for (var gn in this.groups) {
			btn.group = gn;
			break;
		}
		if (!gn) {
			return;
		}
	}
	var arr = this.owner.config.buttons;
	_outer: for (var z = 0; z < arr.length; z++) {
		var _tmpRow = isNaN(insert_before_tlb_index) ? arr[z] : arr[insert_before_tlb_index];
		if (!_tmpRow) break;
		var _customGroupName = _tmpRow[1];
		var _buttons = _tmpRow[2];
		_inner: for (var y = 0; y < _buttons.length; y++) {
			if (_buttons[y] == insert_before_btn_name) {
				Array_splice(_buttons, y, null, btn.name);
				btn.group = _customGroupName;
				break _outer;
			}
		}
		_customGroupName = _tmpRow[1];
		Array_splice(arr[0][2], 0, null, btn.name);
		btn.group = _customGroupName;
		if (!isNaN(insert_before_tlb_index)) {
			break;
		}
	}
	var found_button = null, found_group = null;
	var old_btn = null;
	var groupName = '';
	for (var row_index = 0; row_index < this.rows.length; row_index++) {
		var row = this.rows[row_index];
		var num_groups = row.groups.length;
		for (var group_index = row.groups.length - 1; group_index >= 0; group_index--) {
			groupName = row.groups[group_index];
			if (groupName != btn.group) {
				continue;
			}
			for (var i = this.groups[groupName].buttons.length - 1; i >= 0; i--) {
				old_btn = this.groups[groupName].buttons[i];
				if (old_btn.name == insert_before_btn_name) {
					found_button = old_btn;
					break;
				}
			}
		}
	}
	if (!found_button && old_btn) {
		found_button = old_btn;
	}
	found_group = document.getElementById(this.groups[btn.group].element);
	if (found_group) {
		if (found_button) {
			var group_index = this.groupIndexOfName(found_button.name);
			var index = this.indexOfName(found_button.name);
			var found_button_element = KTStorage.get(found_button.assoc).getElement("container");
			var button = this.addButtonDeferred(btn, group_index, index);
			var td = found_button_element.parentNode;
			var tr = td.parentNode;
			td = tr.insertCell(td.cellIndex);
			td.id = "toolbar_button_container_" + btn.id;
			td.appendChild(button.getAsElement());
		} else {
			var first_group_index = 0;
			var found_button = this.groups[btn.group].buttons[first_group_index];
			if (found_button) {
				var first_index = this.indexOfName(found_button.name);
				var found_button_element = KTStorage.get(found_button.assoc).getElement("container");
				var td = found_button_element.parentNode;
				var tr = td.parentNode;
			} else {
				var first_index = 0;
				var table = found_group.getElementsByTagName('table')[0];
				var tr = table.rows[0];
			}
			var button = this.addButtonDeferred(btn, first_group_index, first_index);
			td = tr.insertCell(0);
			td.id = "toolbar_button_container_" + btn.id;
			td.appendChild(button.getAsElement());
		}
		if (typeof button.deferredAfterAction == 'function') {
			button.deferredAfterAction();
		}
		this.Resize();
	} else {};
};
Toolbar.prototype.indexOfName = function (name) {
	var toret = -1;
	for (var i = 0; i < this.buttonobjects.length; i++) {
		if (this.buttonobjects[i].name == name) {
			toret = i;
			break;
		}
	}
	return toret;
};
Toolbar.prototype.groupIndexOfName = function (name) {
	var toret = -1;
	for (var row_index = 0; row_index < this.rows.length; row_index++) {
		var row = this.rows[row_index];
		if (!row) {
			continue
		};
		var num_groups = row.groups.length;
		for (var group_index = row.groups.length - 1; group_index >= 0; group_index--) {
			var groupName = row.groups[group_index];
			for (var i = 0; i < this.groups[groupName].buttons.length; i++) {
				var old_btn = this.groups[groupName].buttons[i];
				if (old_btn.name == name) {
					toret = i;
					break;
				}
			}
		}
	}
	return toret;
};
Toolbar.prototype.getValueFromActiveForm = function (fieldName, fieldType, returnType) {
	var containers = this.base.getElementsByTagName("SELECT");
	var valToReturn = false;
	for (var i = 0; i < containers.length; i++) {
		if (containers[i].name == fieldName || containers[i].id == fieldName) {
			if (returnType == "value") {
				valToReturn = containers[i].options[containers[i].selectedIndex].value;
			} else if (returnType == "all") {
				valToReturn = containers[i];
			}
		}
	};
	return valToReturn;
};
Toolbar.prototype.setHelpMode = function (helpMode, el) {
	function massCursorElems(el, tag, how) {
		var a, i;
		a = el.getElementsByTagName(tag);
		for (i = 0; i < a.length; i++) {
			a[i].style.cursor = how;
		}
	}
	function massCursorToChildren(el, how) {
		el = document.getElementById(el);
		if (el) {
			massCursorElems(el, "INPUT", how);
			massCursorElems(el, "SELECT", how);
			massCursorElems(el, "IMG", how);
		}
	}
	function massCursor(k, how) {
		if (k.introspector) {
			for (var i = 0; i < k.introspector.taglist.length; i++) {
				massCursorToChildren(k.introspector[k.introspector.taglist[i]], how);
			}
		}
	}
	this.helpMode = helpMode;
	if (helpMode) {
		var btn = null;
		if (el.assoc) {
			var btn = KTStorage.get(el.assoc);
		};
		massCursor(this.owner, 'help');
		btn.getElement('image').className = "toolbaritem_latched";
		btn.state = 2;
		for (var row_index = 0; row_index < this.rows.length; row_index++) {
			var row = this.rows[row_index];
			for (var group_index = row.groups.length - 1; group_index >= 0; group_index--) {
				var groupName = row.groups[group_index];
				for (var i = 0; i < this.groups[groupName].buttons.length; i++) {
					var _buttType = this.groups[groupName].buttons[i].button_type;
					switch (_buttType) {
					case 'img':
						var _container = KTStorage.get(this.groups[groupName].buttons[i].assoc).getElement('container');
						break;
					case 'combo':
						var _container = KTStorage.get(this.groups[groupName].buttons[i].assoc).getElement('ccontainer');
						break;
					case 'select':
						var _container = KTStorage.get(this.groups[groupName].buttons[i].assoc).table0.getElementsByTagName('div');
						break;
					}
					if (_container) {
						if (_container.length) {
							Array_each(_container, function (el) {
								el.style.cursor = 'help';
							});
						} else {
							_container.style.cursor = 'help';
						}
					}
				}
			}
		}
	} else {
		var btn = null;
		if (el.assoc) {
			var btn = KTStorage.get(el.assoc);
		}
		massCursor(this.owner, '');
		btn.getElement('image').className = "toolbaritem_flat";
		btn.state = 1;
		for (var row_index = 0; row_index < this.rows.length; row_index++) {
			var row = this.rows[row_index];
			for (var group_index = row.groups.length - 1; group_index >= 0; group_index--) {
				var groupName = row.groups[group_index];
				for (var i = 0; i < this.groups[groupName].buttons.length; i++) {
					var _buttType = this.groups[groupName].buttons[i].button_type;
					switch (_buttType) {
					case 'img':
						var _container = KTStorage.get(this.groups[groupName].buttons[i].assoc).getElement('container');
						break;
					case 'combo':
						var _container = KTStorage.get(this.groups[groupName].buttons[i].assoc).getElement('ccontainer');
						break;
					case 'select':
						var _container = KTStorage.get(this.groups[groupName].buttons[i].assoc).table0.getElementsByTagName('div');
						break;
					}
					if (_container) {
						if (_container.length) {
							Array_each(_container, function (el) {
								el.style.cursor = 'default';
							});
						} else {
							_container.style.cursor = 'default';
						};
					};
				}
			}
		}
	}
};
Toolbar.prototype.getHelpMode = function () {
	return this.helpMode;
};
Toolbar.prototype.checkHelp = function () {
	return this.helpMode;
};
Toolbar.prototype.showHelp = function (fname) {
	if (fname.indexOf('PI_') == 0)
	{
		var temp = fname.split('_');
		var tempstr = temp[0] + '_' + temp[1];
		fname = KtmlHelpMap[tempstr];
	}
	var strUrl = jsDlgLoader + '?csModule=help/openhelp&CSHelpID=' + fname;
	var argsStr = "menubar=0,location=0,scrollbars=1,status=0,resizable=1";
	if (top.commonspot.lightbox.helpDlg && !top.commonspot.lightbox.helpDlg.closed)
		(top.commonspot.lightbox.helpDlg).location.href = strUrl;					
	else
		top.commonspot.lightbox.helpDlg = window.open(strUrl,'helpDlg',argsStr);	
};
Toolbar.prototype.openAboutBox = function () {
	utility.window.openWindow("_about" + parseInt(Math.random() * 1000000000), KtmlRoot + "core/htm/about.html", 350, 220);
};
Toolbar.prototype.openInsertTable = function () {
	utility.window.openWindow("_instable" + parseInt(Math.random() * 1000000000), KtmlRoot + "core/htm/instable.html?id=" + this.owner.counter, 360, 240, true);
};
Toolbar.prototype.openFindReplace = function () {
	utility.window.openWindow("_findreplace" + parseInt(Math.random() * 1000000000), KtmlRoot + "core/htm/findreplace.html?id=" + this.owner.counter + '&counter=' + this.owner.counter, 290, 200);
};
Toolbar.prototype.getWidthForButton = function (button) {
	var button_instance = KTStorage.get(button.assoc);
	return button_instance.getWidth();
};
Toolbar.prototype.saveConfig = function () {
	var display_buttons2 = '';
	for (var button_name in this.config_display_buttons) {
		if (typeof(KtmlToolbarButtonsIndexMap[button_name]) != "undefined") {
			if (this.config_display_buttons[button_name]) {
				display_buttons2 += (display_buttons2 ? "," : "") + KtmlToolbarButtonsIndexMap[button_name];
			}
		} else {
			display_buttons2 += (display_buttons2 ? "," : "") + button_name;
		}
	}
	this.owner.serializer.set('toolbar', 'display_buttons2', display_buttons2);
	this.owner.serializer.save();
};
Toolbar.prototype.loadConfig = function () {
	//do nothing
	var old_cookie_display_buttons = this.owner.serializer.get('toolbar', 'display_buttons');
	var display_buttons2 = this.owner.serializer.get('toolbar', 'display_buttons2');
	var config_display_buttons = {};
	if (old_cookie_display_buttons) {
		config_display_buttons = old_cookie_display_buttons;
		this.owner.serializer.set('toolbar', 'display_buttons', null);
		this.owner.serializer.save();
	} else if (display_buttons2) {
		cookie_display_buttons = display_buttons2.split(",");
		display_buttons2 = "," + display_buttons2 + ",";
		for (var button_name in KtmlToolbarButtonsIndexMap) {
			if (display_buttons2.indexOf("," + KtmlToolbarButtonsIndexMap[button_name] + ",") != -1) {
				config_display_buttons[button_name] = 1;
			} else {
				config_display_buttons[button_name] = 0;
			}
		}
		for (var key in cookie_display_buttons) {
			if (key.match(/^\d+$/)) {
				continue;
			}
			config_display_buttons[key] = key;
		}
	}
	this.config_display_buttons = config_display_buttons;
};
Toolbar.prototype.setButtonDisplay = function (button, mode) {
	var button_instance = KTStorage.get(button.assoc);
	button_instance.setVisible(mode);
};
Toolbar.prototype.setVisibleButtonsConfig = function (group_id) {
	for (var row_index = 0; row_index < this.rows.length; row_index++) {
		var row = this.rows[row_index];
		var num_groups = row.groups.length;
		var groups = row.groups;
		for (var group_index = row.groups.length - 1; group_index >= 0; group_index--) {
			var groupName = row.groups[group_index];
			if (typeof(group_id) != "undefined" && group_id != groupName) {
				continue;
			}
			for (var i = 0; i < this.groups[groupName].buttons.length; i++) {
				var button = this.groups[groupName].buttons[i];
				button.config_display_button = this.config_display_buttons[button.name];
				if (typeof this.config_display_buttons[button.name] != 'undefined') {
					this.setButtonDisplay(button, button.config_display_button);
				} else {
					this.setButtonDisplay(button, true);
				}
			}
		}
	}
};
Toolbar.prototype.openToolbarConfig = function (group_id) {
	var container = document.createElement('div');
	container.id = 'toolbarconfig';
	container.className = 'ktmlContextMenuDIV';
	var str = '\
  <table cellspacing="0" cellpadding="0" border="0">\
    <tbody>\
 ';
	Array_each(this.groups[group_id].buttons, function (button) {
		var render = '';
		var button_instance = KTStorage.get(button.assoc);
		var _tmpUrl = KtmlRoot + "core/img/montage.gif?" + KtmlVersion;
		var idx = parseInt(KT_icon_indexes[button.name], 10);
		var _img_html_tpl = '<input type="image" ' + 'align="absmiddle" ' + 'onclick="return false" ' + 'src="%s" ' + 'style="background-image: url(%s);' + 'background-repeat: no-repeat;' + 'background-position: %spx 2px;' + 'width: 20px;' + 'height: 20px;' + 'margin: 0px;' + 'position: relative;' + 'top: %spx;' + 'left: -2px;' + 'border: 0px;">';
		var imgVoffset = (is.mozilla) ? "-2" : (is.ie) ? "2" : "0";
		if (!isNaN(idx)) {
			var _pos = -idx * 32 - 6;
			render = utility.string.sprintf(_img_html_tpl, KtmlRelativeImagePath + 's.gif', _tmpUrl, _pos, imgVoffset);
		} else {
			if (typeof button.options.alt_image != "undefined") {
				render = utility.string.sprintf(_img_html_tpl, KtmlRelativeImagePath + 's.gif', KtmlRelativeImagePath + button.options.alt_image, 2, imgVoffset);
			} else {
				render = '';
			}
		}
		var checkBoxOffset = (is.mozilla) ? "3px" : (is.ie) ? "2px" : "0";
		var flag_has_title_prop = button_instance.title ? 1 : 0;
		var flag_has_title_method = button_instance.getTitle ? 2 : 0;
		var flag_has_secondary_title = (button_instance.secTitle && (button_instance.secTitle != textContent)) ? 4 : 0;
		var descriptor = flag_has_title_prop + flag_has_title_method + flag_has_secondary_title;
		var textContent;
		switch (descriptor) {
		case 1:
			textContent = button_instance.title;
			break;
		case 3:
			textContent = (button_instance.title != button_instance.getTitle()) ? button_instance.title + "/" + button_instance.getTitle() : button_instance.title;
			break;
		case 5:
		case 7:
			textContent = (button_instance.title != button_instance.secTitle) ? button_instance.title + "/" + button_instance.secTitle : button_instance.title;
			break;
		default:
			textContent = button.name;
			break;
		}
		str += '\
     <tr class="ktmlContextMenuItem_default" \
      onclick="this.getElementsByTagName(\'input\')[0].checked = !this.getElementsByTagName(\'input\')[0].checked ">\
       <td valign="bottom" class="ktmlContextMenuImages">\
        <div  class="kt_spacer" style="width:49px; height: 24px;"><nobr>\
          <input type="checkbox" id="tc_button_' + button.name + '" name="tc_button_' + button.name + '" ' + (button.config_display_button ? 'checked="true"' : '') + ' onclick="this.checked = !this.checked; return true;"\
           style="position: relative; top: ' + checkBoxOffset + '">\
          ' + render + '\
        </div></nobr></td>\
       <td class="ktmlContextMenuText">\
        <div style="height: 24px; \
         line-height:24px; \
         margin: 0px;"><nobr>\
         ' + textContent + '\
        </nobr></div></td>\
          <td valign="middle" class="ktmlContextMenuSubmenu">&nbsp;</td>\
        </tr>\
    ';
	});
	str += '\
    </tbody>\
    </table>\
';
	container.innerHTML = str;
	container.style.top = '-20000px';
	container.style.width = 'auto';
	container.style.height = 'auto';
	var strictm = document.compatMode == "CSS1Compat";
	container = this.base.appendChild(container);
	utility.dom.setUnselectable(container);
	var c_width = container.offsetWidth;
	var c_height = container.offsetHeight;
	container.style.width = (c_width - 4) + 'px';
	container.style.height = (c_height - 4) + 'px';
	if (is.mozilla && is.mac) {
		container.style.overflow = 'auto';
	}
	utility.dom.putElementAt(container, this.groups[group_id]['floater'], '00', {
		x: 14,
		y: 14
	});
	container.style.zIndex = 2000;
	var ktml_counter = this.owner.counter;
	utility.popup.makeModal(function () {
		ktmls[ktml_counter].toolbar.closeToolbarConfig(group_id);
		ktmls[ktml_counter].toolbar.base.removeChild(container);
	}, container);
	if (is.ie) {
		utility.dom.toggleSpecialTags(container, false, 1, this.owner.edit, this.owner.iframe);
	};
};
Toolbar.prototype.closeToolbarConfig = function (group_id) {
	var buttons = this.groups[group_id].buttons;
	for (var i = 0; i < buttons.length; i++) {
		var checked = document.getElementById('tc_button_' + this.groups[group_id].buttons[i].name).checked;
		this.config_display_buttons[this.groups[group_id].buttons[i].name] = checked ? 1 : 0;
		this.groups[group_id].buttons[i].config_display_button = checked ? 1 : 0;
		if (!checked) {
			this.groups[group_id].buttons[i].in_floater = false;
		} else {
			this.groups[group_id].buttons[i].in_floater = true;
		}
	}
	this.saveConfig();
	this.hideFloater(group_id, false);
	this.Resize();
};
Toolbar.prototype.dispose = function () {
	for (var row_index = 0; row_index < this.rows.length; row_index++) {
		var row = this.rows[row_index];
		if (!row) {
			continue
		};
		var num_groups = row.groups.length;
		for (var group_index = row.groups.length - 1; group_index >= 0; group_index--) {
			var groupName = row.groups[group_index];
			this.groups[groupName].element = null;
			for (var i = 0; i < this.groups[groupName].buttons.length; i++) {
				this.groups[groupName].buttons[i].dispose();
				this.groups[groupName].buttons[i] = null;
			}
			this.groups[groupName] = null;
		}
		this.rows[row_index].element = null;
		this.rows[row_index] = null;
	}
	for (var i = 0; i < this.buttons.length; i++) {
		this.buttons[i] = null;
	}
	this.base = null;
};
function updateIntrospector(what, updateText) {
	try {
		if (this.introspector) {
			this.introspector.apply(what, updateText);
		}
	}
	catch(e) {}
};
function getglblRTElementsRef() {
	lglblRTElements = parent.glblRTElements;
	return lglblRTElements;
};
function getThisRTERef(tbRef, glbRef) {
	var thistbIndex = null;
	try {
		if (glbRef.length > 1) {
			for (var i = 0; i < glbRef.length; i++) {
				splitString = glbRef[i].split("|");
				if (splitString[0] == tbRef) {
					thistbIndex = i;
					break;
				}
			}
		}
		return thistbIndex;
	}
	catch(e) {
		return null;
	}
};
function changeglblSetting(ktObj) {
	if (thisTimeoutID) clearInterval(thisTimeoutID);
	while (!ktObj.editorJsLoaded) {
		thisTimeoutID = setInterval(function () {
			changeglblSetting(ktObj);
		}, 100);
		return;
	}
	var lclglblRTElements = getglblRTElementsRef();
	var thistbIndex = null;
	var pString = '';
	if (lclglblRTElements.length > 1) {
		thistbIndex = getThisRTERef(ktObj.name, lclglblRTElements);
		if (thistbIndex >= 0) {
			try {
				oldTxt = lclglblRTElements[thistbIndex].split("|");
				lclglblRTElements[thistbIndex] = oldTxt[0] + '|' + oldTxt[1] + '|' + oldTxt[2] + '|true';
				parent.glblRTElements = lclglblRTElements;
				var thisInd = getThisRTERef(ktObj.name, parent.glblRTElements);
			}
			catch(e) {};
		}
	}
};
function getRTEStatus(glbRef, ind) {
	arTxt = glbRef[ind].split("|");
	return arTxt[3];
};
/*
* This function will not return until (at least)
* the specified number of milliseconds have passed.
* It uses a modal dialog.
*/
function pause(numberMillis) {
	var dialogScript = 'parent.window.focus();window.setTimeout(' + 'function(){window.close();},' + numberMillis + ');';
	if (is.mozilla) { //For NN6, but it requires a trusted script.
		try {
			openDialog('javascript:document.writeln(' + '"<script>' + dialogScript + '<' + '/script>"', 'pauseDialog', 'modal=1,width=10,height=10');
		}
		catch(err) {};
	} else {
		var result =
		// For IE5.
		window.showModalDialog('javascript:document.writeln(' + '"<script>' + dialogScript + '<' + '/script>")');
	}
};
function specialActivate() {
	if (Ktml_object && jsWaitToLoad && !jsLoaded) {
		jsLoadNow = true;
		setval();
		setTimeout('doDocOnReadyStateChange();', 100);
	} else {
		doDocOnReadyStateChange();
	}
};
function doDocOnReadyStateChange() {
	try {
		Ktml_object.makeCanvasEditable();
	}
	catch(err) {};
};
function setval() {
	if (!Ktml_initialized) {
		//Ktml_object.toolbar.initializeUI();
		Ktml_initialized = true;
		try {
			window.focus();
		}
		catch(e) {};
	}
}
function customResize(w, h, name) {
	try {
		window['ktml_' + name].myCustomResize(w, h);
	}
	catch(e) {};
}
function saveKTML(name) {
	window['ktml_' + name].save();
}
//DECMD_PASTE_onclick_continue(fake_clipboard,ktml);
function DECMD_PASTE_onclick_continue(clipboard_ref, ktObj) {
	Ktml_object = ktObj;
	if (is.mozilla) {
		//add Moz specific stuff here
		var plainText = getInnerText(objRef.contentWindow.document.body);
		var pasteTextNoBR = pasteText.replace(/<br[ \/]*>/gi, "");
		var pasteTextHasTags = pasteTextNoBR.match(/<[a-z].*>/i);
	} else {
		//add IE specific stuff here
	}
};
function checkForScript() {
	oe = /&lt;script.*&gt;/gi;
	o = /&lt;script/gi;
	c = /&lt;\/script&gt;/gi;
	oe2 = /<script[^>]*>;/gi;
	o2 = /<script/gi;
	c2 = /<\/script>/gi;
	if (pasteText.search(o) >= 0 || pasteText.search(oe) >= 0 || pasteText.search(c) >= 0 || pasteText.search(o2) >= 0 || pasteText.search(oe2) >= 0 || pasteText.search(c2) >= 0) return 1;
	else return 0;
};

