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

PHP Demo Application - Source Code

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



/*
Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
For licensing, see LICENSE.html or http://ckeditor.com/license
*/
/**
 * @file Increse and decrease indent commands.
 */
(function()
{
	    var listNodeNames = { ol 1ul 1
		};
	    var isNotWhitespaces CKEDITOR.dom.walker.whitespacestrue ),
	        isNotBookmark CKEDITOR.dom.walker.bookmarkfalsetrue );
	    function setStateeditorstate )
	    {
		        editor.getCommandthis.name ).setStatestate );
		    }
	    function onSelectionChangeevt )
	    {
		        var editor evt.editor;
		        var elementPath evt.data.path,
		                list = elementPath && elementPath.containslistNodeNames );
		        if ( list )
		                return setState.callthiseditorCKEDITOR.TRISTATE_OFF );
		        if ( !this.useIndentClasses && this.name == 'indent' )
		            return setState.callthiseditorCKEDITOR.TRISTATE_OFF );
		        var path evt.data.path,
		            firstBlock path.block || path.blockLimit;
		        if ( !firstBlock )
		            return setState.callthiseditorCKEDITOR.TRISTATE_DISABLED );
		        if ( this.useIndentClasses )
		        {
			            var indentClass firstBlock.$.className.matchthis.classNameRegex ),
			                indentStep 0;
			            if ( indentClass )
			            {
				                indentClass indentClass[1];
				                indentStep this.indentClassMapindentClass ];
				            }
			            if ( ( this.name == 'outdent' && !indentStep ) ||
			                    ( this.name == 'indent' && indentStep == editor.config.indentClasses.length ) )
			                return setState.callthiseditorCKEDITOR.TRISTATE_DISABLED );
			            return setState.callthiseditorCKEDITOR.TRISTATE_OFF );
			        }
		        else
		        {
			            var indent parseIntfirstBlock.getStylegetIndentCssPropertyfirstBlock ) ), 10 );
			            if ( isNaNindent ) )
			                indent 0;
			            if ( indent <= )
			                return setState.callthiseditorCKEDITOR.TRISTATE_DISABLED );
			            return setState.callthiseditorCKEDITOR.TRISTATE_OFF );
			        }
		    }
	    function indentCommandeditorname )
	    {
		        this.name name;
		        this.useIndentClasses editor.config.indentClasses && editor.config.indentClasses.length 0;
		        if ( this.useIndentClasses )
		        {
			            this.classNameRegex = new RegExp'(?:^|\\s+)(' editor.config.indentClasses.join'|' ) + ')(?=$|\\s)' );
			            this.indentClassMap {};
			            for ( var ;
			 editor.config.indentClasses.length ;
			 i++ )
			                this.indentClassMapeditor.config.indentClasses[i] ] = 1;
			        }
		        this.startDisabled name == 'outdent';
		    }
	    // Returns the CSS property to be used for identing a given element.
	    function getIndentCssPropertyelement )
	    {
		        return element.getComputedStyle'direction' ) == 'ltr' 'margin-left' 'margin-right';
		    }
	    function isListItemnode )
	    {
		        return node.type CKEDITOR.NODE_ELEMENT && node.is'li' );
		    }
	    indentCommand.prototype = {
		        exec : function( editor )
		        {
			            var self thisdatabase {};
			            function indentListlistNode )
			            {
				                // Our starting and ending points of the range might be inside some blocks under a list item...
				                // So before playing with the iterator, we need to expand the block to include the list items.
				                var startContainer range.startContainer,
				                    endContainer range.endContainer;
				                while ( startContainer && !startContainer.getParent().equalslistNode ) )
				                    startContainer startContainer.getParent();
				                while ( endContainer && !endContainer.getParent().equalslistNode ) )
				                    endContainer endContainer.getParent();
				                if ( !startContainer || !endContainer )
				                    return;
				                // Now we can iterate over the individual items on the same tree depth.
				                var block startContainer,
				                    itemsToMove [],
				                    stopFlag false;
				                while ( !stopFlag )
				                {
					                    if ( block.equalsendContainer ) )
					                        stopFlag true;
					                    itemsToMove.pushblock );
					                    block block.getNext();
					                }
				                if ( itemsToMove.length )
				                    return;
				                // Do indent or outdent operations on the array model of the list, not the
				                // list's DOM tree itself. The array model demands that it knows as much as
				                // possible about the surrounding lists, we need to feed it the further
				                // ancestor node that is still a list.
				                var listParents listNode.getParentstrue );
				                for ( var ;
				 listParents.length ;
				 i++ )
				                {
					                    if ( listParents[i].getName && listNodeNameslistParents[i].getName() ] )
					                    {
						                        listNode listParents[i];
						                        break;
						                    }
					                }
				                var indentOffset self.name == 'indent' : -1,
				                    startItem itemsToMove[0],
				                    lastItem itemsToMoveitemsToMove.length ];
				                // Convert the list DOM tree into a one dimensional array.
				                var listArray CKEDITOR.plugins.list.listToArraylistNodedatabase );
				                // Apply indenting or outdenting on the array.
				                var baseIndent listArraylastItem.getCustomData'listarray_index' ) ].indent;
				                for ( startItem.getCustomData'listarray_index' );
				 <= lastItem.getCustomData'listarray_index' );
				 i++ )
				                {
					                    listArray].indent += indentOffset;
					                    // Make sure the newly created sublist get a brand-new element of the same type. (#5372)
					                    var listRoot listArray].parent;
					                    listArray].parent = new CKEDITOR.dom.elementlistRoot.getName(), listRoot.getDocument() );
					                }
				                for ( lastItem.getCustomData'listarray_index' ) + ;
				                        listArray.length && listArray[i].indent baseIndent ;
				 i++ )
				                    listArray[i].indent += indentOffset;
				                // Convert the array back to a DOM forest (yes we might have a few subtrees now).
				                // And replace the old list with the new forest.
				                var newListDir listNode.getAttribute'dir' ) || listNode.getStyle'direction' );
				                var newList CKEDITOR.plugins.list.arrayToListlistArraydatabasenulleditor.config.enterModenewListDir );
				                // Avoid nested <li> after outdent even they're visually same,
				                // recording them for later refactoring.(#3982)
				                if ( self.name == 'outdent' )
				                {
					                    var parentLiElement;
					                    if ( ( parentLiElement listNode.getParent() ) && parentLiElement.is'li' ) )
					                    {
						                        var children newList.listNode.getChildren(),
						                            pendingLis [],
						                            count children.count(),
						                            child;
						                        for ( count ;
						 >= ;
						 i-- )
						                        {
							                            if ( ( child children.getItem) ) && child.is && child.is'li' )  )
							                                pendingLis.pushchild );
							                        }
						                    }
					                }
				                if ( newList )
				                    newList.listNode.replacelistNode );
				                // Move the nested <li> to be appeared after the parent.
				                if ( pendingLis && pendingLis.length )
				                {
					                    for (  0;
					 pendingLis.length ;
					 i++ )
					                    {
						                        var li pendingLis],
						                            followingList li;
						                        // Nest preceding <ul>/<ol> inside current <li> if any.
						                        while ( ( followingList followingList.getNext() ) &&
						                               followingList.is &&
						                               followingList.getName() in listNodeNames )
						                        {
							                            // IE requires a filler NBSP for nested list inside empty list item,
							                            // otherwise the list item will be inaccessiable. (#4476)
							                            if ( CKEDITOR.env.ie && !li.getFirst( function( node ){ return isNotWhitespacesnode ) && isNotBookmarknode );
								} ) )
							                                li.appendrange.document.createText'\u00a0' ) );
							                            li.appendfollowingList );
							                        }
						                        li.insertAfterparentLiElement );
						                    }
					                }
				            }
			            function indentBlock()
			            {
				                var iterator range.createIterator(),
				                    enterMode editor.config.enterMode;
				                iterator.enforceRealBlocks true;
				                iterator.enlargeBr enterMode != CKEDITOR.ENTER_BR;
				                var block;
				                while ( ( block iterator.getNextParagraph() ) )
				                    indentElementblock );
				            }
			            function indentElementelement )
			            {
				                if ( element.getCustomData'indent_processed' ) )
				                    return false;
				                if ( self.useIndentClasses )
				                {
					                    // Transform current class name to indent step index.
					                    var indentClass element.$.className.matchself.classNameRegex ),
					                            indentStep 0;
					                    if ( indentClass )
					                    {
						                        indentClass indentClass[1];
						                        indentStep self.indentClassMapindentClass ];
						                    }
					                    // Operate on indent step index, transform indent step index back to class
					                    // name.
					                    if ( self.name == 'outdent' )
					                        indentStep--;
					                    else
					                        indentStep++;
					                    if ( indentStep )
					                        return false;
					                    indentStep Math.minindentStepeditor.config.indentClasses.length );
					                    indentStep Math.maxindentStep);
					                    var className CKEDITOR.tools.ltrimelement.$.className.replaceself.classNameRegex'' ) );
					                    if ( indentStep )
					                        element.$.className className;
					                    else
					                        element.addClasseditor.config.indentClassesindentStep ] );
					                }
				                else
				                {
					                    var indentCssProperty getIndentCssPropertyelement );
					                    var currentOffset parseIntelement.getStyleindentCssProperty ), 10 );
					                    if ( isNaNcurrentOffset ) )
					                        currentOffset 0;
					                    currentOffset += ( self.name == 'indent' : -) * editor.config.indentOffset;
					                    if ( currentOffset )
					                        return false;
					                    currentOffset Math.maxcurrentOffset);
					                    currentOffset Math.ceilcurrentOffset editor.config.indentOffset ) * editor.config.indentOffset;
					                    element.setStyleindentCssPropertycurrentOffset currentOffset editor.config.indentUnit '' );
					                    if ( element.getAttribute'style' ) === '' )
					                        element.removeAttribute'style' );
					                }
				                CKEDITOR.dom.element.setMarkerdatabaseelement'indent_processed'true );
				                return true;
				            }
			            var selection editor.getSelection(),
			                bookmarks selection.createBookmarkstrue ),
			                ranges selection && selection.getRangestrue ),
			                range;
			            var skipBookmarks = function( node )
			            {
				                return ! node.hasAttribute'_cke_bookmark' );
				            };
			            var iterator ranges.createIterator();
			            while ( ( range iterator.getNextRange() ) )
			            {
				                // Do not indent body. (#6138)
				                range.shrinkCKEDITOR.SHRINK_ELEMENT );
				                if ( range.endContainer.getName() == 'body' )
				                    range.setEndAtrange.endContainer.getLastskipBookmarks ), CKEDITOR.POSITION_BEFORE_END );
				                var startContainer range.startContainer,
				                    endContainer range.endContainer,
				                    rangeRoot range.getCommonAncestor(),
				                    nearestListBlock rangeRoot;
				                while ( nearestListBlock && !( nearestListBlock.type == CKEDITOR.NODE_ELEMENT &&
				                    listNodeNamesnearestListBlock.getName() ] ) )
				                    nearestListBlock nearestListBlock.getParent();
				                // Avoid selection anchors under list root.
				                // <ul>[<li>...</li>]</ul> =>    <ul><li>[...]</li></ul>
				                if ( nearestListBlock && startContainer.type == CKEDITOR.NODE_ELEMENT
				                    && startContainer.getName() in listNodeNames )
				                {
					                    var walker = new CKEDITOR.dom.walkerrange );
					                    walker.evaluator isListItem;
					                    range.startContainer walker.next();
					                }
				                if ( nearestListBlock && endContainer.type == CKEDITOR.NODE_ELEMENT
				                    && endContainer.getName() in listNodeNames )
				                {
					                    walker = new CKEDITOR.dom.walkerrange );
					                    walker.evaluator isListItem;
					                    range.endContainer walker.previous();
					                }
				                if ( nearestListBlock  )
				                {
					                    var firstListItem nearestListBlock.getFirst( function( node )
					                        {
						                            return node.type == CKEDITOR.NODE_ELEMENT && node.is'li' );
						                        }),
					                        rangeStart range.startContainer,
					                        indentWholeList firstListItem.equalsrangeStart ) || firstListItem.containsrangeStart );
					                    // Indent the entire list if  cursor is inside the first list item. (#3893)
					                    if ( !( indentWholeList && indentElementnearestListBlock ) ) )
					                        indentListnearestListBlock );
					                }
				                else
				                    indentBlock();
				            }
			            // Clean up the markers.
			            CKEDITOR.dom.element.clearAllMarkersdatabase );
			            editor.forceNextSelectionCheck();
			            selection.selectBookmarksbookmarks );
			        }
		    };
	    CKEDITOR.plugins.add'indent',
	    {
		        init : function( editor )
		        {
			            // Register commands.
			            var indent = new indentCommandeditor'indent' ),
			                outdent = new indentCommandeditor'outdent' );
			            editor.addCommand'indent'indent );
			            editor.addCommand'outdent'outdent );
			            // Register the toolbar buttons.
			            editor.ui.addButton'Indent',
			                {
				                    label editor.lang.indent,
				                    command 'indent'
				                });
			            editor.ui.addButton'Outdent',
			                {
				                    label editor.lang.outdent,
				                    command 'outdent'
				                });
			            // Register the state changing handlers.
			            editor.on'selectionChange'CKEDITOR.tools.bindonSelectionChangeindent ) );
			            editor.on'selectionChange'CKEDITOR.tools.bindonSelectionChangeoutdent ) );
			            // [IE6/7] Raw lists are using margin instead of padding for visual indentation in wysiwyg mode. (#3893)
			            if ( CKEDITOR.env.ie6Compat || CKEDITOR.env.ie7Compat )
			            {
				                editor.addCss(
				                    "ul,ol" +
				                    "{" +
					                    "    margin-left: 0px;
					" +
					                    "    padding-left: 40px;
					" +
					                    "}" );
				            }
			        },
		        requires : [ 'domiterator''list' ]
		    } );
	})();
CKEDITOR.tools.extendCKEDITOR.config,
    {
	        indentOffset 40,
	        indentUnit 'px',
	        indentClasses null
	    });
/**
 * Size of each indentation step
 * @type Number
 * @example
 * config.indentOffset = 40;
 */
 /**
 * Unit for the indentation style
 * @type String
 * @example
 * config.indentUnit = 'px';
 */
 /**
 * List of classes to use for indenting the contents.
 * @type Array
 * @example
 * // Don't use classes for indenting. (this is the default value)
 * config.indentClasses = null;
 * @example
 * // Use the classes 'Indent1', 'Indent2', 'Indent3'
 * config.indentClasses = ['Indent1', 'Indent2', 'Indent3'];
 */
/**
 * Size of each indentation step
 * @type Number
 * @default 40
 * @example
 * config.indentOffset = 4;
 */
 /**
 * Unit for the indentation style
 * @type String
 * @default 'px'
 * @example
 * config.indentUnit = 'em';
 */
 /**
 * List of classes to use for indenting the contents. If it's null, no classes will be used
 * and instead the {@link #indentUnit} and {@link #indentOffset} properties will be used.
 * @type Array
 * default null
 * @example
 * // Use the classes 'Indent1', 'Indent2', 'Indent3'
 * config.indentClasses = ['Indent1', 'Indent2', 'Indent3'];
 */





PHP Demo Source Code Index