--- /dev/null
+/*\r
+Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved.\r
+For licensing, see LICENSE.html or http://ckeditor.com/license\r
+*/\r
+\r
+CKEDITOR.plugins.add( 'listblock',\r
+{\r
+ requires : [ 'panel' ],\r
+\r
+ onLoad : function()\r
+ {\r
+ CKEDITOR.ui.panel.prototype.addListBlock = function( name, definition )\r
+ {\r
+ return this.addBlock( name, new CKEDITOR.ui.listBlock( this.getHolderElement(), definition ) );\r
+ };\r
+\r
+ CKEDITOR.ui.listBlock = CKEDITOR.tools.createClass(\r
+ {\r
+ base : CKEDITOR.ui.panel.block,\r
+\r
+ $ : function( blockHolder, blockDefinition )\r
+ {\r
+ blockDefinition = blockDefinition || {};\r
+\r
+ var attribs = blockDefinition.attributes || ( blockDefinition.attributes = {} );\r
+ ( this.multiSelect = !!blockDefinition.multiSelect ) &&\r
+ ( attribs[ 'aria-multiselectable' ] = true );\r
+ // Provide default role of 'listbox'.\r
+ !attribs.role && ( attribs.role = 'listbox' );\r
+\r
+ // Call the base contructor.\r
+ this.base.apply( this, arguments );\r
+\r
+ var keys = this.keys;\r
+ keys[ 40 ] = 'next'; // ARROW-DOWN\r
+ keys[ 9 ] = 'next'; // TAB\r
+ keys[ 38 ] = 'prev'; // ARROW-UP\r
+ keys[ CKEDITOR.SHIFT + 9 ] = 'prev'; // SHIFT + TAB\r
+ keys[ 32 ] = 'click'; // SPACE\r
+\r
+ this._.pendingHtml = [];\r
+ this._.items = {};\r
+ this._.groups = {};\r
+ },\r
+\r
+ _ :\r
+ {\r
+ close : function()\r
+ {\r
+ if ( this._.started )\r
+ {\r
+ this._.pendingHtml.push( '</ul>' );\r
+ delete this._.started;\r
+ }\r
+ },\r
+\r
+ getClick : function()\r
+ {\r
+ if ( !this._.click )\r
+ {\r
+ this._.click = CKEDITOR.tools.addFunction( function( value )\r
+ {\r
+ var marked = true;\r
+\r
+ if ( this.multiSelect )\r
+ marked = this.toggle( value );\r
+ else\r
+ this.mark( value );\r
+\r
+ if ( this.onClick )\r
+ this.onClick( value, marked );\r
+ },\r
+ this );\r
+ }\r
+ return this._.click;\r
+ }\r
+ },\r
+\r
+ proto :\r
+ {\r
+ add : function( value, html, title )\r
+ {\r
+ var pendingHtml = this._.pendingHtml,\r
+ id = CKEDITOR.tools.getNextId();\r
+\r
+ if ( !this._.started )\r
+ {\r
+ pendingHtml.push( '<ul role="presentation" class=cke_panel_list>' );\r
+ this._.started = 1;\r
+ this._.size = this._.size || 0;\r
+ }\r
+\r
+ this._.items[ value ] = id;\r
+\r
+ pendingHtml.push(\r
+ '<li id=', id, ' class=cke_panel_listItem role=presentation>' +\r
+ '<a id="', id, '_option" _cke_focus=1 hidefocus=true' +\r
+ ' title="', title || value, '"' +\r
+ ' href="javascript:void(\'', value, '\')"' +\r
+ ' onclick="CKEDITOR.tools.callFunction(', this._.getClick(), ',\'', value, '\'); return false;"',\r
+ ' role="option"' +\r
+ ' aria-posinset="' + ++this._.size + '">',\r
+ html || value,\r
+ '</a>' +\r
+ '</li>' );\r
+ },\r
+\r
+ startGroup : function( title )\r
+ {\r
+ this._.close();\r
+\r
+ var id = CKEDITOR.tools.getNextId();\r
+\r
+ this._.groups[ title ] = id;\r
+\r
+ this._.pendingHtml.push( '<h1 role="presentation" id=', id, ' class=cke_panel_grouptitle>', title, '</h1>' );\r
+ },\r
+\r
+ commit : function()\r
+ {\r
+ this._.close();\r
+ this.element.appendHtml( this._.pendingHtml.join( '' ) );\r
+\r
+ var items = this._.items,\r
+ doc = this.element.getDocument();\r
+ for ( var value in items )\r
+ doc.getById( items[ value ] + '_option' ).setAttribute( 'aria-setsize', this._.size );\r
+ delete this._.size;\r
+\r
+ this._.pendingHtml = [];\r
+ },\r
+\r
+ toggle : function( value )\r
+ {\r
+ var isMarked = this.isMarked( value );\r
+\r
+ if ( isMarked )\r
+ this.unmark( value );\r
+ else\r
+ this.mark( value );\r
+\r
+ return !isMarked;\r
+ },\r
+\r
+ hideGroup : function( groupTitle )\r
+ {\r
+ var group = this.element.getDocument().getById( this._.groups[ groupTitle ] ),\r
+ list = group && group.getNext();\r
+\r
+ if ( group )\r
+ {\r
+ group.setStyle( 'display', 'none' );\r
+\r
+ if ( list && list.getName() == 'ul' )\r
+ list.setStyle( 'display', 'none' );\r
+ }\r
+ },\r
+\r
+ hideItem : function( value )\r
+ {\r
+ this.element.getDocument().getById( this._.items[ value ] ).setStyle( 'display', 'none' );\r
+ },\r
+\r
+ showAll : function()\r
+ {\r
+ var items = this._.items,\r
+ groups = this._.groups,\r
+ doc = this.element.getDocument();\r
+\r
+ for ( var value in items )\r
+ {\r
+ doc.getById( items[ value ] ).setStyle( 'display', '' );\r
+ }\r
+\r
+ for ( var title in groups )\r
+ {\r
+ var group = doc.getById( groups[ title ] ),\r
+ list = group.getNext();\r
+\r
+ group.setStyle( 'display', '' );\r
+\r
+ if ( list && list.getName() == 'ul' )\r
+ list.setStyle( 'display', '' );\r
+ }\r
+ },\r
+\r
+ mark : function( value )\r
+ {\r
+ if ( !this.multiSelect )\r
+ this.unmarkAll();\r
+\r
+ var itemId = this._.items[ value ],\r
+ item = this.element.getDocument().getById( itemId );\r
+ item.addClass( 'cke_selected' );\r
+\r
+ this.element.getDocument().getById( itemId + '_option' ).setAttribute( 'aria-selected', true );\r
+ this.element.setAttribute( 'aria-activedescendant', itemId + '_option' );\r
+\r
+ this.onMark && this.onMark( item );\r
+ },\r
+\r
+ unmark : function( value )\r
+ {\r
+ this.element.getDocument().getById( this._.items[ value ] ).removeClass( 'cke_selected' );\r
+ this.onUnmark && this.onUnmark( this._.items[ value ] );\r
+ },\r
+\r
+ unmarkAll : function()\r
+ {\r
+ var items = this._.items,\r
+ doc = this.element.getDocument();\r
+\r
+ for ( var value in items )\r
+ {\r
+ doc.getById( items[ value ] ).removeClass( 'cke_selected' );\r
+ }\r
+\r
+ this.onUnmark && this.onUnmark();\r
+ },\r
+\r
+ isMarked : function( value )\r
+ {\r
+ return this.element.getDocument().getById( this._.items[ value ] ).hasClass( 'cke_selected' );\r
+ },\r
+\r
+ focus : function( value )\r
+ {\r
+ this._.focusIndex = -1;\r
+\r
+ if ( value )\r
+ {\r
+ var selected = this.element.getDocument().getById( this._.items[ value ] ).getFirst();\r
+\r
+ var links = this.element.getElementsByTag( 'a' ),\r
+ link,\r
+ i = -1;\r
+\r
+ while ( ( link = links.getItem( ++i ) ) )\r
+ {\r
+ if ( link.equals( selected ) )\r
+ {\r
+ this._.focusIndex = i;\r
+ break;\r
+ }\r
+ }\r
+\r
+ setTimeout( function()\r
+ {\r
+ selected.focus();\r
+ },\r
+ 0 );\r
+ }\r
+ }\r
+ }\r
+ });\r
+ }\r
+});\r