/*\r
-Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.\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
// Reference the dialog.\r
var dialog;\r
\r
- function spacer()\r
+ var spacer =\r
{\r
- return {\r
- type : 'html',\r
- html : ' '\r
- };\r
+ type : 'html',\r
+ html : ' '\r
+ };\r
+\r
+ function clearSelected()\r
+ {\r
+ $doc.getById( selHiColorId ).removeStyle( 'background-color' );\r
+ dialog.getContentElement( 'picker', 'selectedColor' ).setValue( '' );\r
}\r
\r
- var table = new $el( 'table' );\r
- createColorTable();\r
+ function updateSelected( evt )\r
+ {\r
+ if ( ! ( evt instanceof CKEDITOR.dom.event ) )\r
+ evt = new CKEDITOR.dom.event( evt );\r
\r
- var cellMouseover = function( event )\r
+ var target = evt.getTarget(),\r
+ color;\r
+\r
+ if ( target.getName() == 'a' && ( color = target.getChild( 0 ).getHtml() ) )\r
+ dialog.getContentElement( 'picker', 'selectedColor' ).setValue( color );\r
+ }\r
+\r
+ function updateHighlight( event )\r
{\r
- var color = new $el( event.data.getTarget() ).getAttribute( 'title' );\r
- $doc.getById( 'hicolor' ).setStyle( 'background-color', color );\r
- $doc.getById( 'hicolortext' ).setHtml( color );\r
- };\r
+ if ( ! ( event instanceof CKEDITOR.dom.event ) )\r
+ event = event.data;\r
\r
- var cellClick = function( event )\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
- var color = new $el( event.data.getTarget() ).getAttribute( 'title' );\r
- dialog.getContentElement( 'picker', 'selectedColor' ).setValue( color );\r
- };\r
+ $doc.getById( hicolorId ).removeStyle( 'background-color' );\r
+ $doc.getById( hicolorTextId ).setHtml( ' ' );\r
+ }\r
+\r
+ var onMouseout = $tools.addFunction( clearHighlight ),\r
+ onClick = updateSelected,\r
+ onClickHandler = CKEDITOR.tools.addFunction( onClick ),\r
+ 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
+ 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
\r
function createColorTable()\r
{\r
// Create the base colors array.\r
- var aColors = ['00','33','66','99','cc','ff'];\r
+ var aColors = [ '00', '33', '66', '99', 'cc', 'ff' ];\r
\r
// This function combines two ranges of three values from the color array into a row.\r
function appendColorRow( rangeA, rangeB )\r
{\r
for ( var i = rangeA ; i < rangeA + 3 ; i++ )\r
{\r
- var row = table.$.insertRow(-1);\r
+ var row = table.$.insertRow( -1 );\r
\r
for ( var j = rangeB ; j < rangeB + 3 ; j++ )\r
{\r
cell.setStyle( 'width', '15px' );\r
cell.setStyle( 'height', '15px' );\r
\r
- // Pass unparsed color value in some markup-degradable form.\r
- cell.setAttribute( 'title', color );\r
+ var index = cell.$.cellIndex + 1 + 18 * targetRow.rowIndex;\r
+ cell.append( CKEDITOR.dom.element.createFromHtml(\r
+ '<a href="javascript: void(0);" role="option"' +\r
+ ' aria-posinset="' + index + '"' +\r
+ ' aria-setsize="' + 13 * 18 + '"' +\r
+ ' style="cursor: pointer;display:block;width:100%;height:100% " title="'+ CKEDITOR.tools.htmlEncode( color )+ '"' +\r
+ ' onkeydown="CKEDITOR.tools.callFunction( ' + onKeydownHandler + ', event, this )"' +\r
+ ' onclick="CKEDITOR.tools.callFunction(' + onClickHandler + ', event, this ); return false;"' +\r
+ ' tabindex="-1"><span class="cke_voice_label">' + color + '</span> </a>', CKEDITOR.document ) );\r
}\r
\r
appendColorRow( 0, 0 );\r
}\r
}\r
\r
- function clear()\r
- {\r
- $doc.getById( 'selhicolor' ).removeStyle( 'background-color' );\r
- dialog.getContentElement( 'picker', 'selectedColor' ).setValue( '' );\r
- }\r
+ var table = new $el( 'table' );\r
+ createColorTable();\r
+ var html = table.getHtml();\r
\r
- var clearActual = $tools.addFunction( function()\r
- {\r
- $doc.getById( 'hicolor' ).removeStyle( 'background-color' );\r
- $doc.getById( 'hicolortext' ).setHtml( ' ' );\r
- } );\r
+ var numbering = function( id )\r
+ {\r
+ return CKEDITOR.tools.getNextId() + '_' + id;\r
+ },\r
+ hicolorId = numbering( 'hicolor' ),\r
+ hicolorTextId = numbering( 'hicolortext' ),\r
+ selHiColorId = numbering( 'selhicolor' ),\r
+ tableLabelId = numbering( 'color_table_label' );\r
\r
return {\r
title : lang.title,\r
[\r
{\r
type : 'html',\r
- html : '<table onmouseout="CKEDITOR.tools.callFunction( ' + clearActual + ' );">' + table.getHtml() + '</table>',\r
+ html : '<table role="listbox" aria-labelledby="' + tableLabelId + '" onmouseout="CKEDITOR.tools.callFunction( ' + onMouseout + ' );">' +\r
+ ( !CKEDITOR.env.webkit ? html : '' ) +\r
+ '</table><span id="' + tableLabelId + '" class="cke_voice_label">' + lang.options +'</span>',\r
onLoad : function()\r
{\r
var table = CKEDITOR.document.getById( this.domId );\r
- table.on( 'mouseover', cellMouseover );\r
- table.on( 'click', cellClick );\r
+ table.on( 'mouseover', updateHighlight );\r
+ // In WebKit, the table content must be inserted after this event call (#6150)\r
+ CKEDITOR.env.webkit && table.setHtml( html );\r
+ },\r
+ focus: function()\r
+ {\r
+ var firstColor = this.getElement().getElementsByTag( 'a' ).getItem( 0 );\r
+ firstColor.focus();\r
}\r
},\r
- spacer(),\r
+ spacer,\r
{\r
type : 'vbox',\r
padding : 0,\r
{\r
type : 'html',\r
html : '<span>' + lang.highlight +'</span>\\r
- <div id="hicolor" style="border: 1px solid; height: 74px; width: 74px;"></div>\\r
- <div id="hicolortext"> </div>\\r
- <span>' + lang.selected +'</span>\\r
- <div id="selhicolor" style="border: 1px solid; height: 20px; width: 74px;"></div>'\r
+ <div id="' + hicolorId + '" style="border: 1px solid; height: 74px; width: 74px;"></div>\\r
+ <div id="' + hicolorTextId + '"> </div><span>' + lang.selected + '</span>\\r
+ <div id="' + selHiColorId + '" style="border: 1px solid; height: 20px; width: 74px;"></div>'\r
},\r
{\r
type : 'text',\r
+ label : lang.selected,\r
+ labelStyle: 'display:none',\r
id : 'selectedColor',\r
style : 'width: 74px',\r
onChange : function()\r
// Try to update color preview with new value. If fails, then set it no none.\r
try\r
{\r
- $doc.getById( 'selhicolor' ).setStyle( 'background-color', this.getValue() );\r
+ $doc.getById( selHiColorId ).setStyle( 'background-color', this.getValue() );\r
}\r
catch ( e )\r
{\r
- clear();\r
+ clearSelected();\r
}\r
}\r
},\r
- spacer(),\r
+ spacer,\r
{\r
type : 'button',\r
id : 'clear',\r
style : 'margin-top: 5px',\r
label : lang.clear,\r
- onClick : clear\r
+ onClick : clearSelected\r
}\r
]\r
}\r