CKEditor

HTML

<script src="http://ckeditor.com/apps/ckeditor/4.0/ckeditor.js"></script>
<link rel="stylesheet" href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.0/css/bootstrap-combined.min.css">
<script src="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.0/js/bootstrap.min.js"></script>
<h3>CKEditor 4:</h3>

<label><input type="checkbox" name="one" value="one" checked="checked" />one</label>
<label><input type="checkbox" name="two" value="two" />two</label>
<label><input type="checkbox" name="three" value="three" />three</label>
<label><input type="checkbox" name="four" value="four" />four</label>

<textarea id="editor1">Test</textarea>

<input type="button" id="reinit_editor" value="reinit editor" />

JavaScript

var merge_fields = ["one","two","three", "four"];

var buildListHasRunOnce = 0;

var buildList = function ()
{
    console.log("buildList");
    if (buildListHasRunOnce == 1) {
        console.log("remove ul");
        // Remove the old unordered list from the dom.
        // This is just to cleanup the old list within the iframe
        $(this._.panel._.iframe.$).contents().find("ul").remove();
        // reset list
        this._.items = {};
        this._.list._.items = {};
    }

    for (var i in merge_fields) {
        var item = merge_fields[i];
        var cb = $("input[name='" + item + "']");
        if(cb.is(":checked")){
            this.add(item, "<span class='mergefield listitem'>" + item + "</span>", item);
        }
    }

    if (buildListHasRunOnce == 1) {
        console.log("this._.committed = 0");
        // Force CKEditor to commit the html it generates through this.add
        this._.committed = 0; // We have to set to false in order to trigger a complete commit()
        this.commit();
    }

    buildListHasRunOnce = 1;
};

CKEDITOR.plugins.add('merge',
        {
            requires: ['richcombo'], //, 'styles' ],
            init: function (editor) {
                var config = editor.config,
                lang = editor.lang.format;

                editor.ui.addRichCombo('Merge',
                {
                    label: "Merge",
                    title: "mergefields",
                    id: 'mergefields',
                    className: 'cke_format',
                    multiSelect: false,

                    panel:
                    {
                        css: [config.contentsCss, CKEDITOR.getUrl(editor.skinPath + 'editor.css')],
                        voiceLabel: lang.panelVoiceLabel
                    },

                    init: function () {
                        console.log("init()");
                        var rebuildList = CKEDITOR.tools.bind(buildList, this);
                        rebuildList();
         ...