exec-command.js revision 9175593f652cde92e44c72344a4d77b017b75d2a
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass /**
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * Plugin for the frame module to handle execCommands for Editor
daeb6d531149c45a2ceb543ae2cf1e56e5235bbeDav Glass * @class Plugin.ExecCommand
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @extends Base
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @constructor
09c638a157dd9d2ed9027215d9e254badfa019b8Dav Glass * @module editor
09c638a157dd9d2ed9027215d9e254badfa019b8Dav Glass * @submodule exec-command
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass */
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass var ExecCommand = function() {
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass ExecCommand.superclass.constructor.apply(this, arguments);
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass };
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass Y.extend(ExecCommand, Y.Base, {
f7aa62ea2e8cf43fbb9d83db5060db540ff1893fDav Glass /**
f7aa62ea2e8cf43fbb9d83db5060db540ff1893fDav Glass * An internal reference to the keyCode of the last key that was pressed.
f7aa62ea2e8cf43fbb9d83db5060db540ff1893fDav Glass * @private
f7aa62ea2e8cf43fbb9d83db5060db540ff1893fDav Glass * @property _lastKey
f7aa62ea2e8cf43fbb9d83db5060db540ff1893fDav Glass */
20ce20f1b8ee0bcb928f97d3725e77889d5b27aeDav Glass _lastKey: null,
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass /**
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * An internal reference to the instance of the frame plugged into.
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @private
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @property _inst
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass */
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass _inst: null,
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass /**
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * Execute a command on the frame's document.
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @method command
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @param {String} action The action to perform (bold, italic, fontname)
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @param {String} value The optional value (helvetica)
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @return {Node/NodeList} Should return the Node/Nodelist affected
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass */
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass command: function(action, value) {
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass var fn = ExecCommand.COMMANDS[action];
96c1e6aab172b57cf3566abee931c26676990044Dav Glass
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass Y.log('execCommand(' + action + '): "' + value + '"', 'info', 'exec-command');
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass if (fn) {
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass return fn.call(this, action, value);
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass } else {
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass return this._command(action, value);
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass }
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass },
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass /**
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * The private version of execCommand that doesn't filter for overrides.
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @private
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @method _command
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @param {String} action The action to perform (bold, italic, fontname)
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @param {String} value The optional value (helvetica)
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass */
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass _command: function(action, value) {
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass var inst = this.getInstance();
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass try {
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass try {
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass inst.config.doc.execCommand('styleWithCSS', null, 1);
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass } catch (e1) {
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass try {
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass inst.config.doc.execCommand('useCSS', null, 0);
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass } catch (e2) {
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass }
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass }
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass Y.log('Internal execCommand(' + action + '): "' + value + '"', 'info', 'exec-command');
905f59668fbc4df1a3acb1e28f2629ae57fd216cDav Glass inst.config.doc.execCommand(action, null, value);
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass } catch (e) {
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass Y.log(e.message, 'error', 'exec-command');
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass }
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass },
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass /**
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * Get's the instance of YUI bound to the parent frame
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @method getInstance
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @return {YUI} The YUI instance bound to the parent frame
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass */
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass getInstance: function() {
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass if (!this._inst) {
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass this._inst = this.get('host').getInstance();
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass }
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass return this._inst;
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass },
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass initializer: function() {
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass Y.mix(this.get('host'), {
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass execCommand: function(action, value) {
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass return this.exec.command(action, value);
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass },
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass _execCommand: function(action, value) {
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass return this.exec._command(action, value);
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass }
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass });
20ce20f1b8ee0bcb928f97d3725e77889d5b27aeDav Glass
20ce20f1b8ee0bcb928f97d3725e77889d5b27aeDav Glass this.get('host').on('dom:keypress', Y.bind(function(e) {
20ce20f1b8ee0bcb928f97d3725e77889d5b27aeDav Glass this._lastKey = e.keyCode;
20ce20f1b8ee0bcb928f97d3725e77889d5b27aeDav Glass }, this));
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass }
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass }, {
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass /**
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * execCommand
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @property NAME
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @static
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass */
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass NAME: 'execCommand',
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass /**
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * exec
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @property NS
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @static
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass */
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass NS: 'exec',
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass ATTRS: {
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass host: {
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass value: false
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass }
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass },
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass /**
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * Static object literal of execCommand overrides
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @property COMMANDS
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @static
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass */
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass COMMANDS: {
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass /**
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * Wraps the content with a new element of type (tag)
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @method COMMANDS.wrap
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @static
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @param {String} cmd The command executed: wrap
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @param {String} tag The tag to wrap the selection with
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @return {NodeList} NodeList of the items touched by this command.
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass */
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass wrap: function(cmd, tag) {
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass var inst = this.getInstance();
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass return (new inst.Selection()).wrapContent(tag);
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass },
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass /**
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * Inserts the provided HTML at the cursor, should be a single element.
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @method COMMANDS.inserthtml
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @static
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @param {String} cmd The command executed: inserthtml
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @param {String} html The html to insert
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @return {Node} Node instance of the item touched by this command.
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass */
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass inserthtml: function(cmd, html) {
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass var inst = this.getInstance();
905f59668fbc4df1a3acb1e28f2629ae57fd216cDav Glass if (inst.Selection.hasCursor() || Y.UA.ie) {
d0bccce76452becc96b65acaaa684aa6fabaf386Dav Glass return (new inst.Selection()).insertContent(html);
d0bccce76452becc96b65acaaa684aa6fabaf386Dav Glass } else {
d0bccce76452becc96b65acaaa684aa6fabaf386Dav Glass this._command('inserthtml', html);
d0bccce76452becc96b65acaaa684aa6fabaf386Dav Glass }
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass },
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass /**
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass * Inserts the provided HTML at the cursor, and focuses the cursor afterwards.
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass * @method COMMANDS.insertandfocus
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass * @static
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass * @param {String} cmd The command executed: insertandfocus
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass * @param {String} html The html to insert
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass * @return {Node} Node instance of the item touched by this command.
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass */
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass insertandfocus: function(cmd, html) {
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass var inst = this.getInstance(), out, sel;
d0bccce76452becc96b65acaaa684aa6fabaf386Dav Glass if (inst.Selection.hasCursor()) {
d0bccce76452becc96b65acaaa684aa6fabaf386Dav Glass html += inst.Selection.CURSOR;
d0bccce76452becc96b65acaaa684aa6fabaf386Dav Glass out = this.command('inserthtml', html);
d0bccce76452becc96b65acaaa684aa6fabaf386Dav Glass sel = new inst.Selection();
d0bccce76452becc96b65acaaa684aa6fabaf386Dav Glass sel.focusCursor(true, true);
d0bccce76452becc96b65acaaa684aa6fabaf386Dav Glass } else {
d0bccce76452becc96b65acaaa684aa6fabaf386Dav Glass this.command('inserthtml', html);
d0bccce76452becc96b65acaaa684aa6fabaf386Dav Glass }
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass return out;
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass },
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass /**
9002d9b85f99bb503c702f12a20f829f732d22f8Dav Glass * Inserts a BR at the current cursor position
9002d9b85f99bb503c702f12a20f829f732d22f8Dav Glass * @method COMMANDS.insertbr
9002d9b85f99bb503c702f12a20f829f732d22f8Dav Glass * @static
9002d9b85f99bb503c702f12a20f829f732d22f8Dav Glass * @param {String} cmd The command executed: insertbr
9002d9b85f99bb503c702f12a20f829f732d22f8Dav Glass */
9002d9b85f99bb503c702f12a20f829f732d22f8Dav Glass insertbr: function(cmd) {
453c0694eb896076de933e8d82bd76a9ad450b4dDav Glass var inst = this.getInstance(),
453c0694eb896076de933e8d82bd76a9ad450b4dDav Glass sel = new inst.Selection(),
453c0694eb896076de933e8d82bd76a9ad450b4dDav Glass html = '<var>|</var>', last = null,
453c0694eb896076de933e8d82bd76a9ad450b4dDav Glass q = (Y.UA.webkit) ? 'span.Apple-style-span,var' : 'var';
453c0694eb896076de933e8d82bd76a9ad450b4dDav Glass
453c0694eb896076de933e8d82bd76a9ad450b4dDav Glass if (sel._selection.pasteHTML) {
453c0694eb896076de933e8d82bd76a9ad450b4dDav Glass sel._selection.pasteHTML(html);
453c0694eb896076de933e8d82bd76a9ad450b4dDav Glass } else {
453c0694eb896076de933e8d82bd76a9ad450b4dDav Glass this._command('inserthtml', html);
453c0694eb896076de933e8d82bd76a9ad450b4dDav Glass }
453c0694eb896076de933e8d82bd76a9ad450b4dDav Glass
453c0694eb896076de933e8d82bd76a9ad450b4dDav Glass var insert = function(n) {
453c0694eb896076de933e8d82bd76a9ad450b4dDav Glass var c = inst.Node.create('<br>');
453c0694eb896076de933e8d82bd76a9ad450b4dDav Glass n.insert(c, 'before');
453c0694eb896076de933e8d82bd76a9ad450b4dDav Glass return c;
e270ac17134394d5cf3111ab63080762be07563dDav Glass };
9002d9b85f99bb503c702f12a20f829f732d22f8Dav Glass
453c0694eb896076de933e8d82bd76a9ad450b4dDav Glass inst.all(q).each(function(n) {
453c0694eb896076de933e8d82bd76a9ad450b4dDav Glass var g = true;
453c0694eb896076de933e8d82bd76a9ad450b4dDav Glass if (Y.UA.webkit) {
453c0694eb896076de933e8d82bd76a9ad450b4dDav Glass g = false;
453c0694eb896076de933e8d82bd76a9ad450b4dDav Glass if (n.get('innerHTML') === '|') {
453c0694eb896076de933e8d82bd76a9ad450b4dDav Glass g = true;
453c0694eb896076de933e8d82bd76a9ad450b4dDav Glass }
453c0694eb896076de933e8d82bd76a9ad450b4dDav Glass }
453c0694eb896076de933e8d82bd76a9ad450b4dDav Glass if (g) {
453c0694eb896076de933e8d82bd76a9ad450b4dDav Glass last = insert(n);
453c0694eb896076de933e8d82bd76a9ad450b4dDav Glass if ((!last.previous() || !last.previous().test('br')) && Y.UA.gecko) {
453c0694eb896076de933e8d82bd76a9ad450b4dDav Glass var s = last.cloneNode();
453c0694eb896076de933e8d82bd76a9ad450b4dDav Glass last.insert(s, 'after');
453c0694eb896076de933e8d82bd76a9ad450b4dDav Glass last = s;
453c0694eb896076de933e8d82bd76a9ad450b4dDav Glass }
453c0694eb896076de933e8d82bd76a9ad450b4dDav Glass n.remove();
453c0694eb896076de933e8d82bd76a9ad450b4dDav Glass }
453c0694eb896076de933e8d82bd76a9ad450b4dDav Glass });
453c0694eb896076de933e8d82bd76a9ad450b4dDav Glass if (Y.UA.webkit && last) {
453c0694eb896076de933e8d82bd76a9ad450b4dDav Glass insert(last);
453c0694eb896076de933e8d82bd76a9ad450b4dDav Glass sel.selectNode(last);
453c0694eb896076de933e8d82bd76a9ad450b4dDav Glass }
9002d9b85f99bb503c702f12a20f829f732d22f8Dav Glass },
9002d9b85f99bb503c702f12a20f829f732d22f8Dav Glass /**
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * Inserts an image at the cursor position
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @method COMMANDS.insertimage
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @static
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @param {String} cmd The command executed: insertimage
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @param {String} img The url of the image to be inserted
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @return {Node} Node instance of the item touched by this command.
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass */
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass insertimage: function(cmd, img) {
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass return this.command('inserthtml', '<img src="' + img + '">');
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass },
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass /**
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * Add a class to all of the elements in the selection
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @method COMMANDS.addclass
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @static
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @param {String} cmd The command executed: addclass
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @param {String} cls The className to add
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @return {NodeList} NodeList of the items touched by this command.
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass */
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass addclass: function(cmd, cls) {
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass var inst = this.getInstance();
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass return (new inst.Selection()).getSelected().addClass(cls);
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass },
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass /**
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * Remove a class from all of the elements in the selection
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @method COMMANDS.removeclass
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @static
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @param {String} cmd The command executed: removeclass
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @param {String} cls The className to remove
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass * @return {NodeList} NodeList of the items touched by this command.
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass */
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass removeclass: function(cmd, cls) {
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass var inst = this.getInstance();
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass return (new inst.Selection()).getSelected().removeClass(cls);
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass },
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass /**
f7aa62ea2e8cf43fbb9d83db5060db540ff1893fDav Glass * Adds a forecolor to the current selection, or creates a new element and applies it
f7aa62ea2e8cf43fbb9d83db5060db540ff1893fDav Glass * @method COMMANDS.forecolor
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass * @static
f7aa62ea2e8cf43fbb9d83db5060db540ff1893fDav Glass * @param {String} cmd The command executed: forecolor
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass * @param {String} val The color value to apply
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass * @return {NodeList} NodeList of the items touched by this command.
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass */
58b0694c5cd8077e8c1f73624a56c8880927375fDav Glass forecolor: function(cmd, val) {
58b0694c5cd8077e8c1f73624a56c8880927375fDav Glass var inst = this.getInstance(),
58b0694c5cd8077e8c1f73624a56c8880927375fDav Glass sel = new inst.Selection(), n;
58b0694c5cd8077e8c1f73624a56c8880927375fDav Glass
58b0694c5cd8077e8c1f73624a56c8880927375fDav Glass if (!Y.UA.ie) {
aa2ac226ad6e45232f8416eecc99d2165ce74d03Dav Glass this._command('useCSS', false);
58b0694c5cd8077e8c1f73624a56c8880927375fDav Glass }
d0bccce76452becc96b65acaaa684aa6fabaf386Dav Glass if (inst.Selection.hasCursor()) {
d0bccce76452becc96b65acaaa684aa6fabaf386Dav Glass if (sel.isCollapsed) {
d0bccce76452becc96b65acaaa684aa6fabaf386Dav Glass if (sel.anchorNode && (sel.anchorNode.get('innerHTML') === '&nbsp;')) {
d0bccce76452becc96b65acaaa684aa6fabaf386Dav Glass sel.anchorNode.setStyle('color', val);
d0bccce76452becc96b65acaaa684aa6fabaf386Dav Glass n = sel.anchorNode;
d0bccce76452becc96b65acaaa684aa6fabaf386Dav Glass } else {
d0bccce76452becc96b65acaaa684aa6fabaf386Dav Glass n = this.command('inserthtml', '<span style="color: ' + val + '">' + inst.Selection.CURSOR + '</span>');
d0bccce76452becc96b65acaaa684aa6fabaf386Dav Glass sel.focusCursor(true, true);
d0bccce76452becc96b65acaaa684aa6fabaf386Dav Glass }
d0bccce76452becc96b65acaaa684aa6fabaf386Dav Glass return n;
58b0694c5cd8077e8c1f73624a56c8880927375fDav Glass } else {
d0bccce76452becc96b65acaaa684aa6fabaf386Dav Glass return this._command(cmd, val);
58b0694c5cd8077e8c1f73624a56c8880927375fDav Glass }
58b0694c5cd8077e8c1f73624a56c8880927375fDav Glass } else {
d0bccce76452becc96b65acaaa684aa6fabaf386Dav Glass this._command(cmd, val);
58b0694c5cd8077e8c1f73624a56c8880927375fDav Glass }
58b0694c5cd8077e8c1f73624a56c8880927375fDav Glass },
f7aa62ea2e8cf43fbb9d83db5060db540ff1893fDav Glass /**
f7aa62ea2e8cf43fbb9d83db5060db540ff1893fDav Glass * Adds a background color to the current selection, or creates a new element and applies it
f7aa62ea2e8cf43fbb9d83db5060db540ff1893fDav Glass * @method COMMANDS.backcolor
f7aa62ea2e8cf43fbb9d83db5060db540ff1893fDav Glass * @static
f7aa62ea2e8cf43fbb9d83db5060db540ff1893fDav Glass * @param {String} cmd The command executed: backcolor
f7aa62ea2e8cf43fbb9d83db5060db540ff1893fDav Glass * @param {String} val The color value to apply
f7aa62ea2e8cf43fbb9d83db5060db540ff1893fDav Glass * @return {NodeList} NodeList of the items touched by this command.
f7aa62ea2e8cf43fbb9d83db5060db540ff1893fDav Glass */
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass backcolor: function(cmd, val) {
f8b3e367f0b400ff8b4feeb35c56d9387a31f9e0Dav Glass var inst = this.getInstance(),
f8b3e367f0b400ff8b4feeb35c56d9387a31f9e0Dav Glass sel = new inst.Selection(), n;
28be365412206244e6767c4375345327b74298b0Dav Glass
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass if (Y.UA.gecko || Y.UA.opera) {
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass cmd = 'hilitecolor';
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass }
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass if (!Y.UA.ie) {
6dcd63a9962ebe13f3b428d1f71c51a93c1700cfDav Glass this._command('useCSS', false);
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass }
d0bccce76452becc96b65acaaa684aa6fabaf386Dav Glass if (inst.Selection.hasCursor()) {
d0bccce76452becc96b65acaaa684aa6fabaf386Dav Glass if (sel.isCollapsed) {
d0bccce76452becc96b65acaaa684aa6fabaf386Dav Glass if (sel.anchorNode && (sel.anchorNode.get('innerHTML') === '&nbsp;')) {
d0bccce76452becc96b65acaaa684aa6fabaf386Dav Glass sel.anchorNode.setStyle('backgroundColor', val);
d0bccce76452becc96b65acaaa684aa6fabaf386Dav Glass n = sel.anchorNode;
d0bccce76452becc96b65acaaa684aa6fabaf386Dav Glass } else {
d0bccce76452becc96b65acaaa684aa6fabaf386Dav Glass n = this.command('inserthtml', '<span style="background-color: ' + val + '">' + inst.Selection.CURSOR + '</span>');
d0bccce76452becc96b65acaaa684aa6fabaf386Dav Glass sel.focusCursor(true, true);
d0bccce76452becc96b65acaaa684aa6fabaf386Dav Glass }
d0bccce76452becc96b65acaaa684aa6fabaf386Dav Glass return n;
9a68201f57ed1257e4735227620d7ec556fe99e5Dav Glass } else {
d0bccce76452becc96b65acaaa684aa6fabaf386Dav Glass return this._command(cmd, val);
9a68201f57ed1257e4735227620d7ec556fe99e5Dav Glass }
f8b3e367f0b400ff8b4feeb35c56d9387a31f9e0Dav Glass } else {
6dcd63a9962ebe13f3b428d1f71c51a93c1700cfDav Glass this._command(cmd, val);
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass }
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass },
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass /**
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass * Sugar method, calles backcolor
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass * @method COMMANDS.hilitecolor
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass * @static
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass * @param {String} cmd The command executed: backcolor
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass * @param {String} val The color value to apply
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass * @return {NodeList} NodeList of the items touched by this command.
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass */
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass hilitecolor: function() {
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass return ExecCommand.COMMANDS.backcolor.apply(this, arguments);
bc7d05651658bd1302a26ba8015c432c8b4a1519Dav Glass },
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass /**
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass * Adds a font name to the current selection, or creates a new element and applies it
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * @method COMMANDS.fontname2
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * @deprecated
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass * @static
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass * @param {String} cmd The command executed: fontname
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass * @param {String} val The font name to apply
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass * @return {NodeList} NodeList of the items touched by this command.
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass */
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass fontname2: function(cmd, val) {
20ce20f1b8ee0bcb928f97d3725e77889d5b27aeDav Glass this._command('fontname', val);
20ce20f1b8ee0bcb928f97d3725e77889d5b27aeDav Glass var inst = this.getInstance(),
20ce20f1b8ee0bcb928f97d3725e77889d5b27aeDav Glass sel = new inst.Selection();
20ce20f1b8ee0bcb928f97d3725e77889d5b27aeDav Glass
20ce20f1b8ee0bcb928f97d3725e77889d5b27aeDav Glass if (sel.isCollapsed && (this._lastKey != 32)) {
20ce20f1b8ee0bcb928f97d3725e77889d5b27aeDav Glass if (sel.anchorNode.test('font')) {
20ce20f1b8ee0bcb928f97d3725e77889d5b27aeDav Glass sel.anchorNode.set('face', val);
bc05130527c2137971e590e2d5860025ecf00ebbDav Glass }
bc7d05651658bd1302a26ba8015c432c8b4a1519Dav Glass }
bc7d05651658bd1302a26ba8015c432c8b4a1519Dav Glass },
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass /**
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass * Adds a fontsize to the current selection, or creates a new element and applies it
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * @method COMMANDS.fontsize2
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * @deprecated
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass * @static
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass * @param {String} cmd The command executed: fontsize
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass * @param {String} val The font size to apply
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass * @return {NodeList} NodeList of the items touched by this command.
a2621d519886de7d60c30c5a0850f5c17fd2fb36Dav Glass */
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass fontsize2: function(cmd, val) {
20ce20f1b8ee0bcb928f97d3725e77889d5b27aeDav Glass this._command('fontsize', val);
bc7d05651658bd1302a26ba8015c432c8b4a1519Dav Glass
20ce20f1b8ee0bcb928f97d3725e77889d5b27aeDav Glass var inst = this.getInstance(),
20ce20f1b8ee0bcb928f97d3725e77889d5b27aeDav Glass sel = new inst.Selection();
20ce20f1b8ee0bcb928f97d3725e77889d5b27aeDav Glass
f7aa62ea2e8cf43fbb9d83db5060db540ff1893fDav Glass if (sel.isCollapsed && sel.anchorNode && (this._lastKey != 32)) {
f7aa62ea2e8cf43fbb9d83db5060db540ff1893fDav Glass if (Y.UA.webkit) {
f7aa62ea2e8cf43fbb9d83db5060db540ff1893fDav Glass if (sel.anchorNode.getStyle('lineHeight')) {
f7aa62ea2e8cf43fbb9d83db5060db540ff1893fDav Glass sel.anchorNode.setStyle('lineHeight', '');
f7aa62ea2e8cf43fbb9d83db5060db540ff1893fDav Glass }
f7aa62ea2e8cf43fbb9d83db5060db540ff1893fDav Glass }
20ce20f1b8ee0bcb928f97d3725e77889d5b27aeDav Glass if (sel.anchorNode.test('font')) {
20ce20f1b8ee0bcb928f97d3725e77889d5b27aeDav Glass sel.anchorNode.set('size', val);
e04e9b42ef212618f77fd4b0f9a71cab4c55d8a0Dav Glass } else if (Y.UA.gecko) {
96c1e6aab172b57cf3566abee931c26676990044Dav Glass var p = sel.anchorNode.ancestor(inst.Selection.DEFAULT_BLOCK_TAG);
e04e9b42ef212618f77fd4b0f9a71cab4c55d8a0Dav Glass if (p) {
e04e9b42ef212618f77fd4b0f9a71cab4c55d8a0Dav Glass p.setStyle('fontSize', '');
e04e9b42ef212618f77fd4b0f9a71cab4c55d8a0Dav Glass }
bc05130527c2137971e590e2d5860025ecf00ebbDav Glass }
bc7d05651658bd1302a26ba8015c432c8b4a1519Dav Glass }
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass },
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass /**
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * Overload for COMMANDS.list
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * @method COMMANDS.insertorderedlist
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * @static
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * @param {String} cmd The command executed: list, ul
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass */
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass insertunorderedlist: function(cmd) {
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass this.command('list', 'ul');
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass },
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass /**
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * Overload for COMMANDS.list
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * @method COMMANDS.insertunorderedlist
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * @static
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * @param {String} cmd The command executed: list, ol
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass */
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass insertorderedlist: function(cmd) {
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass this.command('list', 'ol');
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass },
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass /**
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * Noramlizes lists creation/destruction for IE. All others pass through to native calls
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * @method COMMANDS.list
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * @static
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * @param {String} cmd The command executed: list (not used)
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * @param {String} tag The tag to deal with
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass */
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass list: function(cmd, tag) {
453c0694eb896076de933e8d82bd76a9ad450b4dDav Glass var inst = this.getInstance(), html,
e270ac17134394d5cf3111ab63080762be07563dDav Glass DIR = 'dir', cls = 'yui3-touched',
e270ac17134394d5cf3111ab63080762be07563dDav Glass dir, range, div, elm, n, str, s, par, list, lis,
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass sel = new inst.Selection();
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass cmd = 'insert' + ((tag === 'ul') ? 'un' : '') + 'orderedlist';
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass if (Y.UA.ie && !sel.isCollapsed) {
e270ac17134394d5cf3111ab63080762be07563dDav Glass range = sel._selection;
453c0694eb896076de933e8d82bd76a9ad450b4dDav Glass html = range.htmlText;
e270ac17134394d5cf3111ab63080762be07563dDav Glass div = inst.Node.create(html);
7a0cdb026e8c86c865216522240ac64f7d293ba9Dav Glass if (div.test('li') || div.one('li')) {
7a0cdb026e8c86c865216522240ac64f7d293ba9Dav Glass this._command(cmd, null);
7a0cdb026e8c86c865216522240ac64f7d293ba9Dav Glass return;
7a0cdb026e8c86c865216522240ac64f7d293ba9Dav Glass }
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass if (div.test(tag)) {
e270ac17134394d5cf3111ab63080762be07563dDav Glass elm = range.item ? range.item(0) : range.parentElement();
e270ac17134394d5cf3111ab63080762be07563dDav Glass n = inst.one(elm);
e270ac17134394d5cf3111ab63080762be07563dDav Glass lis = n.all('li');
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass
e270ac17134394d5cf3111ab63080762be07563dDav Glass str = '<div>';
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass lis.each(function(l) {
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass str += l.get('innerHTML') + '<br>';
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass });
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass str += '</div>';
e270ac17134394d5cf3111ab63080762be07563dDav Glass s = inst.Node.create(str);
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass if (n.get('parentNode').test('div')) {
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass n = n.get('parentNode');
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass }
e9d98301bba2688d778e2e872b62bdc992b526eaDav Glass if (n && n.hasAttribute(DIR)) {
e9d98301bba2688d778e2e872b62bdc992b526eaDav Glass s.setAttribute(DIR, n.getAttribute(DIR));
e9d98301bba2688d778e2e872b62bdc992b526eaDav Glass }
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass n.replace(s);
0612f6fa2e2192b929d52762deaf45534f6e7509Dav Glass if (range.moveToElementText) {
0612f6fa2e2192b929d52762deaf45534f6e7509Dav Glass range.moveToElementText(s._node);
0612f6fa2e2192b929d52762deaf45534f6e7509Dav Glass }
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass range.select();
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass } else {
e270ac17134394d5cf3111ab63080762be07563dDav Glass par = Y.one(range.parentElement());
e270ac17134394d5cf3111ab63080762be07563dDav Glass if (!par.test(inst.Selection.BLOCKS)) {
e270ac17134394d5cf3111ab63080762be07563dDav Glass par = par.ancestor(inst.Selection.BLOCKS);
e270ac17134394d5cf3111ab63080762be07563dDav Glass }
e270ac17134394d5cf3111ab63080762be07563dDav Glass if (par) {
e270ac17134394d5cf3111ab63080762be07563dDav Glass if (par.hasAttribute(DIR)) {
e270ac17134394d5cf3111ab63080762be07563dDav Glass dir = par.getAttribute(DIR);
e270ac17134394d5cf3111ab63080762be07563dDav Glass }
e270ac17134394d5cf3111ab63080762be07563dDav Glass }
7a0cdb026e8c86c865216522240ac64f7d293ba9Dav Glass if (html.indexOf('<br>') > -1) {
7a0cdb026e8c86c865216522240ac64f7d293ba9Dav Glass html = html.split(/<br>/i);
7a0cdb026e8c86c865216522240ac64f7d293ba9Dav Glass } else {
7a0cdb026e8c86c865216522240ac64f7d293ba9Dav Glass var tmp = inst.Node.create(html),
7a0cdb026e8c86c865216522240ac64f7d293ba9Dav Glass ps = tmp.all('p');
0849f3ba6df9f9aaf5677409f2b00d9f2ad9af32Dav Glass
0849f3ba6df9f9aaf5677409f2b00d9f2ad9af32Dav Glass if (ps.size()) {
0849f3ba6df9f9aaf5677409f2b00d9f2ad9af32Dav Glass html = [];
0849f3ba6df9f9aaf5677409f2b00d9f2ad9af32Dav Glass ps.each(function(n) {
0849f3ba6df9f9aaf5677409f2b00d9f2ad9af32Dav Glass html.push(n.get('innerHTML'));
0849f3ba6df9f9aaf5677409f2b00d9f2ad9af32Dav Glass });
0849f3ba6df9f9aaf5677409f2b00d9f2ad9af32Dav Glass } else {
0849f3ba6df9f9aaf5677409f2b00d9f2ad9af32Dav Glass html = [html];
0849f3ba6df9f9aaf5677409f2b00d9f2ad9af32Dav Glass }
7a0cdb026e8c86c865216522240ac64f7d293ba9Dav Glass }
e270ac17134394d5cf3111ab63080762be07563dDav Glass list = '<' + tag + ' id="ie-list">';
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass Y.each(html, function(v) {
e270ac17134394d5cf3111ab63080762be07563dDav Glass var a = inst.Node.create(v);
e270ac17134394d5cf3111ab63080762be07563dDav Glass if (a.test('p')) {
e270ac17134394d5cf3111ab63080762be07563dDav Glass if (a.hasAttribute(DIR)) {
e270ac17134394d5cf3111ab63080762be07563dDav Glass dir = a.getAttribute(DIR);
e270ac17134394d5cf3111ab63080762be07563dDav Glass }
e270ac17134394d5cf3111ab63080762be07563dDav Glass v = a.get('innerHTML');
e270ac17134394d5cf3111ab63080762be07563dDav Glass }
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass list += '<li>' + v + '</li>';
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass });
e270ac17134394d5cf3111ab63080762be07563dDav Glass list += '</' + tag + '>';
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass range.pasteHTML(list);
e270ac17134394d5cf3111ab63080762be07563dDav Glass elm = inst.config.doc.getElementById('ie-list');
e270ac17134394d5cf3111ab63080762be07563dDav Glass elm.id = '';
e270ac17134394d5cf3111ab63080762be07563dDav Glass if (dir) {
e270ac17134394d5cf3111ab63080762be07563dDav Glass elm.setAttribute(DIR, dir);
e270ac17134394d5cf3111ab63080762be07563dDav Glass }
0612f6fa2e2192b929d52762deaf45534f6e7509Dav Glass if (range.moveToElementText) {
0612f6fa2e2192b929d52762deaf45534f6e7509Dav Glass range.moveToElementText(elm);
0612f6fa2e2192b929d52762deaf45534f6e7509Dav Glass }
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass range.select();
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass }
e57824e27f47a76dae7b14c6ff1c7ed1186d16c1Dav Glass } else if (Y.UA.ie) {
e270ac17134394d5cf3111ab63080762be07563dDav Glass par = inst.one(sel._selection.parentElement());
e270ac17134394d5cf3111ab63080762be07563dDav Glass if (par.test('p')) {
e9d98301bba2688d778e2e872b62bdc992b526eaDav Glass if (par && par.hasAttribute(DIR)) {
e9d98301bba2688d778e2e872b62bdc992b526eaDav Glass dir = par.getAttribute(DIR);
e9d98301bba2688d778e2e872b62bdc992b526eaDav Glass }
e270ac17134394d5cf3111ab63080762be07563dDav Glass html = Y.Selection.getText(par);
453c0694eb896076de933e8d82bd76a9ad450b4dDav Glass if (html === '') {
e9d98301bba2688d778e2e872b62bdc992b526eaDav Glass var sdir = '';
e9d98301bba2688d778e2e872b62bdc992b526eaDav Glass if (dir) {
e9d98301bba2688d778e2e872b62bdc992b526eaDav Glass sdir = ' dir="' + dir + '"';
e9d98301bba2688d778e2e872b62bdc992b526eaDav Glass }
e9d98301bba2688d778e2e872b62bdc992b526eaDav Glass list = inst.Node.create(Y.Lang.sub('<{tag}{dir}><li></li></{tag}>', { tag: tag, dir: sdir }));
e270ac17134394d5cf3111ab63080762be07563dDav Glass par.replace(list);
e270ac17134394d5cf3111ab63080762be07563dDav Glass sel.selectNode(list.one('li'));
0849f3ba6df9f9aaf5677409f2b00d9f2ad9af32Dav Glass } else {
0849f3ba6df9f9aaf5677409f2b00d9f2ad9af32Dav Glass this._command(cmd, null);
e57824e27f47a76dae7b14c6ff1c7ed1186d16c1Dav Glass }
e9d98301bba2688d778e2e872b62bdc992b526eaDav Glass } else {
e9d98301bba2688d778e2e872b62bdc992b526eaDav Glass this._command(cmd, null);
e57824e27f47a76dae7b14c6ff1c7ed1186d16c1Dav Glass }
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass } else {
e270ac17134394d5cf3111ab63080762be07563dDav Glass inst.all(tag).addClass(cls);
e270ac17134394d5cf3111ab63080762be07563dDav Glass if (sel.anchorNode.test(inst.Selection.BLOCKS)) {
e270ac17134394d5cf3111ab63080762be07563dDav Glass par = sel.anchorNode;
e270ac17134394d5cf3111ab63080762be07563dDav Glass } else {
e270ac17134394d5cf3111ab63080762be07563dDav Glass par = sel.anchorNode.ancestor(inst.Selection.BLOCKS);
e270ac17134394d5cf3111ab63080762be07563dDav Glass }
9175593f652cde92e44c72344a4d77b017b75d2aDav Glass if (!par) { //No parent, find the first block under the anchorNode
9175593f652cde92e44c72344a4d77b017b75d2aDav Glass par = sel.anchorNode.one(inst.Selection.BLOCKS);
9175593f652cde92e44c72344a4d77b017b75d2aDav Glass }
9175593f652cde92e44c72344a4d77b017b75d2aDav Glass
e270ac17134394d5cf3111ab63080762be07563dDav Glass if (par && par.hasAttribute(DIR)) {
e270ac17134394d5cf3111ab63080762be07563dDav Glass dir = par.getAttribute(DIR);
e270ac17134394d5cf3111ab63080762be07563dDav Glass }
2bbe3ca8cfbb948b9b6356ae16759f1d6245433cDav Glass if (par && par.test(tag)) {
2bbe3ca8cfbb948b9b6356ae16759f1d6245433cDav Glass html = inst.Node.create('<div/>');
2bbe3ca8cfbb948b9b6356ae16759f1d6245433cDav Glass elm = par.all('li');
2bbe3ca8cfbb948b9b6356ae16759f1d6245433cDav Glass elm.each(function(h) {
9175593f652cde92e44c72344a4d77b017b75d2aDav Glass html.append('<p>' + h.get('innerHTML') + '</p>');
2bbe3ca8cfbb948b9b6356ae16759f1d6245433cDav Glass });
2bbe3ca8cfbb948b9b6356ae16759f1d6245433cDav Glass if (dir) {
2bbe3ca8cfbb948b9b6356ae16759f1d6245433cDav Glass html.setAttribute(DIR, dir);
2bbe3ca8cfbb948b9b6356ae16759f1d6245433cDav Glass }
2bbe3ca8cfbb948b9b6356ae16759f1d6245433cDav Glass par.replace(html);
2bbe3ca8cfbb948b9b6356ae16759f1d6245433cDav Glass sel.selectNode(html.get('firstChild'));
2bbe3ca8cfbb948b9b6356ae16759f1d6245433cDav Glass } else {
2bbe3ca8cfbb948b9b6356ae16759f1d6245433cDav Glass this._command(cmd, null);
2bbe3ca8cfbb948b9b6356ae16759f1d6245433cDav Glass }
e270ac17134394d5cf3111ab63080762be07563dDav Glass list = inst.all(tag);
e270ac17134394d5cf3111ab63080762be07563dDav Glass if (dir) {
2bbe3ca8cfbb948b9b6356ae16759f1d6245433cDav Glass if (list.size()) {
2bbe3ca8cfbb948b9b6356ae16759f1d6245433cDav Glass //Changed to a List
2bbe3ca8cfbb948b9b6356ae16759f1d6245433cDav Glass list.each(function(n) {
2bbe3ca8cfbb948b9b6356ae16759f1d6245433cDav Glass if (!n.hasClass(cls)) {
2bbe3ca8cfbb948b9b6356ae16759f1d6245433cDav Glass n.setAttribute(DIR, dir);
2bbe3ca8cfbb948b9b6356ae16759f1d6245433cDav Glass }
2bbe3ca8cfbb948b9b6356ae16759f1d6245433cDav Glass });
2bbe3ca8cfbb948b9b6356ae16759f1d6245433cDav Glass }
e270ac17134394d5cf3111ab63080762be07563dDav Glass }
2bbe3ca8cfbb948b9b6356ae16759f1d6245433cDav Glass
e270ac17134394d5cf3111ab63080762be07563dDav Glass list.removeClass(cls);
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass }
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass },
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass /**
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * Noramlizes alignment for Webkit Browsers
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * @method COMMANDS.justify
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * @static
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * @param {String} cmd The command executed: justify (not used)
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * @param {String} val The actual command from the justify{center,all,left,right} stubs
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass */
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass justify: function(cmd, val) {
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass if (Y.UA.webkit) {
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass var inst = this.getInstance(),
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass sel = new inst.Selection(),
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass aNode = sel.anchorNode;
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass var bgColor = aNode.getStyle('backgroundColor');
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass this._command(val);
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass sel = new inst.Selection();
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass if (sel.anchorNode.test('div')) {
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass var html = '<span>' + sel.anchorNode.get('innerHTML') + '</span>';
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass sel.anchorNode.set('innerHTML', html);
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass sel.anchorNode.one('span').setStyle('backgroundColor', bgColor);
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass sel.selectNode(sel.anchorNode.one('span'));
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass }
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass } else {
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass this._command(val);
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass }
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass },
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass /**
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * Override method for COMMANDS.justify
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * @method COMMANDS.justifycenter
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * @static
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass */
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass justifycenter: function(cmd) {
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass this.command('justify', 'justifycenter');
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass },
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass /**
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * Override method for COMMANDS.justify
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * @method COMMANDS.justifyleft
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * @static
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass */
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass justifyleft: function(cmd) {
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass this.command('justify', 'justifyleft');
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass },
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass /**
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * Override method for COMMANDS.justify
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * @method COMMANDS.justifyright
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * @static
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass */
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass justifyright: function(cmd) {
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass this.command('justify', 'justifyright');
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass },
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass /**
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * Override method for COMMANDS.justify
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * @method COMMANDS.justifyfull
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass * @static
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass */
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass justifyfull: function(cmd) {
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass this.command('justify', 'justifyfull');
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass }
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass }
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass });
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass /**
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass * This method is meant to normalize IE's in ability to exec the proper command on elements with CSS styling.
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass * @method fixIETags
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass * @protected
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass * @param {String} cmd The command to execute
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass * @param {String} tag The tag to create
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass * @param {String} rule The rule that we are looking for.
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass */
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass var fixIETags = function(cmd, tag, rule) {
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass var inst = this.getInstance(),
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass doc = inst.config.doc,
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass sel = doc.selection.createRange(),
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass o = doc.queryCommandValue(cmd),
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass html, reg, m, p, d, s, c;
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass if (o) {
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass html = sel.htmlText;
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass reg = new RegExp(rule, 'g');
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass m = html.match(reg);
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass if (m) {
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass html = html.replace(rule + ';', '').replace(rule, '');
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass sel.pasteHTML('<var id="yui-ie-bs">');
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass p = doc.getElementById('yui-ie-bs');
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass d = doc.createElement('div');
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass s = doc.createElement(tag);
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass d.innerHTML = html;
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass if (p.parentNode !== inst.config.doc.body) {
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass p = p.parentNode;
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass }
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass c = d.childNodes;
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass p.parentNode.replaceChild(s, p);
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass Y.each(c, function(f) {
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass s.appendChild(f);
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass });
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass sel.collapse();
0612f6fa2e2192b929d52762deaf45534f6e7509Dav Glass if (sel.moveToElementText) {
0612f6fa2e2192b929d52762deaf45534f6e7509Dav Glass sel.moveToElementText(s);
0612f6fa2e2192b929d52762deaf45534f6e7509Dav Glass }
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass sel.select();
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass }
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass }
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass this._command(cmd);
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass };
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass if (Y.UA.ie) {
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass ExecCommand.COMMANDS.bold = function() {
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass fixIETags.call(this, 'bold', 'b', 'FONT-WEIGHT: bold');
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass };
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass ExecCommand.COMMANDS.italic = function() {
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass fixIETags.call(this, 'italic', 'i', 'FONT-STYLE: italic');
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass };
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass ExecCommand.COMMANDS.underline = function() {
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass fixIETags.call(this, 'underline', 'u', 'TEXT-DECORATION: underline');
7a67e82a93bc7dc5bf9a62a3ad321c2424da37f7Dav Glass };
052dcc53d425df9224bfc720b2feca1e92903382Dav Glass }
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass Y.namespace('Plugin');
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass Y.Plugin.ExecCommand = ExecCommand;
dbf2c770f8178b12e8fe3c36bfa29df58ef13959Dav Glass