--- /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.dialog.add( 'smiley', function( editor )\r
+{\r
+ var config = editor.config,\r
+ lang = editor.lang.smiley,\r
+ images = config.smiley_images,\r
+ columns = config.smiley_columns || 8,\r
+ i;\r
+\r
+ /**\r
+ * Simulate "this" of a dialog for non-dialog events.\r
+ * @type {CKEDITOR.dialog}\r
+ */\r
+ var dialog;\r
+ var onClick = function( evt )\r
+ {\r
+ var target = evt.data.getTarget(),\r
+ targetName = target.getName();\r
+\r
+ if ( targetName == 'a' )\r
+ target = target.getChild( 0 );\r
+ else if ( targetName != 'img' )\r
+ return;\r
+\r
+ var src = target.getAttribute( 'cke_src' ),\r
+ title = target.getAttribute( 'title' );\r
+\r
+ var img = editor.document.createElement( 'img',\r
+ {\r
+ attributes :\r
+ {\r
+ src : src,\r
+ 'data-cke-saved-src' : src,\r
+ title : title,\r
+ alt : title,\r
+ width : target.$.width,\r
+ height : target.$.height\r
+ }\r
+ });\r
+\r
+ editor.insertElement( img );\r
+\r
+ dialog.hide();\r
+ evt.data.preventDefault();\r
+ };\r
+\r
+ var onKeydown = CKEDITOR.tools.addFunction( function( ev, element )\r
+ {\r
+ ev = new CKEDITOR.dom.event( ev );\r
+ element = new CKEDITOR.dom.element( element );\r
+ var relative, nodeToMove;\r
+\r
+ var keystroke = ev.getKeystroke(),\r
+ rtl = editor.lang.dir == 'rtl';\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
+ }\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 )\r
+ nodeToMove.focus();\r
+ }\r
+ ev.preventDefault();\r
+ break;\r
+ // ENTER\r
+ // SPACE\r
+ case 32 :\r
+ onClick( { data: ev } );\r
+ ev.preventDefault();\r
+ break;\r
+\r
+ // RIGHT-ARROW\r
+ case rtl ? 37 : 39 :\r
+ // TAB\r
+ case 9 :\r
+ // relative is TD\r
+ if ( ( relative = element.getParent().getNext() ) )\r
+ {\r
+ nodeToMove = relative.getChild( 0 );\r
+ nodeToMove.focus();\r
+ ev.preventDefault(true);\r
+ }\r
+ // relative is TR\r
+ else if ( ( relative = element.getParent().getParent().getNext() ) )\r
+ {\r
+ nodeToMove = relative.getChild( [0, 0] );\r
+ if ( nodeToMove )\r
+ nodeToMove.focus();\r
+ ev.preventDefault(true);\r
+ }\r
+ break;\r
+\r
+ // LEFT-ARROW\r
+ case rtl ? 39 : 37 :\r
+ // SHIFT + TAB\r
+ case CKEDITOR.SHIFT + 9 :\r
+ // relative is TD\r
+ if ( ( relative = element.getParent().getPrevious() ) )\r
+ {\r
+ nodeToMove = relative.getChild( 0 );\r
+ nodeToMove.focus();\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
+ ev.preventDefault(true);\r
+ }\r
+ break;\r
+ default :\r
+ // Do not stop not handled events.\r
+ return;\r
+ }\r
+ });\r
+\r
+ // Build the HTML for the smiley images table.\r
+ var labelId = CKEDITOR.tools.getNextId() + '_smiley_emtions_label';\r
+ var html =\r
+ [\r
+ '<div>' +\r
+ '<span id="' + labelId + '" class="cke_voice_label">' + lang.options +'</span>',\r
+ '<table role="listbox" aria-labelledby="' + labelId + '" style="width:100%;height:100%" cellspacing="2" cellpadding="2"',\r
+ CKEDITOR.env.ie && CKEDITOR.env.quirks ? ' style="position:absolute;"' : '',\r
+ '><tbody>'\r
+ ];\r
+\r
+ var size = images.length;\r
+ for ( i = 0 ; i < size ; i++ )\r
+ {\r
+ if ( i % columns === 0 )\r
+ html.push( '<tr>' );\r
+\r
+ var smileyLabelId = 'cke_smile_label_' + i + '_' + CKEDITOR.tools.getNextNumber();\r
+ html.push(\r
+ '<td class="cke_dark_background cke_centered" style="vertical-align: middle;">' +\r
+ '<a href="javascript:void(0)" role="option"',\r
+ ' aria-posinset="' + ( i +1 ) + '"',\r
+ ' aria-setsize="' + size + '"',\r
+ ' aria-labelledby="' + smileyLabelId + '"',\r
+ ' class="cke_smile cke_hand" tabindex="-1" onkeydown="CKEDITOR.tools.callFunction( ', onKeydown, ', event, this );">',\r
+ '<img class="cke_hand" title="', config.smiley_descriptions[i], '"' +\r
+ ' cke_src="', CKEDITOR.tools.htmlEncode( config.smiley_path + images[ i ] ), '" alt="', config.smiley_descriptions[i], '"',\r
+ ' src="', CKEDITOR.tools.htmlEncode( config.smiley_path + images[ i ] ), '"',\r
+ // IE BUG: Below is a workaround to an IE image loading bug to ensure the image sizes are correct.\r
+ ( CKEDITOR.env.ie ? ' onload="this.setAttribute(\'width\', 2); this.removeAttribute(\'width\');" ' : '' ),\r
+ '>' +\r
+ '<span id="' + smileyLabelId + '" class="cke_voice_label">' +config.smiley_descriptions[ i ] + '</span>' +\r
+ '</a>',\r
+ '</td>' );\r
+\r
+ if ( i % columns == columns - 1 )\r
+ html.push( '</tr>' );\r
+ }\r
+\r
+ if ( i < columns - 1 )\r
+ {\r
+ for ( ; i < columns - 1 ; i++ )\r
+ html.push( '<td></td>' );\r
+ html.push( '</tr>' );\r
+ }\r
+\r
+ html.push( '</tbody></table></div>' );\r
+\r
+ var smileySelector =\r
+ {\r
+ type : 'html',\r
+ html : html.join( '' ),\r
+ onLoad : function( event )\r
+ {\r
+ dialog = event.sender;\r
+ },\r
+ focus : function()\r
+ {\r
+ var self = this;\r
+ // IE need a while to move the focus (#6539).\r
+ setTimeout( function ()\r
+ {\r
+ var firstSmile = self.getElement().getElementsByTag( 'a' ).getItem( 0 );\r
+ firstSmile.focus();\r
+ }, 0 );\r
+ },\r
+ onClick : onClick,\r
+ style : 'width: 100%; border-collapse: separate;'\r
+ };\r
+\r
+ return {\r
+ title : editor.lang.smiley.title,\r
+ minWidth : 270,\r
+ minHeight : 120,\r
+ contents : [\r
+ {\r
+ id : 'tab1',\r
+ label : '',\r
+ title : '',\r
+ expand : true,\r
+ padding : 0,\r
+ elements : [\r
+ smileySelector\r
+ ]\r
+ }\r
+ ],\r
+ buttons : [ CKEDITOR.dialog.cancelButton ]\r
+ };\r
+} );\r