static/admin/TinyMCETextArea.js
function () {

        var me = this,
            activeError = me.getActiveError(),
            hasError = !!activeError;

        var edTable = Ext.get(me.getInputId() + "_tbl");
        var edIframe = Ext.get(me.getInputId() + "_ifr");

        if (!edTable) { return me.callParent(arguments); }

        /*
         Adding the red border to the mceIframeContainer is the most sure
         way to do it without harming sizing and positioning.
         */
        var edFrameContainer = edTable.down(".mceIframeContainer");

        if (edFrameContainer && me.rendered && !me.isDestroyed && !me.preventMark) {
            var ed = tinymce.get(me.getInputId());

            var evHandler = function (ed, e) {
                me.clearInvalid();
            };

            // Add/remove invalid class
            if (hasError) {
                edFrameContainer.addCls('tinymce-error-field');

                // this dirty hack is required for WebKit browsers - Safari and Chrome
                edIframe.setHeight(edIframe.getHeight() - 1);
                edIframe.setHeight(edIframe.getHeight() + 1);

                if (ed) {
                    // the invalid mark should be removed after any
                    // change of the contents (ExtJS standard behaviour)
                    ed.onKeyDown.add(evHandler);
                }
            }
            else {
                edFrameContainer.removeCls('tinymce-error-field');

                // this dirty hack is required for WebKit browsers - Safari and Chrome
                edIframe.setHeight(edIframe.getHeight() - 1);
                edIframe.setHeight(edIframe.getHeight() + 1);

                if (ed) {
                    ed.onKeyDown.remove(evHandler);
                    ed.onChange.remove(evHandler);
                }
            }
        }

        return me.callParent(arguments);
    }
function () {

        var me = this,
            activeError = me.getActiveError(),
            hasError = !!activeError;

        var edTable = Ext.get(me.getInputId() + "_tbl");
        var edIframe = Ext.get(me.getInputId() + "_ifr");

        if (!edTable) { return me.callParent(arguments); }

        /*
         Adding the red border to the mceIframeContainer is the most sure
         way to do it without harming sizing and positioning.
         */
        var edFrameContainer = edTable.down(".mceIframeContainer");

        if (edFrameContainer && me.rendered && !me.isDestroyed && !me.preventMark) {
            var ed = tinymce.get(me.getInputId());

            var evHandler = function (ed, e) {
                me.clearInvalid();
            };

            // Add/remove invalid class
            if (hasError) {
                edFrameContainer.addCls('tinymce-error-field');

                // this dirty hack is required for WebKit browsers - Safari and Chrome
                edIframe.setHeight(edIframe.getHeight() - 1);
                edIframe.setHeight(edIframe.getHeight() + 1);

                if (ed) {
                    // the invalid mark should be removed after any
                    // change of the contents (ExtJS standard behaviour)
                    ed.onKeyDown.add(evHandler);
                }
            }
            else {
                edFrameContainer.removeCls('tinymce-error-field');

                // this dirty hack is required for WebKit browsers - Safari and Chrome
                edIframe.setHeight(edIframe.getHeight() - 1);
                edIframe.setHeight(edIframe.getHeight() + 1);

                if (ed) {
                    ed.onKeyDown.remove(evHandler);
                    ed.onChange.remove(evHandler);
                }
            }
        }

        return me.callParent(arguments);
    }
-----------------------------------------------------------------