2 Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved.
\r
3 For licensing, see LICENSE.html or http://ckeditor.com/license
\r
6 CKEDITOR.dialog.add( 'colordialog', function( editor )
\r
8 // Define some shorthands.
\r
9 var $el = CKEDITOR.dom.element,
\r
10 $doc = CKEDITOR.document,
\r
11 $tools = CKEDITOR.tools,
\r
12 lang = editor.lang.colordialog;
\r
14 // Reference the dialog.
\r
23 function clearSelected()
\r
25 $doc.getById( selHiColorId ).removeStyle( 'background-color' );
\r
26 dialog.getContentElement( 'picker', 'selectedColor' ).setValue( '' );
\r
29 function updateSelected( evt )
\r
31 if ( ! ( evt instanceof CKEDITOR.dom.event ) )
\r
32 evt = new CKEDITOR.dom.event( evt );
\r
34 var target = evt.getTarget(),
\r
37 if ( target.getName() == 'a' && ( color = target.getChild( 0 ).getHtml() ) )
\r
38 dialog.getContentElement( 'picker', 'selectedColor' ).setValue( color );
\r
41 function updateHighlight( event )
\r
43 if ( ! ( event instanceof CKEDITOR.dom.event ) )
\r
46 var target = event.getTarget(),
\r
49 if ( target.getName() == 'a' && ( color = target.getChild( 0 ).getHtml() ) )
\r
51 $doc.getById( hicolorId ).setStyle( 'background-color', color );
\r
52 $doc.getById( hicolorTextId ).setHtml( color );
\r
56 function clearHighlight()
\r
58 $doc.getById( hicolorId ).removeStyle( 'background-color' );
\r
59 $doc.getById( hicolorTextId ).setHtml( ' ' );
\r
62 var onMouseout = $tools.addFunction( clearHighlight ),
\r
63 onClick = updateSelected,
\r
64 onClickHandler = CKEDITOR.tools.addFunction( onClick ),
\r
65 onFocus = updateHighlight,
\r
66 onBlur = clearHighlight;
\r
68 var onKeydownHandler = CKEDITOR.tools.addFunction( function( ev )
\r
70 ev = new CKEDITOR.dom.event( ev );
\r
71 var element = ev.getTarget();
\r
72 var relative, nodeToMove;
\r
73 var keystroke = ev.getKeystroke(),
\r
74 rtl = editor.lang.dir == 'rtl';
\r
76 switch ( keystroke )
\r
81 if ( ( relative = element.getParent().getParent().getPrevious() ) )
\r
83 nodeToMove = relative.getChild( [element.getParent().getIndex(), 0] );
\r
85 onBlur( ev, element );
\r
86 onFocus( ev, nodeToMove );
\r
88 ev.preventDefault();
\r
93 if ( ( relative = element.getParent().getParent().getNext() ) )
\r
95 nodeToMove = relative.getChild( [ element.getParent().getIndex(), 0 ] );
\r
96 if ( nodeToMove && nodeToMove.type == 1 )
\r
99 onBlur( ev, element );
\r
100 onFocus( ev, nodeToMove );
\r
103 ev.preventDefault();
\r
106 // ENTER is already handled as onClick
\r
109 ev.preventDefault();
\r
113 case rtl ? 37 : 39 :
\r
115 if ( ( relative = element.getParent().getNext() ) )
\r
117 nodeToMove = relative.getChild( 0 );
\r
118 if ( nodeToMove.type == 1 )
\r
120 nodeToMove.focus();
\r
121 onBlur( ev, element );
\r
122 onFocus( ev, nodeToMove );
\r
123 ev.preventDefault( true );
\r
126 onBlur( null, element );
\r
129 else if ( ( relative = element.getParent().getParent().getNext() ) )
\r
131 nodeToMove = relative.getChild( [ 0, 0 ] );
\r
132 if ( nodeToMove && nodeToMove.type == 1 )
\r
134 nodeToMove.focus();
\r
135 onBlur( ev, element );
\r
136 onFocus( ev, nodeToMove );
\r
137 ev.preventDefault( true );
\r
140 onBlur( null, element );
\r
145 case rtl ? 39 : 37 :
\r
147 if ( ( relative = element.getParent().getPrevious() ) )
\r
149 nodeToMove = relative.getChild( 0 );
\r
150 nodeToMove.focus();
\r
151 onBlur( ev, element );
\r
152 onFocus( ev, nodeToMove );
\r
153 ev.preventDefault( true );
\r
156 else if ( ( relative = element.getParent().getParent().getPrevious() ) )
\r
158 nodeToMove = relative.getLast().getChild( 0 );
\r
159 nodeToMove.focus();
\r
160 onBlur( ev, element );
\r
161 onFocus( ev, nodeToMove );
\r
162 ev.preventDefault( true );
\r
165 onBlur( null, element );
\r
168 // Do not stop not handled events.
\r
173 function createColorTable()
\r
175 // Create the base colors array.
\r
176 var aColors = [ '00', '33', '66', '99', 'cc', 'ff' ];
\r
178 // This function combines two ranges of three values from the color array into a row.
\r
179 function appendColorRow( rangeA, rangeB )
\r
181 for ( var i = rangeA ; i < rangeA + 3 ; i++ )
\r
183 var row = table.$.insertRow( -1 );
\r
185 for ( var j = rangeB ; j < rangeB + 3 ; j++ )
\r
187 for ( var n = 0 ; n < 6 ; n++ )
\r
189 appendColorCell( row, '#' + aColors[j] + aColors[n] + aColors[i] );
\r
195 // This function create a single color cell in the color table.
\r
196 function appendColorCell( targetRow, color )
\r
198 var cell = new $el( targetRow.insertCell( -1 ) );
\r
199 cell.setAttribute( 'class', 'ColorCell' );
\r
200 cell.setStyle( 'background-color', color );
\r
202 cell.setStyle( 'width', '15px' );
\r
203 cell.setStyle( 'height', '15px' );
\r
205 var index = cell.$.cellIndex + 1 + 18 * targetRow.rowIndex;
\r
206 cell.append( CKEDITOR.dom.element.createFromHtml(
\r
207 '<a href="javascript: void(0);" role="option"' +
\r
208 ' aria-posinset="' + index + '"' +
\r
209 ' aria-setsize="' + 13 * 18 + '"' +
\r
210 ' style="cursor: pointer;display:block;width:100%;height:100% " title="'+ CKEDITOR.tools.htmlEncode( color )+ '"' +
\r
211 ' onkeydown="CKEDITOR.tools.callFunction( ' + onKeydownHandler + ', event, this )"' +
\r
212 ' onclick="CKEDITOR.tools.callFunction(' + onClickHandler + ', event, this ); return false;"' +
\r
213 ' tabindex="-1"><span class="cke_voice_label">' + color + '</span> </a>', CKEDITOR.document ) );
\r
216 appendColorRow( 0, 0 );
\r
217 appendColorRow( 3, 0 );
\r
218 appendColorRow( 0, 3 );
\r
219 appendColorRow( 3, 3 );
\r
221 // Create the last row.
\r
222 var oRow = table.$.insertRow(-1) ;
\r
224 // Create the gray scale colors cells.
\r
225 for ( var n = 0 ; n < 6 ; n++ )
\r
227 appendColorCell( oRow, '#' + aColors[n] + aColors[n] + aColors[n] ) ;
\r
230 // Fill the row with black cells.
\r
231 for ( var i = 0 ; i < 12 ; i++ )
\r
233 appendColorCell( oRow, '#000000' ) ;
\r
237 var table = new $el( 'table' );
\r
238 createColorTable();
\r
239 var html = table.getHtml();
\r
241 var numbering = function( id )
\r
243 return CKEDITOR.tools.getNextId() + '_' + id;
\r
245 hicolorId = numbering( 'hicolor' ),
\r
246 hicolorTextId = numbering( 'hicolortext' ),
\r
247 selHiColorId = numbering( 'selhicolor' ),
\r
248 tableLabelId = numbering( 'color_table_label' );
\r
251 title : lang.title,
\r
254 onLoad : function()
\r
256 // Update reference.
\r
262 label : lang.title,
\r
269 widths : [ '70%', '10%', '30%' ],
\r
274 html : '<table role="listbox" aria-labelledby="' + tableLabelId + '" onmouseout="CKEDITOR.tools.callFunction( ' + onMouseout + ' );">' +
\r
275 ( !CKEDITOR.env.webkit ? html : '' ) +
\r
276 '</table><span id="' + tableLabelId + '" class="cke_voice_label">' + lang.options +'</span>',
\r
277 onLoad : function()
\r
279 var table = CKEDITOR.document.getById( this.domId );
\r
280 table.on( 'mouseover', updateHighlight );
\r
281 // In WebKit, the table content must be inserted after this event call (#6150)
\r
282 CKEDITOR.env.webkit && table.setHtml( html );
\r
286 var firstColor = this.getElement().getElementsByTag( 'a' ).getItem( 0 );
\r
287 firstColor.focus();
\r
294 widths : [ '70%', '5%', '25%' ],
\r
299 html : '<span>' + lang.highlight +'</span>\
\r
300 <div id="' + hicolorId + '" style="border: 1px solid; height: 74px; width: 74px;"></div>\
\r
301 <div id="' + hicolorTextId + '"> </div><span>' + lang.selected + '</span>\
\r
302 <div id="' + selHiColorId + '" style="border: 1px solid; height: 20px; width: 74px;"></div>'
\r
306 label : lang.selected,
\r
307 labelStyle: 'display:none',
\r
308 id : 'selectedColor',
\r
309 style : 'width: 74px',
\r
310 onChange : function()
\r
312 // Try to update color preview with new value. If fails, then set it no none.
\r
315 $doc.getById( selHiColorId ).setStyle( 'background-color', this.getValue() );
\r
327 style : 'margin-top: 5px',
\r
328 label : lang.clear,
\r
329 onClick : clearSelected
\r