+ if ( ! (event instanceof CKEDITOR.dom.event ) )\r
+ event = event.data;\r
+\r
+ var target = event.getTarget(),\r
+ color;\r
+\r
+ if ( target.getName() == 'a' && ( color = target.getChild( 0 ).getHtml() ) )\r
+ {\r
+ $doc.getById( hicolorId ).setStyle( 'background-color', color );\r
+ $doc.getById( hicolorTextId ).setHtml( color );\r
+ }\r
+ }\r
+\r
+ function clearHighlight()\r
+ {\r
+ $doc.getById( hicolorId ).removeStyle( 'background-color' );\r
+ $doc.getById( hicolorTextId ).setHtml( ' ' );\r
+ }\r
+\r
+ var onMouseout = $tools.addFunction( clearHighlight );\r
+\r
+ var onClick = updateSelected,\r
+ onClickHandler = CKEDITOR.tools.addFunction( onClick );\r
+\r
+ var onFocus = updateHighlight,\r
+ onBlur = clearHighlight;\r
+\r
+ var onKeydownHandler = CKEDITOR.tools.addFunction( function( ev )\r
+ {\r
+ ev = new CKEDITOR.dom.event( ev );\r
+ var element = ev.getTarget();\r
+ var relative, nodeToMove;\r
+ var keystroke = ev.getKeystroke();\r
+ var rtl = editor.lang.dir == 'rtl';\r
+\r
+ switch ( keystroke )\r
+ {\r
+ // UP-ARROW\r
+ case 38 :\r
+ // relative is TR\r
+ if ( ( relative = element.getParent().getParent().getPrevious() ) )\r
+ {\r
+ nodeToMove = relative.getChild( [element.getParent().getIndex(), 0] );\r
+ nodeToMove.focus();\r
+ onBlur( ev, element );\r
+ onFocus( ev, nodeToMove );\r
+ }\r
+ ev.preventDefault();\r
+ break;\r
+ // DOWN-ARROW\r
+ case 40 :\r
+ // relative is TR\r
+ if ( ( relative = element.getParent().getParent().getNext() ) )\r
+ {\r
+ nodeToMove = relative.getChild( [ element.getParent().getIndex(), 0 ] );\r
+ if ( nodeToMove && nodeToMove.type == 1 )\r
+ {\r
+ nodeToMove.focus();\r
+ onBlur( ev, element );\r
+ onFocus( ev, nodeToMove );\r
+ }\r
+ }\r
+ ev.preventDefault();\r
+ break;\r
+ // SPACE\r
+ // ENTER is already handled as onClick\r
+ case 32 :\r
+ onClick( ev );\r
+ ev.preventDefault();\r
+ break;\r
+\r
+ // RIGHT-ARROW\r
+ case rtl ? 37 : 39 :\r
+ // relative is TD\r
+ if ( ( relative = element.getParent().getNext() ) )\r
+ {\r
+ nodeToMove = relative.getChild( 0 );\r
+ if ( nodeToMove.type == 1 )\r
+ {\r
+ nodeToMove.focus();\r
+ onBlur( ev, element );\r
+ onFocus( ev, nodeToMove );\r
+ ev.preventDefault( true );\r
+ }\r
+ else\r
+ onBlur( null, element );\r
+ }\r
+ // relative is TR\r
+ else if ( ( relative = element.getParent().getParent().getNext() ) )\r
+ {\r
+ nodeToMove = relative.getChild( [ 0, 0 ] );\r
+ if ( nodeToMove && nodeToMove.type == 1 )\r
+ {\r
+ nodeToMove.focus();\r
+ onBlur( ev, element );\r
+ onFocus( ev, nodeToMove );\r
+ ev.preventDefault( true );\r
+ }\r
+ else\r
+ onBlur( null, element );\r
+ }\r
+ break;\r
+\r
+ // LEFT-ARROW\r
+ case rtl ? 39 : 37 :\r
+ // relative is TD\r
+ if ( ( relative = element.getParent().getPrevious() ) )\r
+ {\r
+ nodeToMove = relative.getChild( 0 );\r
+ nodeToMove.focus();\r
+ onBlur( ev, element );\r
+ onFocus( ev, nodeToMove );\r
+ ev.preventDefault( true );\r
+ }\r
+ // relative is TR\r
+ else if ( ( relative = element.getParent().getParent().getPrevious() ) )\r
+ {\r
+ nodeToMove = relative.getLast().getChild( 0 );\r
+ nodeToMove.focus();\r
+ onBlur( ev, element );\r
+ onFocus( ev, nodeToMove );\r
+ ev.preventDefault( true );\r
+ }\r
+ else\r
+ onBlur( null, element );\r
+ break;\r
+ default :\r
+ // Do not stop not handled events.\r
+ return;\r
+ }\r
+ });\r