CLICK HERE TO BUY IT TODAY! OR GET IT FREE VIA TRIALPAY  

PHP Demo Application - Source Code

/Framework/Model/Vendor/CkEditor/_source/plugins/enterkey/plugin.js



/*
Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
For licensing, see LICENSE.html or http://ckeditor.com/license
*/
(function()
{
	    CKEDITOR.plugins.add'enterkey',
	    {
		        requires : [ 'keystrokes''indent' ],
		        init : function( editor )
		        {
			            var specialKeys editor.specialKeys;
			            specialKeys13 ] = enter;
			            specialKeysCKEDITOR.SHIFT 13 ] = shiftEnter;
			        }
		    });
	    CKEDITOR.plugins.enterkey =
	    {
		        enterBlock : function( editormoderangeforceMode )
		        {
			            // Get the range for the current selection.
			            range range || getRangeeditor );
			            // We may not have valid ranges to work on, like when inside a
			            // contenteditable=false element.
			            if ( !range )
			                return;
			            var doc range.document;
			            // Exit the list when we're inside an empty list item block. (#5376)
			            if ( range.checkStartOfBlock() && range.checkEndOfBlock() )
			            {
				                var path = new CKEDITOR.dom.elementPathrange.startContainer ),
				                        block path.block;
				                if ( block && ( block.is'li' ) || block.getParent().is'li' ) ) )
				                {
					                    editor.execCommand'outdent' );
					                    return;
					                }
				            }
			            // Determine the block element to be used.
			            var blockTag = ( mode == CKEDITOR.ENTER_DIV 'div' 'p' );
			            // Split the range.
			            var splitInfo range.splitBlockblockTag );
			            if ( !splitInfo )
			                return;
			            // Get the current blocks.
			            var previousBlock    splitInfo.previousBlock,
			                nextBlock        splitInfo.nextBlock;
			            var isStartOfBlock    splitInfo.wasStartOfBlock,
			                isEndOfBlock    splitInfo.wasEndOfBlock;
			            var node;
			            // If this is a block under a list item, split it as well. (#1647)
			            if ( nextBlock )
			            {
				                node nextBlock.getParent();
				                if ( node.is'li' ) )
				                {
					                    nextBlock.breakParentnode );
					                    nextBlock.movenextBlock.getNext(), true );
					                }
				            }
			            else if ( previousBlock && ( node previousBlock.getParent() ) && node.is'li' ) )
			            {
				                previousBlock.breakParentnode );
				                range.moveToElementEditStartpreviousBlock.getNext() );
				                previousBlock.movepreviousBlock.getPrevious() );
				            }
			            // If we have both the previous and next blocks, it means that the
			            // boundaries were on separated blocks, or none of them where on the
			            // block limits (start/end).
			            if ( !isStartOfBlock && !isEndOfBlock )
			            {
				                // If the next block is an <li> with another list tree as the first
				                // child, we'll need to append a filler (<br>/NBSP) or the list item
				                // wouldn't be editable. (#1420)
				                if ( nextBlock.is'li' )
				                     && ( node nextBlock.getFirstCKEDITOR.dom.walker.invisibletrue ) ) )
				                     && node.is && node.is'ul''ol' ) )
				                    ( CKEDITOR.env.ie doc.createText'\xa0' ) : doc.createElement'br' ) ).insertBeforenode );
				                // Move the selection to the end block.
				                if ( nextBlock )
				                    range.moveToElementEditStartnextBlock );
				            }
			            else
			            {
				                var newBlock;
				                if ( previousBlock )
				                {
					                    // Do not enter this block if it's a header tag, or we are in
					                    // a Shift+Enter (#77). Create a new block element instead
					                    // (later in the code).
					                    if ( previousBlock.is'li' ) || !headerTagRegex.testpreviousBlock.getName() ) )
					                    {
						                        // Otherwise, duplicate the previous block.
						                        newBlock previousBlock.clone();
						                    }
					                }
				                else if ( nextBlock )
				                    newBlock nextBlock.clone();
				                if ( !newBlock )
				                    newBlock doc.createElementblockTag );
				                // Force the enter block unless we're talking of a list item.
				                else if ( forceMode && !newBlock.is'li' ) )
				                    newBlock.renameNodeblockTag );
				                // Recreate the inline elements tree, which was available
				                // before hitting enter, so the same styles will be available in
				                // the new block.
				                var elementPath splitInfo.elementPath;
				                if ( elementPath )
				                {
					                    for ( var 0len elementPath.elements.length ;
					 len ;
					 i++ )
					                    {
						                        var element elementPath.elements];
						                        if ( element.equalselementPath.block ) || element.equalselementPath.blockLimit ) )
						                            break;
						                        if ( CKEDITOR.dtd.$removeEmptyelement.getName() ] )
						                        {
							                            element element.clone();
							                            newBlock.moveChildrenelement );
							                            newBlock.appendelement );
							                        }
						                    }
					                }
				                if ( !CKEDITOR.env.ie )
				                    newBlock.appendBogus();
				                range.insertNodenewBlock );
				                // This is tricky, but to make the new block visible correctly
				                // we must select it.
				                // The previousBlock check has been included because it may be
				                // empty if we have fixed a block-less space (like ENTER into an
				                // empty table cell).
				                if ( CKEDITOR.env.ie && isStartOfBlock && ( !isEndOfBlock || !previousBlock.getChildCount() ) )
				                {
					                    // Move the selection to the new block.
					                    range.moveToElementEditStartisEndOfBlock previousBlock newBlock );
					                    range.select();
					                }
				                // Move the selection to the new block.
				                range.moveToElementEditStartisStartOfBlock && !isEndOfBlock nextBlock newBlock );
				        }
			            if ( !CKEDITOR.env.ie )
			            {
				                if ( nextBlock )
				                {
					                    // If we have split the block, adds a temporary span at the
					                    // range position and scroll relatively to it.
					                    var tmpNode doc.createElement'span' );
					                    // We need some content for Safari.
					                    tmpNode.setHtml'&nbsp;
					' );
					                    range.insertNodetmpNode );
					                    tmpNode.scrollIntoView();
					                    range.deleteContents();
					                }
				                else
				                {
					                    // We may use the above scroll logic for the new block case
					                    // too, but it gives some weird result with Opera.
					                    newBlock.scrollIntoView();
					                }
				            }
			            range.select();
			        },
		        enterBr : function( editormoderangeforceMode )
		        {
			            // Get the range for the current selection.
			            range range || getRangeeditor );
			            // We may not have valid ranges to work on, like when inside a
			            // contenteditable=false element.
			            if ( !range )
			                return;
			            var doc range.document;
			            // Determine the block element to be used.
			            var blockTag = ( mode == CKEDITOR.ENTER_DIV 'div' 'p' );
			            var isEndOfBlock range.checkEndOfBlock();
			            var elementPath = new CKEDITOR.dom.elementPatheditor.getSelection().getStartElement() );
			            var startBlock elementPath.block,
			                startBlockTag startBlock && elementPath.block.getName();
			            var isPre false;
			            if ( !forceMode && startBlockTag == 'li' )
			            {
				                enterBlockeditormoderangeforceMode );
				                return;
				            }
			            // If we are at the end of a header block.
			            if ( !forceMode && isEndOfBlock && headerTagRegex.teststartBlockTag ) )
			            {
				                // Insert a <br> after the current paragraph.
				                doc.createElement'br' ).insertAfterstartBlock );
				                // A text node is required by Gecko only to make the cursor blink.
				                if ( CKEDITOR.env.gecko )
				                    doc.createText'' ).insertAfterstartBlock );
				                // IE has different behaviors regarding position.
				                range.setStartAtstartBlock.getNext(), CKEDITOR.env.ie CKEDITOR.POSITION_BEFORE_START CKEDITOR.POSITION_AFTER_START );
				            }
			            else
			            {
				                var lineBreak;
				                isPre = ( startBlockTag == 'pre' );
				                // Gecko prefers <br> as line-break inside <pre> (#4711).
				                if ( isPre && !CKEDITOR.env.gecko )
				                    lineBreak doc.createTextCKEDITOR.env.ie '\r' '\n' );
				                else
				                    lineBreak doc.createElement'br' );
				                range.deleteContents();
				                range.insertNodelineBreak );
				                // A text node is required by Gecko only to make the cursor blink.
				                // We need some text inside of it, so the bogus <br> is properly
				                // created.
				                if ( !CKEDITOR.env.ie )
				                    doc.createText'\ufeff' ).insertAfterlineBreak );
				                // If we are at the end of a block, we must be sure the bogus node is available in that block.
				                if ( isEndOfBlock && !CKEDITOR.env.ie )
				                    lineBreak.getParent().appendBogus();
				                // Now we can remove the text node contents, so the caret doesn't
				                // stop on it.
				                if ( !CKEDITOR.env.ie )
				                    lineBreak.getNext().$.nodeValue '';
				                // IE has different behavior regarding position.
				                if ( CKEDITOR.env.ie )
				                    range.setStartAtlineBreakCKEDITOR.POSITION_AFTER_END );
				                else
				                    range.setStartAtlineBreak.getNext(), CKEDITOR.POSITION_AFTER_START );
				                // Scroll into view, for non IE.
				                if ( !CKEDITOR.env.ie )
				                {
					                    var dummy null;
					                    // BR is not positioned in Opera and Webkit.
					                    if ( !CKEDITOR.env.gecko )
					                    {
						                        dummy doc.createElement'span' );
						                        // We need have some contents for Webkit to position it
						                        // under parent node. ( #3681)
						                        dummy.setHtml('&nbsp;
						');
						                    }
					                    else
					                        dummy doc.createElement'br' );
					                    dummy.insertBeforelineBreak.getNext() );
					                    dummy.scrollIntoView();
					                    dummy.remove();
					                }
				            }
			            // This collapse guarantees the cursor will be blinking.
			            range.collapsetrue );
			            range.selectisPre );
			        }
		    };
	    var plugin CKEDITOR.plugins.enterkey,
	        enterBr plugin.enterBr,
	        enterBlock plugin.enterBlock,
	        headerTagRegex = /^h[1-6]$/;
	    function shiftEntereditor )
	    {
		        // Only effective within document.
		        if ( editor.mode != 'wysiwyg' )
		            return false;
		        // On SHIFT+ENTER:
		        // 1. We want to enforce the mode to be respected, instead
		        // of cloning the current block. (#77)
		        // 2. Always perform a block break when inside <pre> (#5402).
		        if ( editor.getSelection().getStartElement().hasAscendant'pre'true ) )
		        {
			            setTimeout( function() {
				enterBlockeditoreditor.config.enterModenulltrue );
				}, );
			            return true;
			        }
		        else
		            return entereditoreditor.config.shiftEnterModetrue );
		    }
	    function entereditormodeforceMode )
	    {
		        forceMode editor.config.forceEnterMode || forceMode;
		        // Only effective within document.
		        if ( editor.mode != 'wysiwyg' )
		            return false;
		        if ( !mode )
		            mode editor.config.enterMode;
		        // Use setTimout so the keys get cancelled immediatelly.
		        setTimeout( function()
		            {
			                editor.fire'saveSnapshot' );
			    // Save undo step.
			                if ( mode == CKEDITOR.ENTER_BR || editor.getSelection().getStartElement().hasAscendant'pre'true ) )
			                    enterBreditormodenullforceMode );
			                else
			                    enterBlockeditormodenullforceMode );
			            }, );
		        return true;
		    }
	    function getRangeeditor )
	    {
		        // Get the selection ranges.
		        var ranges editor.getSelection().getRangestrue );
		        // Delete the contents of all ranges except the first one.
		        for ( var ranges.length ;
		 ;
		 i-- )
		        {
			            ranges].deleteContents();
			        }
		        // Return the first range.
		        return ranges];
		    }
	})();





PHP Demo Source Code Index