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), 10);
            }
            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;
    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() {
    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;
        try {
            sel.startOffset = tr.startOffset;
            sel.endOffset = tr.endOffset;
            sel.startContainer = static_UndoItem_getNumericPath(tr.startContainer);
            sel.endContainer = static_UndoItem_getNumericPath(tr.endContainer);
        } catch (e) {
            return null;
        }
        return sel;
    }
}

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 == 8 || 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.6';
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 = '<IMG id=' + HIDDEN_TAG_ID + ' style="MARGIN: 0px" src="../img/anchor.gif">';
$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,
    formatting: util_cleanFormattingTags,
    all: util_cleanAllTags
};
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'],
    'inserthr': ['inserthorizontalrule', 'InsertHorizontalRule'],
    '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 cookie_str = utility.cookie.get(this.name.replace(/_\d+$/, '') + "_cookie");
        if (!cookie_str) {
            this.props = {};
        } {
            this.props = eval('(' + cookie_str + ')');
        }
    },
    save: function () {
        utility.cookie.set(this.name.replace(/_\d+$/, '') + "_cookie", this.stringify(this.props), 10, 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_cleanHTMLContent(tmp) {
    var r1 = new RegExp("<\\?xml:.*?>", "gi");
    tmp = tmp.replace(r1, "");
    tmp = tmp.replace(/<TT([^>]*)>/ig, "<p $1>");
    tmp = tmp.replace(/<\/TT>/ig, "</p>");
    tmp = tmp.replace(/<\/?font[^>]*>/ig, "");
    tmp = tmp.replace(/<\/?span[^>]*>/ig, "");
    r1 = new RegExp("\\sclass=Mso\\w*?\\s", "gi");
    tmp = tmp.replace(r1, " ");
    r1 = new RegExp("(style=\"[^\"]*)TEXT-ALIGN:\\s?([a-z]*)([^\"]*\")", "gi");
    tmp = tmp.replace(r1, "align=$2 $1$3");
    r1 = new RegExp("(style=\"[^\"]*)BACKGROUND:\\s?([a-z0-9#]*)([^\"]*\")", "gi");
    tmp = tmp.replace(r1, "bgcolor=$2 $1$3");
    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, "");
    return tmp;
}

function testClipboardForWordHTML(ktml) {
    var ret = {
        clipboard_allowed: false,
        has_word: false,
        html_content: '',
        cleaned_content: ''
    };
    if (typeof(ktml) == "object" && ktml.flags.clipboard_allowed) {
        if (ktml.flags.clipboard_allowed) {
            if (is.ie) {
                var fake_clipboard = document.getElementById(ktml.name + '_paste_container');
                var cur_range = document.body.createTextRange();
                cur_range.moveToElementText(fake_clipboard);
                try {
                    cur_range.execCommand(KtmlGetCommand('paste'), false, null);
                } catch (err) {
                    ktml.flags.clipboard_allowed = false;
                }
                if (fake_clipboard.innerHTML == 'clipboard_not_allowed') {
                    ktml.flags.clipboard_allowed = false;
                }
                if (ktml.flags.clipboard_allowed) {
                    ret.html_content = fake_clipboard.innerHTML;
                    fake_clipboard.innerHTML = "";
                    ret.has_word = /mso-|MsoNormal/i.test(ret.html_content);
                    ret.has_word = ret.has_word || /<v:imagedata/i.test(ret.html_content);
                }
            } else {
                ktml.paste_container.body.innerHTML = "";
                ktml.paste_container.designMode = 'on';
                try {
                    ktml.paste_container.execCommand(KtmlGetCommand('paste'), false, null);
                } catch (err) {
                    ktml.flags.clipboard_allowed = false;
                }
                if (ktml.flags.clipboard_allowed) {
                    ret.html_content = ktml.paste_container.body.innerHTML;
                    ktml.paste_container.body.innerHTML = "";
                    ret.has_word = /mso-|MsoNormal/i.test(ret.html_content);
                    ret.has_word = ret.has_word || /<v:imagedata/i.test(ret.html_content);
                }
            }
        }
        ret.clipboard_allowed = ktml.flags.clipboard_allowed;
        return ret;
    } else {
        ret.has_word = /mso-|MsoNormal/i.test(ktml);
        ret.has_word = ret.has_word || /<v:imagedata/i.test(ktml);
        return ret;
    }
};

function util_cleanCSSStyles(tmp) {
    tmp = tmp.replace(/\sstyle\s*=\s*['"]?[^'">]*['"]?/ig, " ");
    tmp = tmp.replace(/\sclass\s*=\s*"[^"]*"/ig, " ");
    tmp = tmp.replace(/\sclass\s*=\s*'[^']*'/ig, " ");
    tmp = tmp.replace(/\sclass\s*=\s*[^\s>]+/ig, " ");
    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>");
    return tmp;
};

function util_cleanAllTags(tmp) {
    tmp = tmp.replace(/<(\/?)([a-z:0-9]+)[^>]*>/gi, "<$1$2>");
    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) {
                ret += '</' + prev_tag + '>';
            }
            prev_tag = 'p';
            ret += '<' + slash + 'p>';
            return ret;
        } else {
            return '';
        }
    });
    while (/<(\/?)p><\1p>/i.test(tmp)) {
        tmp = tmp.replace(/<(\/?)p><\1p>/i, "<$1p>");
        tmp = tmp.replace(/<p><\/p>/gi, "");
    }
    return tmp || '<p>&nbsp;</p>';
};
var KtmlScripts = {
    'base': [],
    'modules': []
};
var KtmlModuleList = {
    'contextmenu': ['main'],
    'glyphhandler': ['main', 'browser'],
    'introspection': ['main'],
    '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].destroyed && !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) {
        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) {
    try {
        Kore.container.unloadEvent.subscribe(this.dispose, this, true);
    } catch (err) {}
    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) {};
    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[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(",");
            var tag = '';
            for (var i = 0; i < denied_tags_list.length; i++) {
                tag = denied_tags_list[i].toLowerCase();
                this.addTagReplacementRule("strip" + tag, tag, "striptag" + (tag == 'script' ? 'andcontent' : ''));
            }
        }
        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);
    });
};

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 = utility.dom.getParentByTagName(eventTarget, 'FORM');
    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;
        if (is.ie && is.v < 7) {
            try {
                document.execCommand("BackgroundImageCache", false, true);
            } catch (err) {}
        }
        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");
        }
        window.KtmlExtension = window.ktml_init_object['server'];
        window.KtmlAbsoluteServicePath = window.KtmlRoot + "plugins/service/service." + window.KtmlExtension;
    } 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] = [2, 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.background_color = this.config_var['background_color'] ? this.config_var['background_color'] : '#ffffff';
    this.defaults.font_family = this.config_var['font_family'] ? this.config_var['font_family'] : '';
    this.defaults.font_size = this.config_var['font_size'] ? this.config_var['font_size'] : '';
    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>'
    var begin_redistribution_strip = true;
    ktmlContent += '\
           <td class="ktml_bg" style="text-align: right; background-position: center ' + (this.width - 4 - 9 - 50) + 'px !important" >\
             <a id="logoKTML_' + this.name + '" style="margin-right: 2px;" href="http://www.interaktonline.com/go/KTML/?from=' + FROM_WHERE + '" target="_blank" title="KTML homepage"><img src="' + KtmlRelativeImagePath + 'logo_pi.gif" alt="KTML homepage" border="0" height="43"/></a>\
           </td>';
    var begin_redistribution_strip = false;
    ktmlContent += '\
          </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="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) {
        embed_style = '<link id="styler" href="' + pathToStyle + '" 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;
    ktmlObj.edit.body.style.backgroundColor = ktmlObj.defaults.background_color;
    ktmlObj.edit.body.style.fontSize = ktmlObj.defaults.font_size;
    ktmlObj.edit.body.style.fontFamily = ktmlObj.defaults.font_family;
    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, '');
    var up = 0;
    var m = ktml_init_object.path.match(/(\.\.\/)/);
    if (m) {
        up = m.length;
    }
    window.setTimeout(function () {
        ktmlObj.makeCanvasEditable();
    }, 1);
};
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 = this.formElement.value;
    src = src.replace(/<param\s/gi, '<zparam ');
    src = src.replace(/<script/gi, '<!--SCRIPT_TRANSLATOR<script');
    src = src.replace(/<\/script>/gi, '</script>SCRIPT_TRANSLATOR-->');
    src = src.replace(/<!--SCRIPT_TRANSLATOR([\w\W\s\r\n]*?)SCRIPT_TRANSLATOR-->/gi, function (a, b, c) {
        return (is.ie ? '<span id=kt_remove_me style="display: none !important">&nbsp;</span>' : '') + '<!--SCRIPT_TRANSLATOR' + escape(b) + '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;
    if (is.ie) {
        var r = null;
        while (r = this.edit.getElementById('kt_remove_me')) {
            r.removeNode(true);
        }
    }
    this.flags.clipboard_allowed = true;
    if (is.mozilla) {
        this.paste_container = document.getElementById('paste_iframe_' + this.name).contentWindow.document;
        if (window.KT_attachProperties) {
            this.propertiesAttached = true;
            window.KT_attachProperties(this.iframe);
        }
        this.edit.designMode = 'on';
        this.edit.execCommand("useCSS", false, true);
        this.fixMozEditor();
    } 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"><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.destroyed && ktmlObj.ui.showToolbar == "focus" || !ktmlObj.destroyed && 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();
    });
};
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);
};
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.readyForSave = true;
        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;
    var nullables = 'toolbar,cpalette,cleantypespicker,contextMenu,charpalette,inserttablepicker,hooks,selectableNodes,logger,flags,visible,tagReplacementRules,ui,defaults,cw,serializer,selection,undo,contextMenu,glyphhandler,attachedStyleSheet,pis,introspector,inspectedNode,rpc,savedSelection,formatter'.split(',');
    for (var i = 0; i < nullables.length; i++) {
        try {
            this[nullables[i]] = null;
        } catch (err) {}
        try {
            delete this[nullables[i]];
        } catch (err) {}
    }
    this.destroyed = true;
    this.dontLeaveMeFlag = true;
};

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('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();
            }
        }
        break;
    case 'copy':
        try {
            this.edit.execCommand(KtmlGetCommand('copy'), false, null);
        }
        catch (e) {
            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();
            }
        }
        break;
    case 'paste':
        utility.window.blockInterface();
        var success = this.pasteClipboard();
        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');
        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.swapToMode = 'RICH';
        } else {
            this.swapToMode = 'CODE';
        }
        this.logic_setDisplayMode();
        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 'InsertHorizontalRule':
        this.edit.execCommand(KtmlGetCommand('inserthr'), false, is.mozilla ? null : undefined);
        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.edit.execCommand("Unlink", false, false);
        }
        break;
    case 'insert_anchor':
        var sAnchorName, rng, htmlText, initValue;
        rng = this.edit.selection.createRange();
        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 != "") {
            this.insertHTML(WMedia_Translator_translateMarkup(WMedia_Translator_translate({
                name: sAnchorName,
                content: ''
            }, 'anchor'), 'anchor'), "");
            toundo = false;
        };
        break;
    case 'InsertCharacter':
        this.logic_openCharacterPalette(this.toolbar.insertcharacter);
        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;
    }
    if (toundo) {
        this.invalidate();
    }
    if (this.undo && toundo) {
        this.undo.addEdit();
    }
    this.cw.focus();
    this.ui_setButtonState();
};
ktml.prototype.pasteClipboard = function (clean_type) {
    var cur_range = this.edit.selection.createRange();
    var ret = testClipboardForWordHTML(this);
    cur_range.select();
    if (!ret.clipboard_allowed) {
        return false;
    }
    if (cur_range.length) {
        cur_range.item(0).outerHTML = "";
        cur_range = this.edit.selection.createRange();
    }
    var clean_function = util_getCleanFunction(clean_type, ret.has_word);
    if (clean_function) {
        var new_html = util_plain2translated(clean_function(util_translated2plain(ret.html_content)), this.counter);
        if (is.mozilla) {
            this.paste_container.body.innerHTML = new_html;
            this.paste_container.execCommand('SelectAll', false, false);
            this.paste_container.execCommand('cut', false, false);
            this.edit.execCommand('paste', false, false);
            this.paste_container.body.innerHTML = ret.html_content;
            this.paste_container.execCommand('SelectAll', false, false);
            this.paste_container.execCommand('cut', false, false);
        } else {
            cur_range.pasteHTML(new_html);
        }
    } else {
        cur_range.pasteHTML(ret.html_content);
    }
    if (this.undo) {
        this.undo.addEdit();
    }
    return true;
}

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';
        }
        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) {
    this.util_insertSelectionMark();
    tag.outerHTML = tag.innerHTML;
    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) {
                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;
};

function flickerFreeClassSet(el, class_name) {
    if (el.className != class_name) {
        el.className = class_name;
    }
}
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) {
            continue;
        }
        tbtn = KTStorage.get(pbtn.assoc);
        cel = tbtn.getElement("container");
        try {
            var cmdID = pbtn.cid;
            if (pbtn.name == 'help') {
                if (this.toolbar.getHelpMode()) {
                    flickerFreeClassSet(cel, "toolbaritem_latched");
                } else {
                    flickerFreeClassSet(cel, "toolbaritem_flat");
                }
                continue;
            }
            if (this.undo) {
                if (pbtn.name == 'undo') {
                    if (this.undo.cursor < 1) {
                        flickerFreeClassSet(cel, "toolbaritem_disabled");
                        tbtn.state = 0;
                    } else {
                        flickerFreeClassSet(cel, "toolbaritem_flat");
                        tbtn.state = 1;
                    }
                    continue;
                }
                if (pbtn.name == 'redo') {
                    if (this.undo.cursor == (this.undo.edits.length - 1)) {
                        flickerFreeClassSet(cel, "toolbaritem_disabled");
                        tbtn.state = 0;
                    } else {
                        flickerFreeClassSet(cel, "toolbaritem_flat");
                        tbtn.state = 1;
                    }
                    continue;
                }
            }
            if (pbtn.name == 'toggle_fullscreen') {
                if (this.fullScreenState) {
                    flickerFreeClassSet(cel, "toolbaritem_latched");
                    tbtn.state = 2;
                } else {
                    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) {
                        flickerFreeClassSet(cel, "toolbaritem_latched");
                        tbtn.state = 2;
                    } else {
                        flickerFreeClassSet(cel, "toolbaritem_flat");
                        tbtn.state = 0;
                    }
                } else {
                    if (qvalue == true) {
                        flickerFreeClassSet(cel, "toolbaritem_latched");
                        tbtn.state = 2;
                    } else {
                        flickerFreeClassSet(cel, "toolbaritem_flat");
                        tbtn.state = 1;
                    }
                }
            } else {
                qstate = this.edit.queryCommandState(cmdID.toLowerCase());
                if (qstate == false) {
                    flickerFreeClassSet(cel, "toolbaritem_flat");
                    tbtn.state = 1;
                } else {
                    flickerFreeClassSet(cel, "toolbaritem_latched");
                    tbtn.state = 2;
                }
            }
        } catch (e) {
            if (pbtn.name == 'help') {
                if (this.toolbar.getHelpMode()) {
                    flickerFreeClassSet(cel, "toolbaritem_latched");
                } else {
                    flickerFreeClassSet(cel, "toolbaritem_flat");
                }
            } else if (pbtn.name == "toggle_visible") {
                if (this.viewInvisibles) {
                    flickerFreeClassSet(cel, "toolbaritem_latched");
                    tbtn.state = 2;
                } else {
                    flickerFreeClassSet(cel, "toolbaritem_flat");
                    tbtn.state = 1;
                }
            } else {
                flickerFreeClassSet(cel, "toolbaritem_flat");
                tbtn.state = 1;
            }
        }
    }
    this.ui_updateFontFace();
    this.ui_updateFontSize();
    this.ui_updateBlockFormat();
    this.logic_updateDOMHierarchy(true, 0);
    try {
        var MediaType = (this.inspectedNode.getAttribute("for") + "").toLowerCase();
    } 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 != "") && (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'));
    }
    catch (e) {
        fs = "";
    }
    if (fs == "Normal" || fs == "") {
        var sn = this.logic_getSelectedNode();
        var additionalFormattingTagNames = "div";
        additionalFormattingTagNames = "^" + additionalFormattingTagNames.toUpperCase().split(",").join("$|^") + "|";
        var lo = sn;
        while (lo && lo.tagName != "BODY" && (m = lo.tagName.match(additionalFormattingTagNames))) {
            fs = m;
            break;
            lo = lo.parentNode;
        }
    }
    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_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 "formatting":
        clean_func = util_cleanFormattingTags;
        break;
    case "css":
        clean_func = util_cleanCSSStyles;
        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();
            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 (!rng) {
                this.makeValidSelection();
                rng = this.edit.selection.createRange();
            }
            var nodesArray = this.getSelectionAsNodes(rng);
            for (var j = 0; j < nodesArray.length; j++) {
                var node = nodesArray[j];
                if (node.nodeType == 1) {
                    tmp = util_translated2plain(node.outerHTML);
                    tmp2 = clean_func(tmp);
                    try {
                        node.outerHTML = util_plain2translated(tmp2, this.counter);
                    }
                    catch (e) {}
                } else if (node.nodeType == 3) {
                    tmp = util_translated2plain(node.nodeValue);
                    tmp2 = clean_func(tmp);
                    try {
                        node.nodeValue = util_plain2translated(tmp2, this.counter);
                    }
                    catch (e) {}
                }
            }
            if (is.mozilla) {
                try {
                    rng = sel.getRangeAt(0);
                    rng.select();
                } catch (err) {}
            }
        }
    } else {
        tmp = util_translated2plain(node.innerHTML);
        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, str) {
    var str = str || ktml.getPlainSource();
    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=');
    if (is.ie) {
        str = str.replace(/(<(?:td|th)[^>]*?)\svalign=("?)center/ig, '$1 valign=$2middle');
        str = str.replace(/(<(?:td|th)[^>]*?)\salign=("?)middle/ig, '$1 align=$2center');
    }
    str = ktml.replaceTags(str);
    str = String_trim(str);
    return str;
};

function HandleIncomingText(ktml, str, mode, obj) {
    if (typeof obj != "undefined") {
        str = obj.getPlainSource();
    }
    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_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(/<param([^>]+)>/gi, function (a, b, c) {
            if (/\sname="?(movie|filename|url|src)"?/i.test(b)) {
                return '<param' + b.replace(/\svalue\s*=\s*\"?([^\"]*)"?/gi, function (a, b, c) {
                    return ' value="' + encodeURI(decodeURI(util_removeSiteNameFromHREF(ktml, b))) + '"';
                }) + '>';
            } else {
                return a;
            }
        });
        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) {
    if (blank_location == "" || !href) {
        return href;
    }
    var blank_common = blank_location.pathname.substring(blank_location.ktml_root.length);
    if (is.mozilla) {
        if (ktml && ktml.fullScreenState && /(\.\.\/){4}/.test(href)) {
            href = opener.blank_location.full + href.substring(12);
        }
        if (href.indexOf("#") == 0) {
            href = ktml_location.server + blank_location.ktml_root + blank_common + "blank.html" + href;
        } else if (href.indexOf("/") != 0 && href.indexOf(ktml_location.server) == -1 && !/^[a-zA-Z]+:/.test(href)) {
            href = ktml_location.server + blank_location.ktml_root + blank_common + href;
        } else if (href.indexOf("/") == 0) {
            href = ktml_location.server + href;
        }
        while (/\/[^\/]*\/\.\./.test(href)) {
            href = href.replace((new RegExp("\\/[^\\/]*\\/\\.\\.\\/")), '/');
        }
    }
    if (href.indexOf(ktml_location.server) == 0) {
        var 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;
    }
    if (href.indexOf(blank_location.ktml_root) == 0) {
        href = href.substring(blank_location.ktml_root.length);
    }
    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("blank.html".length);
    }
    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;
    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.full = ktml_location.server + ktml_location.pathname;
    }
};
var ktml_location = '';
ktml.prototype.addTagReplacementRule = function (tagRuleName, sTagName, sTagRule) {
    this.tagReplacementRules[tagRuleName] = {
        tagName: sTagName,
        tagRule: sTagRule
    };
};
ktml.prototype.replaceTags = function (string) {
    var allowed_empty_tags = ['td', 'th', 'a', 'embed', 'noembed', 'iframe', 'script'];
    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);
};
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 str = '';
    if (text_content == "") {
        var dont_strip = /<(?:img|table|hr|a|fieldset|form|input|button|textarea|select|object|embed)/i;
        if (dont_strip.test(html_content)) {
            str = util_translated2plain(html_content);
        }
    } else {
        str = util_translated2plain(html_content);
    }
    var str2 = str;
    str2 = str2.replace(/&nbsp;/gi, '');
    str2 = str2.replace(/<\/?p[^>]*>/gi, '');
    str2 = str2.replace(/<br\s*\/?>/gi, '');
    if (String_trim(str2) == "") {
        return '';
    } else {
        return str;
    }
};
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_InsertLink = function (url, title) {
    this.util_restoreSelection(true);
    if (this.util_selectionContainsTags('input,hr,table,select,textarea')) {
        return;
    }
    var selNode = this.logic_getSelectedNode();
    if (selNode && selNode.nodeName == 'IMG' && selNode.getAttribute("orig")) {
        return;
    }
    var par_a = null;
    if (selNode) {
        par_a = utility.dom.getParentByTagName(selNode, "A");
    }
    url = util_defaultValue(url, null);
    var prompt_for_url = util_defaultValue($KTML4_GLOBALS['insertlink_prompt_for_url'], 'true');
    if (prompt_for_url == 'false' && this.ui.showPI) {
        url = url || (par_a ? par_a.href : "http://");
    } else {
        url = url || prompt(translate("Please enter hyperlink URL:", this.config.UILanguage), par_a ? par_a.href : "http://");
    }
    if (url == null) {
        return;
    }
    title = util_defaultValue(title, url);
    if (par_a) {
        if (url == "") {
            this.edit.execCommand(KtmlGetCommand("unlink"), false, false);
        } else {
            par_a.href = url;
        }
        this.displayChanged();
        return;
    } else {
        if (!url) {
            return;
        }
    }
    url = encodeURI(decodeURI(url));
    var sel = this.edit.selection;
    if (sel.type == "None" || is.mozilla && (sel.isCollapsed || sel.focusNode.nodeName == "BR" || sel.type == "Control" && sel.focusNode.childNodes[sel.anchorOffset].nodeName == "BR")) {
        this.insertHTML(title, 'first-node', false);
        this.edit.execCommand(KtmlGetCommand('hyperlink'), false, url);
        this.undo.addEdit();
        this.displayChanged();
    } else if (sel.type == "Control") {
        var rng = sel.createRange();
        if (is.ie) {
            selNode = rng.item(0);
        } else {
            selNode = rng.startContainer.childNodes[rng.startOffset];
        }
        if (selNode) {
            var insert_html = '<a href="' + url + '">' + selNode.outerHTML + '</a>';
            this.insertHTML(insert_html, 'first-leaf');
        }
    } else {
        var rng = sel.createRange();
        var orig = rng.duplicate();
        var moved = 0;
        var old_text = rng.text;
        var new_text = old_text;
        while (true) {
            old_text = rng.text;
            if (/\s$/.test(old_text)) {
                if (is.ie) {
                    moved = rng.moveEnd("character", -1);
                } else {
                    try {
                        rng.setEnd(rng.endContainer, rng.endOffset - 1);
                    } catch (err) {
                        new_text = rng.text;
                        break;
                    }
                }
                new_text = rng.text;
                if (is.ie && !moved) {
                    break;
                }
                if (old_text == new_text) {
                    break;
                }
            } else {
                break;
            }
        }
        while (true) {
            old_text = rng.text;
            if (/^\s/.test(old_text)) {
                if (is.ie) {
                    moved = rng.moveStart("character", 1);
                } else {
                    try {
                        rng.setStart(rng.startContainer, rng.startOffset + 1);
                    } catch (err) {
                        new_text = rng.text;
                        break;
                    }
                }
                new_text = rng.text;
                if (is.ie && !moved) {
                    break;
                }
                if (old_text == new_text) {
                    break;
                }
                old_text = new_text;
            } else {
                break;
            }
        }
        if (String_trim(new_text) == '') {
            orig.select();
            alert(translate("select something", this.config.UILanguage));
            return;
        }
        rng.select();
        this.edit.execCommand(KtmlGetCommand('hyperlink'), false, url);
        this.undo.addEdit();
        this.displayChanged();
    }
    return false;
};
ktml.prototype.logic_InsertHeading = function (hName) {
    if (hName != '') {
        if (is.mozilla) {
            hName = hName.replace(/[<>]/gi, "");
        }
        this.edit.execCommand(KtmlGetCommand('blockfmt'), false, hName);
    } else {
        hName = '<p>';
        if (is.mozilla) {
            hName = hName.replace(/[<>]/gi, "");
        }
        this.edit.execCommand(KtmlGetCommand('blockfmt'), false, hName);
    }
};
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_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 == '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'], 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.insertFormElement = function (felName) {
    var newEl = null,
        newFormEl = null;
    var selNode = this.logic_getSelectedNode();
    var parentForm = utility.dom.getParentByTagName(selNode, "FORM");
    var formFound = parentForm || false;
    if (felName != "form") {
        var insertForm = false;
        if (!formFound && confirm(translate("Add form tag?", this.config.UILanguage))) {
            insertForm = true;
        }
    }
    switch (felName) {
    case "form":
        if (formFound) {
            return;
        }
        var el = utility.dom.createElement('form', {
            'method': 'POST'
        }, this.cw);
        el.innerHTML = '&nbsp;';
        break;
    case "textfield":
        var cnt = this.getNextElementName('INPUT', 'id', 'textfield');
        var sHTML = (insertForm ? '<form method="POST">' : '') + '<input ';
        sHTML += 'type="text" name="' + felName + cnt + '" id="' + felName + cnt + '"/>';
        sHTML += '&nbsp;' + (insertForm ? '</form>' : '');
        this.insertHTML(sHTML, 'first-leaf');
        return;
    case "textarea":
        var cnt = this.getNextElementName('textarea', 'id', 'textarea');
        var sHTML = (insertForm ? '<form method="POST">' : '') + '<textarea ';
        sHTML += ' name="' + felName + cnt + '" id="' + felName + cnt + '"></textarea>';
        sHTML += '&nbsp;' + (insertForm ? '</form>' : '');
        this.insertHTML(sHTML, 'first-leaf');
        return;
    case "button":
        var cnt = this.getNextElementName('INPUT', 'id', 'button');
        var sHTML = (insertForm ? '<form method="POST">' : '') + '<input ';
        sHTML += ' type="button" name="' + felName + cnt + '" id="' + felName + cnt + '" value="' + felName + cnt + '"/>';
        sHTML += '&nbsp;' + (insertForm ? '</form>' : '');
        this.insertHTML(sHTML, 'first-leaf');
        return;
    case "checkbox":
        var cnt = this.getNextElementName('INPUT', 'id', 'checkbox');
        var sHTML = (insertForm ? '<form method="POST">' : '') + '<input ';
        sHTML += ' type="checkbox" name="' + felName + cnt + '" id="' + felName + cnt + '"/>';
        sHTML += '&nbsp;' + (insertForm ? '</form>' : '');
        this.insertHTML(sHTML, 'first-leaf');
        return;
    case "radiobutton":
        var cnt = this.getNextElementName('INPUT', 'id', 'radiobutton');
        var sHTML = (insertForm ? '<form method="POST">' : '') + '<input ';
        sHTML += ' type="radio" name="' + felName + cnt + '" id="' + felName + cnt + '"/>';
        sHTML += '&nbsp;' + (insertForm ? '</form>' : '');
        this.insertHTML(sHTML, 'first-leaf');
        return;
    case "listmenu":
        var cnt = this.getNextElementName('SELECT', 'id', 'select');
        var sHTML = (insertForm ? '<form method="POST">' : '') + '<select ';
        sHTML += ' name="select' + cnt + '" id="select' + cnt + '"></select>';
        sHTML += '&nbsp;' + (insertForm ? '</form>' : '');
        this.insertHTML(sHTML, 'first-leaf');
        return;
    case "filefield":
        var cnt = this.getNextElementName('INPUT', 'id', 'filefield');
        var sHTML = (insertForm ? '<form method="POST">' : '') + '<input ';
        sHTML += ' type="file" name="' + felName + cnt + '" id="' + felName + cnt + '"/>';
        sHTML += '&nbsp;' + (insertForm ? '&nbsp;</form>' : '');
        this.insertHTML(sHTML, 'first-leaf');
        return;
    case "imagefield":
        var cnt = this.getNextElementName('INPUT', 'id', 'imagefield');
        var sHTML = (insertForm ? '<form method="POST">' : '') + '<input ';
        sHTML += ' type="image" name="' + felName + cnt + '" id="' + felName + cnt + '" src="' + window.KtmlRoot + 'core/img/imageupload.gif" />';
        sHTML += '&nbsp;' + (insertForm ? '&nbsp;</form>' : '');
        this.insertHTML(sHTML, 'first-leaf');
        return;
    case "hiddenfield":
        var cnt = this.getNextElementName('IMG', 'id', 'hiddenfield');
        this.insertHTML((insertForm ? '<form method="POST">' : '') + WMedia_Translator_translateMarkup(WMedia_Translator_translate({
            'type': 'hidden',
            'value': '',
            'name': 'hiddenfield' + cnt,
            'id': 'hiddenfield' + cnt
        }, 'hidden'), 'hidden') + '&nbsp;' + (insertForm ? '</form>' : ''));
        newEl = this.edit.getElementById('hiddenfield' + cnt);
        this.logic_domSelect(newEl);
        return;
    case "fieldset":
        var el = this.edit.createElement('fieldset');
        el.innerHTML = '<legend>' + translate("Legend", this.config.UILanguage) + '</legend>&nbsp;';
        break;
    case "label":
        var sHTML = (insertForm ? '<form method="POST">' : '') + '<label>';
        var src = this.edit.selection.type == "Control" ? "" : this.edit.selection.createRange().htmlText;
        sHTML += src || '&nbsp;';
        sHTML += '</label>&nbsp;' + (insertForm ? '</form>' : '');
        this.insertHTML(sHTML, 'first-leaf');
        return;
    }
    if (insertForm) {
        newFormEl = utility.dom.createElement('form', {
            'method': 'POST'
        }, this.cw);
        newFormEl.appendChild(el);
        el = newFormEl;
    }
    newEl = this.insertNodeAtSelection(el, true);
    this.logic_domSelect(newEl);
};
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 () {
    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');
        this.Resize();
        this.textarea.value = "";
        this.iframe.style.display = "none";
        if (this.viewInvisibles) {
            this.utils_setInvisibles(true);
        }
        this.preserveSelection(false);
        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("n/a in Source View", this.config.UILanguage);
        this.collapse(false);
        utility.window.unblockInterface();
        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><br></p>";
        }
        if (is.mozilla) {
            this.edit.designMode = 'on';
            this.edit.execCommand("useCSS", false, true);
            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;
        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(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");
            }
            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 (ktmls[i].destroyed || 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 (ktmls[i].destroyed || 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, deferred) {
    KTStorage.add(this);
    if (typeof deferred == 'undefined') {
        deferred = false;
    }
    this.deferred = deferred;
    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 " + tlb.name;
    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.deferredAfterAction = function () {
    if (this.deferred) {
        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(button.visible);
        button.width = this.width = this.getWidth();
    }
};
HtmlDropdownButton.prototype.getAsElement = function () {
    var tmp = document.createElement('span');
    tmp.innerHTML = this.htmlstring;
    return tmp.childNodes[0];
};
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;
    if (0 <= obj.highlightedIndex && obj.highlightedIndex < obj.optContainerTable.rows.length) {
        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";
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 foreground_color_command(new_value) {
    var tlb = KTStorage.get(this.toolbar_button);
    tlb.ktml.util_restoreSelection(true);
    tlb.ktml.edit.execCommand(KtmlGetCommand('forecolor'), false, new_value);
    if (tlb.ktml.undo) {
        tlb.ktml.undo.addEdit();
    }
}

function foreground_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);
        cb.closeCallback();
    };
    var el = cb.getElement("container");
    tlb.ktml.logic_openPalette(el, cb.value);
    if (is.ie) {
        var _elm = tlb.ktml.cpalette.div;
        var _ktml = tlb.ktml;
        var docObj = _ktml.edit;
        var docBox = _ktml.iframe;
        utility.dom.toggleSpecialTags(_elm, false, 1, docObj, docBox);
    };
}

function foreground_color_paint() {
    var el = this.getElement("cell");
    el.innerHTML = '<div><img src="' + KtmlRelativeImagePath + 'fgcolor.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>';
}

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 hyperlink_picker_paint() {
    var tlb = KTStorage.get(this.toolbar_button);
    var linksSrc = tlb.ktml.getModuleProperty("hyperlink_browser", "ServiceProvider");
    if (!linksSrc) {
        this.transformToImageButton();
    }
    var el = this.getElement("cell");
    el.innerHTML = '<img src="' + KtmlRelativeImagePath + 'insert_link.gif" width="16" height="16">';
};

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" border="1">\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);
    tlb.ktml.insertHTML(table_html, is.mozilla ? "first-leaf" : "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,
    'background_color': 6,
    'bold': 7,
    'bulleted_list': 8,
    'clean_menu': 9,
    'copy': 10,
    'cut': 11,
    'find_replace': 12,
    'fontsize_list': 13,
    'fonttype_list': 14,
    'foreground_color': 15,
    'heading_list': 16,
    'help': 17,
    'horizontal_rule': 18,
    'indent': 19,
    'insert_anchor': 20,
    'insert_button': 21,
    'insert_button': 22,
    'insert_character': 23,
    'insert_checkbox': 24,
    'insert_fieldset': 25,
    'insert_file': 26,
    'insert_filefield': 27,
    'insert_form': 28,
    'insert_hiddenfield': 29,
    'insert_image': 30,
    'insert_label': 31,
    'insert_link': 32,
    'insert_listmenu': 33,
    'insert_radiobutton': 34,
    'insert_table': 35,
    'insert_template': 36,
    'insert_textarea': 37,
    'insert_textfield': 38,
    '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
};

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 = [];
    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'
    })));
    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',
        'command_id': 'toggle_visible'
    })));
    tmp.push(new ToolbarButton(opt(options, {
        'name': 'toggle_editmode',
        'help': 'code_design',
        'command_id': 'toggle_editmode'
    })));
    tmp.push(new ToolbarButton(opt(options, {
        'name': 'toggle_fullscreen',
        'command_id': '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); }'
    })));
    var begin_redistribution_strip = true;
    tmp.push(new ToolbarButton(opt(options, {
        'name': 'about',
        'command_type': $KT_JS_STRING,
        'command_string': 'this.ktml.toolbar.openAboutBox()'
    })));
    var begin_redistribution_strip = false;
    options = {
        'command_type': $KT_CMD_ID,
        'button_type': 'img'
    };
    tmp.push(new ToolbarButton(opt(options, {
        'name': 'bold',
        'command_id': KtmlGetCommand('bold'),
        'help': 'basicformat_bold'
    })));
    tmp.push(new ToolbarButton(opt(options, {
        'name': 'italic',
        'command_id': KtmlGetCommand('italic'),
        'help': 'basicformat_italic'
    })));
    tmp.push(new ToolbarButton(opt(options, {
        'name': 'underline',
        'command_id': KtmlGetCommand('underline'),
        'help': 'basicformat_underline'
    })));
    tmp.push(new ToolbarButton(opt(options, {
        'name': 'superscript',
        'command_id': KtmlGetCommand('superscript'),
        'help': 'superscript'
    })));
    tmp.push(new ToolbarButton(opt(options, {
        'name': 'subscript',
        'command_id': KtmlGetCommand('subscript'),
        'help': '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'
    })));
    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'
    })));
    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'
    })));
    tmp.push(new ToolbarButton(opt(options, {
        'name': 'outdent'
    })));
    tmp.push(new ToolbarButton(opt(options, {
        'name': 'foreground_color',
        'help': 'colors_fore',
        'command_id': KtmlGetCommand('forecolor'),
        'button_type': 'combo',
        'alt_image': 'textcolor.gif',
        'default_value': '#000000'
    }), {
        'command': foreground_color_command,
        'open': foreground_color_open,
        'paint': foreground_color_paint
    }));
    tmp.push(new ToolbarButton(opt(options, {
        'name': 'background_color',
        'help': 'colors_back',
        'command_id': KtmlGetCommand('backcolor'),
        'button_type': 'combo',
        'alt_image': 'backgroundcolor.gif',
        'default_value': '#FFFF00'
    }), {
        'command': background_color_command,
        'open': background_color_open,
        'paint': background_color_paint
    }));
    options = {
        'command_type': $KT_JS_STRING,
        'button_type': 'select'
    };
    tmp.push(new ToolbarButton(opt(options, {
        'name': 'heading_list',
        'alt_text': 'Format',
        'help': 'html_tags',
        'command_id': KtmlGetCommand('blockfmt'),
        'command_string': "this.ktml.logic_doFormat('InsertHeading',this.value)"
    }), {
        'options': [{
            'value': '',
            'text': '||Normal||',
            'attributes': {
                'HTMLValue': '||Normal||'
            }
        },
        {
            '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_style',
        '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': 'fontface',
        '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': 'fontsize',
        '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': 'cleanup',
        '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_link',
        'help': 'insert_link_picker',
        'button_type': "combo",
        'alt_text': "link",
        'second_alt_text': "hyperlink_picker",
        'alt_image': "insert_link.gif",
        'default_value': {
            url: '',
            title: ''
        }
    }), {
        'command': hyperlink_picker_command,
        'open': hyperlink_picker_open,
        'paint': hyperlink_picker_paint
    }));
    tmp.push(new ToolbarButton(opt(options, {
        'name': 'insert_anchor',
        'help': 'insert_anchor',
        'command_type': $KT_CMD_ID,
        'command_id': KtmlGetCommand('insert_anchor')
    })));
    tmp.push(new ToolbarButton(opt(options, {
        'name': 'insert_table',
        'help': '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': 'insert_image',
        'help': 'browse_media',
        'command_string': 'alert("File Browser module not available!")'
    })));
    tmp.push(new ToolbarButton(opt(options, {
        'name': 'insert_file',
        'help': 'browse_doc',
        'command_string': 'alert("File Browser module not available!")'
    })));
    tmp.push(new ToolbarButton(opt(options, {
        'name': 'insert_template',
        'help': 'browse_temp',
        'command_string': 'alert("File Browser module not available!")'
    })));
    tmp.push(new ToolbarButton(opt(options, {
        'name': 'horizontal_rule',
        'help': 'horline',
        'command_type': $KT_CMD_ID,
        'command_id': KtmlGetCommand('inserthr'),
        'command_string': 'InsertHorizontalRule'
    })));
    tmp.push(new ToolbarButton(opt(options, {
        'name': 'insert_character',
        'help': 'insert_character',
        'button_type': "combo",
        'default_value': '&copy;',
        'alt_image': 'omega.gif'
    }), {
        'command': insert_character_command,
        'open': insert_character_open,
        'paint': insert_character_paint
    }));
    options = {
        'command_type': $KT_JS_STRING,
        'button_type': 'img'
    };
    var default_command_string = "this.ktml.insertFormElement('%s')";
    tmp.push(new ToolbarButton(opt(options, {
        'name': 'insert_form',
        'help': 'form_tb_form',
        'command_string': utility.string.sprintf(default_command_string, 'form')
    })));
    tmp.push(new ToolbarButton(opt(options, {
        'name': 'insert_textfield',
        'help': 'form_tb_text_field',
        'command_string': utility.string.sprintf(default_command_string, 'textfield')
    })));
    tmp.push(new ToolbarButton(opt(options, {
        'name': 'insert_textarea',
        'help': 'form_tb_textarea',
        'command_string': utility.string.sprintf(default_command_string, 'textarea')
    })));
    tmp.push(new ToolbarButton(opt(options, {
        'name': 'insert_button',
        'help': 'form_tb_button',
        'command_string': utility.string.sprintf(default_command_string, 'button')
    })));
    tmp.push(new ToolbarButton(opt(options, {
        'name': 'insert_checkbox',
        'help': 'form_tb_checkbox',
        'command_string': utility.string.sprintf(default_command_string, 'checkbox')
    })));
    tmp.push(new ToolbarButton(opt(options, {
        'name': 'insert_radiobutton',
        'help': 'form_tb_radio_button',
        'command_string': utility.string.sprintf(default_command_string, 'radiobutton')
    })));
    tmp.push(new ToolbarButton(opt(options, {
        'name': 'insert_listmenu',
        'help': 'form_tb_list_menu',
        'command_string': utility.string.sprintf(default_command_string, 'listmenu')
    })));
    tmp.push(new ToolbarButton(opt(options, {
        'name': 'insert_radiobutton',
        'help': 'form_tb_radiobutton',
        'command_string': utility.string.sprintf(default_command_string, 'radiobutton')
    })));
    tmp.push(new ToolbarButton(opt(options, {
        'name': 'insert_filefield',
        'help': 'form_tb_file_field',
        'command_string': utility.string.sprintf(default_command_string, 'filefield')
    })));
    tmp.push(new ToolbarButton(opt(options, {
        'name': 'insert_hiddenfield',
        'help': 'form_tb_hidden_field',
        'command_string': utility.string.sprintf(default_command_string, 'hiddenfield')
    })));
    tmp.push(new ToolbarButton(opt(options, {
        'name': 'insert_fieldset',
        'help': 'form_tb_fieldset',
        'command_string': utility.string.sprintf(default_command_string, 'fieldset')
    })));
    tmp.push(new ToolbarButton(opt(options, {
        'name': 'insert_label',
        'help': 'form_tb_label',
        'command_string': utility.string.sprintf(default_command_string, 'label')
    })));
    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 begin_redistribution_strip = true;
    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;
        }
    }
    _aboutBtnObj.group = _targGroupName;
    for (var z = 0; z < arr.length; z++) {
        var _tmpRow = arr[z];
        if (_tmpRow[1] == _targGroupName) {
            _tmpRow[2].push("about");
        }
    }
    var begin_redistribution_strip = false;
    var _addedAbout = false;
    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) {
                    if (row[2][j] == "about") {
                        if (_addedAbout == true) {
                            continue;
                        }
                        _addedAbout = true;
                    } else {
                        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];
            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 - 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 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];
            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:
        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];
        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) {
    var postfix = "../resources/KTMLHelp.html?ktmlid=" + this.owner.counter + "&topic_id=" + fname;
    var helpUrl = KtmlRoot + postfix;
    utility.window.openWindow("_help" + parseInt(Math.random() * 1000000000), helpUrl, 550, 300, false);
};
var begin_redistribution_strip = true;
Toolbar.prototype.openAboutBox = function () {
    utility.window.openWindow("_about" + parseInt(Math.random() * 1000000000), KtmlRoot + "core/htm/about.html", 350, 220);
};
var begin_redistribution_strip = false;
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 () {
    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" \
    onmouseover="flickerFreeClassSet(this, \'ktmlContextMenuItem_highlight\')" \
    onmouseout="flickerFreeClassSet(this, \'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;
};
