editor-base-debug.js revision 1d01372aa06d46fcbeeae1718c35cf404f412a85
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav GlassYUI.add('editor-base', function(Y) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Base class for Editor. Handles the business logic of Editor, no GUI involved only utility methods and events.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * var editor = new Y.EditorBase({
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * content: 'Foo'
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * });
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * editor.render('#demo');
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @class EditorBase
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @extends Base
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @module editor
33a04233c7a32ec1ac1b5d5991097fe0b099e87bDav Glass * @main editor
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @submodule editor-base
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @constructor
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var EditorBase = function() {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass EditorBase.superclass.constructor.apply(this, arguments);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }, LAST_CHILD = ':last-child', BODY = 'body';
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass Y.extend(EditorBase, Y.Base, {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Internal reference to the Y.Frame instance
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @property frame
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass frame: null,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass initializer: function() {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var frame = new Y.Frame({
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass designMode: true,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass title: EditorBase.STRINGS.title,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass use: EditorBase.USE,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass dir: this.get('dir'),
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass extracss: this.get('extracss'),
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass linkedcss: this.get('linkedcss'),
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass defaultblock: this.get('defaultblock'),
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass host: this
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }).plug(Y.Plugin.ExecCommand);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass frame.after('ready', Y.bind(this._afterFrameReady, this));
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass frame.addTarget(this);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this.frame = frame;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this.publish('nodeChange', {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass emitFacade: true,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass bubbles: true,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass defaultFn: this._defNodeChangeFn
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass });
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass //this.plug(Y.Plugin.EditorPara);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass destructor: function() {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this.frame.destroy();
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this.detachAll();
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Copy certain styles from one node instance to another (used for new paragraph creation mainly)
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method copyStyles
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param {Node} from The Node instance to copy the styles from
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param {Node} to The Node instance to copy the styles to
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass copyStyles: function(from, to) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (from.test('a')) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass //Don't carry the A styles
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass return;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var styles = ['color', 'fontSize', 'fontFamily', 'backgroundColor', 'fontStyle' ],
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass newStyles = {};
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass Y.each(styles, function(v) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass newStyles[v] = from.getStyle(v);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass });
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (from.ancestor('b,strong')) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass newStyles.fontWeight = 'bold';
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (from.ancestor('u')) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (!newStyles.textDecoration) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass newStyles.textDecoration = 'underline';
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass to.setStyles(newStyles);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Holder for the selection bookmark in IE.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @property _lastBookmark
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @private
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _lastBookmark: null,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Resolves the e.changedNode in the nodeChange event if it comes from the document. If
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * the event came from the document, it will get the last child of the last child of the document
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * and return that instead.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method _resolveChangedNode
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param {Node} n The node to resolve
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @private
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _resolveChangedNode: function(n) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var inst = this.getInstance(), lc, lc2, found;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (inst && n && n.test('html')) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass lc = inst.one(BODY).one(LAST_CHILD);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass while (!found) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (lc) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass lc2 = lc.one(LAST_CHILD);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (lc2) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass lc = lc2;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass } else {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass found = true;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass } else {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass found = true;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (lc) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (lc.test('br')) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (lc.previous()) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass lc = lc.previous();
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass } else {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass lc = lc.get('parentNode');
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (lc) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass n = lc;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
2bbe3ca8cfbb948b9b6356ae16759f1d6245433cDav Glass }
2bbe3ca8cfbb948b9b6356ae16759f1d6245433cDav Glass if (!n) {
2bbe3ca8cfbb948b9b6356ae16759f1d6245433cDav Glass //Fallback to make sure a node is attached to the event
2bbe3ca8cfbb948b9b6356ae16759f1d6245433cDav Glass n = inst.one(BODY);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass return n;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * The default handler for the nodeChange event.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method _defNodeChangeFn
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param {Event} e The event
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @private
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _defNodeChangeFn: function(e) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var startTime = (new Date()).getTime();
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass //Y.log('Default nodeChange function: ' + e.changedType, 'info', 'editor');
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var inst = this.getInstance(), sel, cur,
1d01372aa06d46fcbeeae1718c35cf404f412a85Dav Glass btag = inst.EditorSelection.DEFAULT_BLOCK_TAG;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (Y.UA.ie) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass try {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sel = inst.config.doc.selection.createRange();
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (sel.getBookmark) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this._lastBookmark = sel.getBookmark();
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass } catch (ie) {}
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass e.changedNode = this._resolveChangedNode(e.changedNode);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /*
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @TODO
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * This whole method needs to be fixed and made more dynamic.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Maybe static functions for the e.changeType and an object bag
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * to walk through and filter to pass off the event to before firing..
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass switch (e.changedType) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass case 'keydown':
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (!Y.UA.gecko) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (!EditorBase.NC_KEYS[e.changedEvent.keyCode] && !e.changedEvent.shiftKey && !e.changedEvent.ctrlKey && (e.changedEvent.keyCode !== 13)) {
1d01372aa06d46fcbeeae1718c35cf404f412a85Dav Glass //inst.later(100, inst, inst.EditorSelection.cleanCursor);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass break;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass case 'tab':
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (!e.changedNode.test('li, li *') && !e.changedEvent.shiftKey) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass e.changedEvent.frameEvent.preventDefault();
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass Y.log('Overriding TAB key to insert HTML: HALTING', 'info', 'editor');
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (Y.UA.webkit) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this.execCommand('inserttext', '\t');
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass } else if (Y.UA.gecko) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this.frame.exec._command('inserthtml', EditorBase.TABKEY);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass } else if (Y.UA.ie) {
4a537b3e113d7fa233abca2203a60b7c7d6d71dbDav Glass this.execCommand('inserthtml', EditorBase.TABKEY);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass break;
7b9d2bac493c21a0a495ff308067228048ad4e6dDav Glass case 'backspace-up':
7b9d2bac493c21a0a495ff308067228048ad4e6dDav Glass // Fixes #2531090 - Joins text node strings so they become one for bidi
7b9d2bac493c21a0a495ff308067228048ad4e6dDav Glass if (Y.UA.webkit && e.changedNode) {
7b9d2bac493c21a0a495ff308067228048ad4e6dDav Glass e.changedNode.set('innerHTML', e.changedNode.get('innerHTML'));
7b9d2bac493c21a0a495ff308067228048ad4e6dDav Glass }
7b9d2bac493c21a0a495ff308067228048ad4e6dDav Glass break;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (Y.UA.webkit && e.commands && (e.commands.indent || e.commands.outdent)) {
85e7d45c9d75f951c20b6054cb4ca593a8cc0b77Dav Glass /*
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * When executing execCommand 'indent or 'outdent' Webkit applies
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * a class to the BLOCKQUOTE that adds left/right margin to it
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * This strips that style so it is just a normal BLOCKQUOTE
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var bq = inst.all('.webkit-indent-blockquote');
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (bq.size()) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass bq.setStyle('margin', '');
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var changed = this.getDomPath(e.changedNode, false),
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass cmds = {}, family, fsize, classes = [],
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass fColor = '', bColor = '';
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (e.commands) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass cmds = e.commands;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
4a537b3e113d7fa233abca2203a60b7c7d6d71dbDav Glass var normal = false;
4a537b3e113d7fa233abca2203a60b7c7d6d71dbDav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass Y.each(changed, function(el) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var tag = el.tagName.toLowerCase(),
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass cmd = EditorBase.TAG2CMD[tag];
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (cmd) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass cmds[cmd] = 1;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass //Bold and Italic styles
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var s = el.currentStyle || el.style;
4a537b3e113d7fa233abca2203a60b7c7d6d71dbDav Glass
4a537b3e113d7fa233abca2203a60b7c7d6d71dbDav Glass if ((''+s.fontWeight) == 'normal') {
4a537b3e113d7fa233abca2203a60b7c7d6d71dbDav Glass normal = true;
4a537b3e113d7fa233abca2203a60b7c7d6d71dbDav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if ((''+s.fontWeight) == 'bold') { //Cast this to a string
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass cmds.bold = 1;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (Y.UA.ie) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (s.fontWeight > 400) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass cmds.bold = 1;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (s.fontStyle == 'italic') {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass cmds.italic = 1;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
4a537b3e113d7fa233abca2203a60b7c7d6d71dbDav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (s.textDecoration == 'underline') {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass cmds.underline = 1;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (s.textDecoration == 'line-through') {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass cmds.strikethrough = 1;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var n = inst.one(el);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (n.getStyle('fontFamily')) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var family2 = n.getStyle('fontFamily').split(',')[0].toLowerCase();
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (family2) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass family = family2;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (family) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass family = family.replace(/'/g, '').replace(/"/g, '');
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass fsize = EditorBase.NORMALIZE_FONTSIZE(n);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var cls = el.className.split(' ');
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass Y.each(cls, function(v) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (v !== '' && (v.substr(0, 4) !== 'yui_')) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass classes.push(v);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass });
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass fColor = EditorBase.FILTER_RGB(n.getStyle('color'));
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var bColor2 = EditorBase.FILTER_RGB(s.backgroundColor);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (bColor2 !== 'transparent') {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (bColor2 !== '') {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass bColor = bColor2;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass });
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
4a537b3e113d7fa233abca2203a60b7c7d6d71dbDav Glass if (normal) {
4a537b3e113d7fa233abca2203a60b7c7d6d71dbDav Glass delete cmds.bold;
4a537b3e113d7fa233abca2203a60b7c7d6d71dbDav Glass delete cmds.italic;
4a537b3e113d7fa233abca2203a60b7c7d6d71dbDav Glass }
4a537b3e113d7fa233abca2203a60b7c7d6d71dbDav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass e.dompath = inst.all(changed);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass e.classNames = classes;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass e.commands = cmds;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass //TODO Dont' like this, not dynamic enough..
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (!e.fontFamily) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass e.fontFamily = family;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (!e.fontSize) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass e.fontSize = fsize;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (!e.fontColor) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass e.fontColor = fColor;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (!e.backgroundColor) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass e.backgroundColor = bColor;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var endTime = (new Date()).getTime();
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass Y.log('_defNodeChangeTimer 2: ' + (endTime - startTime) + 'ms', 'info', 'selection');
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Walk the dom tree from this node up to body, returning a reversed array of parents.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method getDomPath
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param {Node} node The Node to start from
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass getDomPath: function(node, nodeList) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var domPath = [], domNode,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass inst = this.frame.getInstance();
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass domNode = inst.Node.getDOMNode(node);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass //return inst.all(domNode);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass while (domNode !== null) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if ((domNode === inst.config.doc.documentElement) || (domNode === inst.config.doc) || !domNode.tagName) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass domNode = null;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass break;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (!inst.DOM.inDoc(domNode)) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass domNode = null;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass break;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass //Check to see if we get el.nodeName and nodeType
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (domNode.nodeName && domNode.nodeType && (domNode.nodeType == 1)) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass domPath.push(domNode);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (domNode == inst.config.doc.body) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass domNode = null;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass break;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass domNode = domNode.parentNode;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /*{{{ Using Node
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass while (node !== null) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (node.test('html') || node.test('doc') || !node.get('tagName')) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass node = null;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass break;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (!node.inDoc()) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass node = null;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass break;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass //Check to see if we get el.nodeName and nodeType
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (node.get('nodeName') && node.get('nodeType') && (node.get('nodeType') == 1)) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass domPath.push(inst.Node.getDOMNode(node));
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (node.test('body')) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass node = null;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass break;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass node = node.get('parentNode');
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }}}*/
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (domPath.length === 0) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass domPath[0] = inst.config.doc.body;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (nodeList) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass return inst.all(domPath.reverse());
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass } else {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass return domPath.reverse();
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * After frame ready, bind mousedown & keyup listeners
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method _afterFrameReady
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @private
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _afterFrameReady: function() {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var inst = this.frame.getInstance();
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this.frame.on('dom:mouseup', Y.bind(this._onFrameMouseUp, this));
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this.frame.on('dom:mousedown', Y.bind(this._onFrameMouseDown, this));
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this.frame.on('dom:keydown', Y.bind(this._onFrameKeyDown, this));
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (Y.UA.ie) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this.frame.on('dom:activate', Y.bind(this._onFrameActivate, this));
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this.frame.on('dom:beforedeactivate', Y.bind(this._beforeFrameDeactivate, this));
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this.frame.on('dom:keyup', Y.bind(this._onFrameKeyUp, this));
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this.frame.on('dom:keypress', Y.bind(this._onFrameKeyPress, this));
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this.frame.on('dom:paste', Y.bind(this._onPaste, this));
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
1d01372aa06d46fcbeeae1718c35cf404f412a85Dav Glass inst.EditorSelection.filter();
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this.fire('ready');
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Caches the current cursor position in IE.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method _beforeFrameDeactivate
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @private
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _beforeFrameDeactivate: function(e) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (e.frameTarget.test('html')) { //Means it came from a scrollbar
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass return;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var inst = this.getInstance(),
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sel = inst.config.doc.selection.createRange();
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (sel.compareEndPoints && !sel.compareEndPoints('StartToEnd', sel)) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sel.pasteHTML('<var id="yui-ie-cursor">');
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Moves the cached selection bookmark back so IE can place the cursor in the right place.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method _onFrameActivate
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @private
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _onFrameActivate: function(e) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (e.frameTarget.test('html')) { //Means it came from a scrollbar
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass return;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var inst = this.getInstance(),
1d01372aa06d46fcbeeae1718c35cf404f412a85Dav Glass sel = new inst.EditorSelection(),
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass range = sel.createRange(),
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass cur = inst.all('#yui-ie-cursor');
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (cur.size()) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass cur.each(function(n) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass n.set('id', '');
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (range.moveToElementText) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass try {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass range.moveToElementText(n._node);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var moved = range.move('character', -1);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (moved === -1) { //Only move up if we actually moved back.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass range.move('character', 1);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass range.select();
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass range.text = '';
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass } catch (e) {}
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass n.remove();
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass });
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Fires nodeChange event
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method _onPaste
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @private
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _onPaste: function(e) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this.fire('nodeChange', { changedNode: e.frameTarget, changedType: 'paste', changedEvent: e.frameEvent });
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Fires nodeChange event
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method _onFrameMouseUp
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @private
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _onFrameMouseUp: function(e) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this.fire('nodeChange', { changedNode: e.frameTarget, changedType: 'mouseup', changedEvent: e.frameEvent });
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Fires nodeChange event
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method _onFrameMouseDown
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @private
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _onFrameMouseDown: function(e) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this.fire('nodeChange', { changedNode: e.frameTarget, changedType: 'mousedown', changedEvent: e.frameEvent });
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Caches a copy of the selection for key events. Only creating the selection on keydown
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @property _currentSelection
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @private
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _currentSelection: null,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Holds the timer for selection clearing
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @property _currentSelectionTimer
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @private
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _currentSelectionTimer: null,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Flag to determine if we can clear the selection or not.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @property _currentSelectionClear
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @private
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _currentSelectionClear: null,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Fires nodeChange event
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method _onFrameKeyDown
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @private
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _onFrameKeyDown: function(e) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var inst, sel;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (!this._currentSelection) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (this._currentSelectionTimer) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this._currentSelectionTimer.cancel();
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this._currentSelectionTimer = Y.later(850, this, function() {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this._currentSelectionClear = true;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass });
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass inst = this.frame.getInstance();
1d01372aa06d46fcbeeae1718c35cf404f412a85Dav Glass sel = new inst.EditorSelection(e);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this._currentSelection = sel;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass } else {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass sel = this._currentSelection;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass inst = this.frame.getInstance();
1d01372aa06d46fcbeeae1718c35cf404f412a85Dav Glass sel = new inst.EditorSelection();
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this._currentSelection = sel;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (sel && sel.anchorNode) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this.fire('nodeChange', { changedNode: sel.anchorNode, changedType: 'keydown', changedEvent: e.frameEvent });
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (EditorBase.NC_KEYS[e.keyCode]) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this.fire('nodeChange', { changedNode: sel.anchorNode, changedType: EditorBase.NC_KEYS[e.keyCode], changedEvent: e.frameEvent });
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this.fire('nodeChange', { changedNode: sel.anchorNode, changedType: EditorBase.NC_KEYS[e.keyCode] + '-down', changedEvent: e.frameEvent });
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Fires nodeChange event
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method _onFrameKeyPress
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @private
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _onFrameKeyPress: function(e) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var sel = this._currentSelection;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (sel && sel.anchorNode) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this.fire('nodeChange', { changedNode: sel.anchorNode, changedType: 'keypress', changedEvent: e.frameEvent });
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (EditorBase.NC_KEYS[e.keyCode]) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this.fire('nodeChange', { changedNode: sel.anchorNode, changedType: EditorBase.NC_KEYS[e.keyCode] + '-press', changedEvent: e.frameEvent });
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Fires nodeChange event for keyup on specific keys
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method _onFrameKeyUp
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @private
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass _onFrameKeyUp: function(e) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var inst = this.frame.getInstance(),
1d01372aa06d46fcbeeae1718c35cf404f412a85Dav Glass sel = new inst.EditorSelection(e);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (sel && sel.anchorNode) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this.fire('nodeChange', { changedNode: sel.anchorNode, changedType: 'keyup', selection: sel, changedEvent: e.frameEvent });
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (EditorBase.NC_KEYS[e.keyCode]) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this.fire('nodeChange', { changedNode: sel.anchorNode, changedType: EditorBase.NC_KEYS[e.keyCode] + '-up', selection: sel, changedEvent: e.frameEvent });
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (this._currentSelectionClear) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this._currentSelectionClear = this._currentSelection = null;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Pass through to the frame.execCommand method
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method execCommand
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param {String} cmd The command to pass: inserthtml, insertimage, bold
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param {String} val The optional value of the command: Helvetica
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @return {Node/NodeList} The Node or Nodelist affected by the command. Only returns on override commands, not browser defined commands.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass execCommand: function(cmd, val) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var ret = this.frame.execCommand(cmd, val),
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass inst = this.frame.getInstance(),
1d01372aa06d46fcbeeae1718c35cf404f412a85Dav Glass sel = new inst.EditorSelection(), cmds = {},
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass e = { changedNode: sel.anchorNode, changedType: 'execcommand', nodes: ret };
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass switch (cmd) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass case 'forecolor':
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass e.fontColor = val;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass break;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass case 'backcolor':
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass e.backgroundColor = val;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass break;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass case 'fontsize':
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass e.fontSize = val;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass break;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass case 'fontname':
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass e.fontFamily = val;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass break;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass cmds[cmd] = 1;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass e.commands = cmds;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this.fire('nodeChange', e);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass return ret;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Get the YUI instance of the frame
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method getInstance
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @return {YUI} The YUI instance bound to the frame.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass getInstance: function() {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass return this.frame.getInstance();
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Renders the Y.Frame to the passed node.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method render
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param {Selector/HTMLElement/Node} node The node to append the Editor to
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @return {EditorBase}
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @chainable
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass render: function(node) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this.frame.set('content', this.get('content'));
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this.frame.render(node);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass return this;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Focus the contentWindow of the iframe
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method focus
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param {Function} fn Callback function to execute after focus happens
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @return {EditorBase}
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @chainable
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass focus: function(fn) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this.frame.focus(fn);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass return this;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Handles the showing of the Editor instance. Currently only handles the iframe
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method show
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @return {EditorBase}
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @chainable
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass show: function() {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this.frame.show();
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass return this;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Handles the hiding of the Editor instance. Currently only handles the iframe
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method hide
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @return {EditorBase}
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @chainable
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass hide: function() {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this.frame.hide();
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass return this;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * (Un)Filters the content of the Editor, cleaning YUI related code. //TODO better filtering
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method getContent
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @return {String} The filtered content of the Editor
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass getContent: function() {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var html = '', inst = this.getInstance();
1d01372aa06d46fcbeeae1718c35cf404f412a85Dav Glass if (inst && inst.EditorSelection) {
1d01372aa06d46fcbeeae1718c35cf404f412a85Dav Glass html = inst.EditorSelection.unfilter();
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass //Removing the _yuid from the objects in IE
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass html = html.replace(/ _yuid="([^>]*)"/g, '');
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass return html;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }, {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @static
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method NORMALIZE_FONTSIZE
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @description Pulls the fontSize from a node, then checks for string values (x-large, x-small)
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * and converts them to pixel sizes. If the parsed size is different from the original, it calls
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * node.setStyle to update the node with a pixel size for normalization.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass NORMALIZE_FONTSIZE: function(n) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var size = n.getStyle('fontSize'), oSize = size;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass switch (size) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass case '-webkit-xxx-large':
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass size = '48px';
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass break;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass case 'xx-large':
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass size = '32px';
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass break;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass case 'x-large':
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass size = '24px';
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass break;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass case 'large':
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass size = '18px';
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass break;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass case 'medium':
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass size = '16px';
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass break;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass case 'small':
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass size = '13px';
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass break;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass case 'x-small':
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass size = '10px';
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass break;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (oSize !== size) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass n.setStyle('fontSize', size);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass return size;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @static
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @property TABKEY
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @description The HTML markup to use for the tabkey
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass TABKEY: '<span class="tab">&nbsp;&nbsp;&nbsp;&nbsp;</span>',
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @static
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @method FILTER_RGB
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param String css The CSS string containing rgb(#,#,#);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @description Converts an RGB color string to a hex color, example: rgb(0, 255, 0) converts to #00ff00
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @return String
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass FILTER_RGB: function(css) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (css.toLowerCase().indexOf('rgb') != -1) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var exp = new RegExp("(.*?)rgb\\s*?\\(\\s*?([0-9]+).*?,\\s*?([0-9]+).*?,\\s*?([0-9]+).*?\\)(.*?)", "gi");
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var rgb = css.replace(exp, "$1,$2,$3,$4,$5").split(',');
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (rgb.length == 5) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var r = parseInt(rgb[1], 10).toString(16);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var g = parseInt(rgb[2], 10).toString(16);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass var b = parseInt(rgb[3], 10).toString(16);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass r = r.length == 1 ? '0' + r : r;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass g = g.length == 1 ? '0' + g : g;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass b = b.length == 1 ? '0' + b : b;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass css = "#" + r + g + b;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass return css;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @static
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @property TAG2CMD
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @description A hash table of tags to their execcomand's
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass TAG2CMD: {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass 'b': 'bold',
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass 'strong': 'bold',
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass 'i': 'italic',
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass 'em': 'italic',
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass 'u': 'underline',
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass 'sup': 'superscript',
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass 'sub': 'subscript',
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass 'img': 'insertimage',
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass 'a' : 'createlink',
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass 'ul' : 'insertunorderedlist',
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass 'ol' : 'insertorderedlist'
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Hash table of keys to fire a nodeChange event for.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @static
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @property NC_KEYS
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @type Object
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass NC_KEYS: {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass 8: 'backspace',
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass 9: 'tab',
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass 13: 'enter',
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass 32: 'space',
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass 33: 'pageup',
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass 34: 'pagedown',
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass 35: 'end',
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass 36: 'home',
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass 37: 'left',
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass 38: 'up',
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass 39: 'right',
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass 40: 'down',
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass 46: 'delete'
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * The default modules to use inside the Frame
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @static
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @property USE
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @type Array
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
1d01372aa06d46fcbeeae1718c35cf404f412a85Dav Glass USE: ['substitute', 'node', 'selector-css3', 'editor-selection', 'stylesheet'],
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * The Class Name: editorBase
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @static
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @property NAME
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass NAME: 'editorBase',
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
10d8bafc5c24f3a4285cf6060a1935ba5cfc4b85Luke Smith * Editor Strings. By default contains only the `title` property for the
10d8bafc5c24f3a4285cf6060a1935ba5cfc4b85Luke Smith * Title of frame document (default "Rich Text Editor").
10d8bafc5c24f3a4285cf6060a1935ba5cfc4b85Luke Smith *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @static
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @property STRINGS
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass STRINGS: {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass title: 'Rich Text Editor'
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass ATTRS: {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * The content to load into the Editor Frame
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @attribute content
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass content: {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass value: '<br class="yui-cursor">',
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass setter: function(str) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (str.substr(0, 1) === "\n") {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass Y.log('Stripping first carriage return from content before injecting', 'warn', 'editor');
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass str = str.substr(1);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (str === '') {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass str = '<br class="yui-cursor">';
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (str === ' ') {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (Y.UA.gecko) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass str = '<br class="yui-cursor">';
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass return this.frame.set('content', str);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass getter: function() {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass return this.frame.get('content');
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * The value of the dir attribute on the HTML element of the frame. Default: ltr
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @attribute dir
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass dir: {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass writeOnce: true,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass value: 'ltr'
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @attribute linkedcss
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @description An array of url's to external linked style sheets
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @type String
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass linkedcss: {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass value: '',
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass setter: function(css) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (this.frame) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this.frame.set('linkedcss', css);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass return css;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @attribute extracss
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @description A string of CSS to add to the Head of the Editor
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @type String
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass extracss: {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass value: false,
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass setter: function(css) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (this.frame) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass this.frame.set('extracss', css);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass return css;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass },
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @attribute defaultblock
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @description The default tag to use for block level items, defaults to: p
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @type String
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass defaultblock: {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass value: 'p'
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass });
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass Y.EditorBase = EditorBase;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @event nodeChange
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @description Fired from several mouse/key/paste event points.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param {Event.Facade} event An Event Facade object with the following specific properties added:
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * <dl>
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * <dt>changedEvent</dt><dd>The event that caused the nodeChange</dd>
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * <dt>changedNode</dt><dd>The node that was interacted with</dd>
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * <dt>changedType</dt><dd>The type of change: mousedown, mouseup, right, left, backspace, tab, enter, etc..</dd>
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * <dt>commands</dt><dd>The list of execCommands that belong to this change and the dompath that's associated with the changedNode</dd>
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * <dt>classNames</dt><dd>An array of classNames that are applied to the changedNode and all of it's parents</dd>
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * <dt>dompath</dt><dd>A sorted array of node instances that make up the DOM path from the changedNode to body.</dd>
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * <dt>backgroundColor</dt><dd>The cascaded backgroundColor of the changedNode</dd>
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * <dt>fontColor</dt><dd>The cascaded fontColor of the changedNode</dd>
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * <dt>fontFamily</dt><dd>The cascaded fontFamily of the changedNode</dd>
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * <dt>fontSize</dt><dd>The cascaded fontSize of the changedNode</dd>
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * </dl>
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @type {Event.Custom}
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @event ready
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @description Fired after the frame is ready.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param {Event.Facade} event An Event Facade object.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @type {Event.Custom}
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
1d01372aa06d46fcbeeae1718c35cf404f412a85Dav Glass}, '@VERSION@' ,{skinnable:false, requires:['base', 'frame', 'node', 'exec-command', 'editor-selection']});