Changeset 7017
- Timestamp:
- 06/07/11 19:55:48 (2 years ago)
- Location:
- CKEditor/branches/features/v4-panel/_source
- Files:
-
- 8 edited
-
plugins/colorbutton/plugin.js (modified) (2 diffs)
-
plugins/floatpanel/plugin.js (modified) (6 diffs)
-
plugins/menu/plugin.js (modified) (2 diffs)
-
plugins/panel/plugin.js (modified) (2 diffs)
-
skins/kama/menu.css (modified) (1 diff)
-
skins/kama/panel.css (modified) (16 diffs)
-
skins/kama/reset.css (modified) (1 diff)
-
skins/kama/skin.js (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
CKEditor/branches/features/v4-panel/_source/plugins/colorbutton/plugin.js
r6985 r7017 154 154 ' href="javascript:void(\'', lang.auto, '\')"' + 155 155 ' role="option" aria-posinset="1" aria-setsize="', total, '">' + 156 '<table role="presentation" cellspacing=0 cellpadding=0 width="100%">' +156 '<table role="presentation" cellspacing=0 cellpadding=0 style="width:100%">' + 157 157 '<tr>' + 158 158 '<td>' + 159 159 '<span class="cke_colorbox" id="', colorBoxId, '"></span>' + 160 160 '</td>' + 161 '<td colspan=7 align=center>',161 '<td colspan=7 style="text-align:center">', 162 162 lang.auto, 163 163 '</td>' + … … 207 207 ' onclick="CKEDITOR.tools.callFunction(', clickFn, ',\'?\',\'', type, '\');return false;"' + 208 208 ' href="javascript:void(\'', lang.more, '\')"', 209 ' style="text-align:center"', 209 210 ' role="option" aria-posinset="', total, '" aria-setsize="', total, '">', 210 211 lang.more, -
CKEditor/branches/features/v4-panel/_source/plugins/floatpanel/plugin.js
r6985 r7017 37 37 } 38 38 39 function getClickOutsidePanel( opener ) 40 { 41 return function( ev ) 42 { 43 var target = ev.data.getTarget(); 44 if ( !( this.element.contains( target ) ) ) 45 { 46 // Bypass when opener is clicked (close panel). 47 if ( opener && ( opener.equals( target ) || opener.contains( target ) ) ) 48 return; 49 50 // Bypass all opened child panels. 51 var panel = this; 52 while( panel = panel._.activeChild ) 53 { 54 if ( panel.element.contains( target ) ) 55 return; 56 } 57 58 // Panel close is caused by user's navigating away the focus, e.g. click outside the panel. 59 // DO NOT restore focus in this case. 60 delete this._.returnFocus; 61 this.hide(); 62 } 63 }; 64 } 65 39 66 CKEDITOR.ui.floatPanel = CKEDITOR.tools.createClass( 40 67 { 41 68 $ : function( editor, parentElement, definition, level ) 42 69 { 43 definition.forceIFrame = 1;70 var panelIframe = definition.forceIFrame || editor.config.panelUseIFrame !== false; 44 71 45 72 var doc = parentElement.getDocument(), 46 73 panel = getPanel( editor, doc, parentElement, definition, level || 0 ), 47 74 element = panel.element, 48 iframe = element.getFirst().getFirst();75 iframe = panelIframe ? element.getFirst().getFirst() : null; 49 76 50 77 this.element = element; … … 144 171 145 172 // Configure the IFrame blur event. Do that only once. 146 if ( !this._.blurSet ) 147 { 148 // Non IE prefer the event into a window object. 149 var focused = CKEDITOR.env.ie ? iframe : new CKEDITOR.dom.window( iframe.$.contentWindow ); 150 151 // With addEventListener compatible browsers, we must 152 // useCapture when registering the focus/blur events to 153 // guarantee they will be firing in all situations. (#3068, #3222 ) 154 CKEDITOR.event.useCapture = true; 155 156 focused.on( 'blur', function( ev ) 157 { 158 if ( !this.allowBlur() ) 159 return; 160 161 // As we are using capture to register the listener, 162 // the blur event may get fired even when focusing 163 // inside the window itself, so we must ensure the 164 // target is out of it. 165 var target; 166 if ( CKEDITOR.env.ie && !this.allowBlur() 167 || ( target = ev.data.getTarget() ) 168 && target.getName && target.getName() != 'iframe' ) 169 return; 170 171 if ( this.visible && !this._.activeChild && !isShowing ) 173 if ( iframe ) 174 { 175 if ( !this._.blurSet ) 176 { 177 // Non IE prefer the event into a window object. 178 var focused = CKEDITOR.env.ie ? iframe : new CKEDITOR.dom.window( iframe.$.contentWindow ); 179 180 // With addEventListener compatible browsers, we must 181 // useCapture when registering the focus/blur events to 182 // guarantee they will be firing in all situations. (#3068, #3222 ) 183 CKEDITOR.event.useCapture = true; 184 185 focused.on( 'blur', function( ev ) 172 186 { 173 // Panel close is caused by user's navigating away the focus, e.g. click outside the panel. 174 // DO NOT restore focus in this case. 175 delete this._.returnFocus; 176 this.hide(); 177 } 178 }, 179 this ); 180 181 focused.on( 'focus', function() 182 { 183 this._.focused = true; 184 this.hideChild(); 185 this.allowBlur( true ); 186 }, 187 this ); 188 189 CKEDITOR.event.useCapture = false; 190 191 this._.blurSet = 1; 187 if ( !this.allowBlur() ) 188 return; 189 190 // As we are using capture to register the listener, 191 // the blur event may get fired even when focusing 192 // inside the window itself, so we must ensure the 193 // target is out of it. 194 var target; 195 if ( CKEDITOR.env.ie && !this.allowBlur() 196 || ( target = ev.data.getTarget() ) 197 && target.getName && target.getName() != 'iframe' ) 198 return; 199 200 if ( this.visible && !this._.activeChild && !isShowing ) 201 { 202 // Panel close is caused by user's navigating away the focus, e.g. click outside the panel. 203 // DO NOT restore focus in this case. 204 delete this._.returnFocus; 205 this.hide(); 206 } 207 }, 208 this ); 209 210 focused.on( 'focus', function() 211 { 212 this._.focused = true; 213 this.hideChild(); 214 this.allowBlur( true ); 215 }, 216 this ); 217 218 CKEDITOR.event.useCapture = false; 219 220 this._.blurSet = 1; 221 } 222 } 223 else 224 { 225 // Close on clicking outside of panel or doc blurs. 226 this._.clickOutside = getClickOutsidePanel( offsetParent ); 227 CKEDITOR.document.on( 'mousedown', this._.clickOutside, this ); 228 ( CKEDITOR.env.ie ? new CKEDITOR.dom.window( window ) : CKEDITOR.document )[ 'on' ]( 'blur', this.hide, this ); 192 229 } 193 230 … … 231 268 target.setStyle( 'width', width + 'px' ); 232 269 233 // IE doesn't compute the scrollWidth if a filter is applied previously234 block.element.addClass( 'cke_frameLoaded' );235 236 270 var height = block.element.$.scrollHeight; 237 271 … … 307 341 } , this ); 308 342 309 panel.isLoaded ? panelLoad() : panel.onLoad = panelLoad;343 !iframe || panel.isLoaded ? panelLoad() : panel.onLoad = panelLoad; 310 344 311 345 // Set the panel frame focus, so the blur event gets fired. 312 346 CKEDITOR.tools.setTimeout( function() 313 347 { 314 iframe .$.contentWindow.focus();348 iframe ? iframe.$.contentWindow.focus() : element.focus(); 315 349 // We need this get fired manually because of unfired focus() function. 316 350 this.allowBlur( true ); … … 329 363 if ( this.visible && ( !this.onHide || this.onHide.call( this ) !== true ) ) 330 364 { 365 if ( this._.iframe ) 366 // Blur previously focused element in panel frame. (#6671) 367 CKEDITOR.env.gecko && this._.iframe.getFrameDocument().$.activeElement.blur(); 368 else 369 { 370 CKEDITOR.document.removeListener( 'mousedown', this._.clickOutside ); 371 delete this._.clickOutside; 372 ( CKEDITOR.env.ie ? new CKEDITOR.dom.window( window ) : CKEDITOR.document ).removeListener( 'blur', this.hide ); 373 } 374 331 375 this.hideChild(); 332 // Blur previously focused element. (#6671)333 CKEDITOR.env.gecko && this._.iframe.getFrameDocument().$.activeElement.blur();334 376 this.element.setStyle( 'display', 'none' ); 335 377 this.visible = 0; … … 429 471 } ); 430 472 })(); 473 474 475 /** 476 * Whether renders the float panel in an iframe, which makes it easier to style the panel content 477 * from editor's content style sheet assigned by {@link CKEDITOR.config.contentCss}. 478 * @name CKEDITOR.config.panelUseIFrame 479 * @type Boolean 480 * @default true 481 * @example 482 * config.panelUseIFrame = false; 483 */ -
CKEditor/branches/features/v4-panel/_source/plugins/menu/plugin.js
r6985 r7017 196 196 197 197 // Get the element representing the current item. 198 var element = this._.panel.getBlock( this.id ).element.getDocument().getById( this.id + String( index ) );198 var element = this._.panel.getBlock( this.id ).element.getDocument().getById( this.id + '_item_' + String( index ) ); 199 199 200 200 // Show the submenu. … … 399 399 render : function( menu, index, output ) 400 400 { 401 var id = menu.id + String( index ),401 var id = menu.id + '_item_' + String( index ), 402 402 state = ( typeof this.state == 'undefined' ) ? CKEDITOR.TRISTATE_OFF : this.state; 403 403 -
CKEditor/branches/features/v4-panel/_source/plugins/panel/plugin.js
r6904 r7017 94 94 '">' ); 95 95 96 if ( this.forceIFrame || this.css.length)96 if ( this.forceIFrame ) 97 97 { 98 98 output.push( … … 123 123 }, 124 124 125 getHolderElement : function() 126 { 127 var holder = this._.holder; 128 129 if ( !holder ) 130 { 131 if ( this.forceIFrame || this.css.length ) 125 getHolderElement : ( function() 126 { 127 function keyHandler( evt ) 128 { 129 var keystroke = evt.data.getKeystroke(), 130 dir = this.document.getById( this.id ).getAttribute( 'dir' ); 131 132 // Delegate key processing to block. 133 if ( this._.onKeyDown && this._.onKeyDown( keystroke ) === false ) 132 134 { 133 var iframe = this.document.getById( this.id + '_frame' ), 134 parentDiv = iframe.getParent(), 135 dir = parentDiv.getAttribute( 'dir' ), 136 className = parentDiv.getParent().getAttribute( 'class' ), 137 langCode = parentDiv.getParent().getAttribute( 'lang' ), 138 doc = iframe.getFrameDocument(); 139 140 var onLoad = CKEDITOR.tools.addFunction( CKEDITOR.tools.bind( function( ev ) 141 { 142 this.isLoaded = true; 143 if ( this.onLoad ) 144 this.onLoad(); 145 }, this ) ); 146 147 var data = 148 '<!DOCTYPE html>' + 149 '<html dir="' + dir + '" class="' + className + '_container" lang="' + langCode + '">' + 150 '<head>' + 151 '<style>.' + className + '_container{visibility:hidden}</style>' + 152 '</head>' + 153 '<body class="cke_' + dir + ' cke_panel_frame ' + CKEDITOR.env.cssClass + '" style="margin:0;padding:0"' + 154 ' onload="( window.CKEDITOR || window.parent.CKEDITOR ).tools.callFunction(' + onLoad + ');"></body>' + 155 // It looks strange, but for FF2, the styles must go 156 // after <body>, so it (body) becames immediatelly 157 // available. (#3031) 158 CKEDITOR.tools.buildStyleHtml( this.css ) + 159 '<\/html>'; 160 161 doc.write( data ); 162 163 var win = doc.getWindow(); 164 165 // Register the CKEDITOR global. 166 win.$.CKEDITOR = CKEDITOR; 135 evt.data.preventDefault(); 136 return; 137 } 138 139 // ESC/ARROW-LEFT(ltr) OR ARROW-RIGHT(rtl) 140 if ( keystroke == 27 || keystroke == ( dir == 'rtl' ? 39 : 37 ) ) 141 { 142 if ( this.onEscape && this.onEscape( keystroke ) === false ) 143 evt.data.preventDefault(); 144 } 145 } 146 147 return function() 148 { 149 var holder = this._.holder, target; 150 151 if ( !holder ) 152 { 153 if ( this.forceIFrame ) 154 { 155 var iframe = this.document.getById( this.id + '_frame' ), 156 parentDiv = iframe.getParent(), 157 dir = parentDiv.getAttribute( 'dir' ), 158 className = parentDiv.getParent().getAttribute( 'class' ), 159 langCode = parentDiv.getParent().getAttribute( 'lang' ), 160 doc = iframe.getFrameDocument(); 161 162 var onLoad = CKEDITOR.tools.addFunction( CKEDITOR.tools.bind( function( ev ) 163 { 164 this.isLoaded = true; 165 if ( this.onLoad ) 166 this.onLoad(); 167 }, this ) ); 168 169 var data = 170 '<!DOCTYPE html>' + 171 '<html dir="' + dir + '" class="' + className + '" lang="' + langCode + '">' + 172 '<head>' + 173 '<style>.' + className + '_container{visibility:hidden}</style>' + 174 '</head>' + 175 '<body class="cke_' + dir + ' cke_panel_frame ' + CKEDITOR.env.cssClass + '" style="margin:0;padding:0"' + 176 ' onload="( window.CKEDITOR || window.parent.CKEDITOR ).tools.callFunction(' + onLoad + ');"></body>' + 177 // It looks strange, but for FF2, the styles must go 178 // after <body>, so it (body) becames immediatelly 179 // available. (#3031) 180 CKEDITOR.tools.buildStyleHtml( this.css ) + 181 '<\/html>'; 182 183 doc.write( data ); 184 185 var win = doc.getWindow(); 186 187 // Register the CKEDITOR global. 188 win.$.CKEDITOR = CKEDITOR; 189 190 191 target = doc; 192 holder = doc.getBody(); 193 holder.unselectable(); 194 CKEDITOR.env.air && CKEDITOR.tools.callFunction( onLoad ); 195 } 196 else 197 { 198 holder = this.document.getById( this.id ); 199 target = this.element; 200 } 167 201 168 202 // Arrow keys for scrolling is only preventable with 'keypress' event in Opera (#4534). 169 doc.on( 'key' + ( CKEDITOR.env.opera? 'press':'down' ), function( evt ) 170 { 171 var keystroke = evt.data.getKeystroke(), 172 dir = this.document.getById( this.id ).getAttribute( 'dir' ); 173 174 // Delegate key processing to block. 175 if ( this._.onKeyDown && this._.onKeyDown( keystroke ) === false ) 176 { 177 evt.data.preventDefault(); 178 return; 179 } 180 181 // ESC/ARROW-LEFT(ltr) OR ARROW-RIGHT(rtl) 182 if ( keystroke == 27 || keystroke == ( dir == 'rtl' ? 39 : 37 ) ) 183 { 184 if ( this.onEscape && this.onEscape( keystroke ) === false ) 185 evt.data.preventDefault(); 186 } 187 }, 188 this ); 189 190 holder = doc.getBody(); 191 holder.unselectable(); 192 CKEDITOR.env.air && CKEDITOR.tools.callFunction( onLoad ); 203 target.on( 'key' + ( CKEDITOR.env.opera ? 'press' : 'down' ), keyHandler, this ); 204 this._.holder = holder; 193 205 } 194 else 195 holder = this.document.getById( this.id ); 196 197 this._.holder = holder; 198 } 199 200 return holder; 201 }, 206 207 return holder; 208 }; 209 } )(), 202 210 203 211 addBlock : function( name, block ) -
CKEditor/branches/features/v4-panel/_source/skins/kama/menu.css
r6434 r7017 130 130 margin-left: 24px; 131 131 background-color: #fff; 132 }133 /* Set these after the document has been loaded and we know the dimensions*/134 .cke_skin_kama .cke_frameLoaded .cke_menuitem .cke_label135 {136 filter: alpha(opacity=70); /* IE */137 opacity: 0.70; /* Safari, Opera and Mozilla */138 132 } 139 133 -
CKEditor/branches/features/v4-panel/_source/skins/kama/panel.css
r6348 r7017 39 39 */ 40 40 41 html.cke_skin_kama _container41 html.cke_skin_kama 42 42 { 43 43 overflow: auto; … … 55 55 } 56 56 57 ul.cke_panel_list57 .cke_skin_kama ul.cke_panel_list 58 58 { 59 59 list-style-type: none; … … 63 63 } 64 64 65 li.cke_panel_listItem 66 { 67 margin: 0px; 68 } 69 70 .cke_panel_listItem a 65 .cke_skin_kama .cke_panel_listItem a 71 66 { 72 67 padding: 2px; … … 79 74 } 80 75 76 .cke_skin_kama .cke_panel_listItem a * 77 { 78 cursor: pointer; 79 } 80 81 81 /* IE6 */ 82 82 * html .cke_panel_listItem a … … 95 95 } 96 96 97 .cke_ panel_listItem.cke_selected a97 .cke_skin_kama .cke_panel_listItem.cke_selected a 98 98 { 99 99 border: 1px solid #ccc; … … 101 101 } 102 102 103 .cke_ panel_listItem a:hover,104 .cke_ panel_listItem a:focus,105 .cke_ panel_listItem a:active103 .cke_skin_kama .cke_panel_listItem a:hover, 104 .cke_skin_kama .cke_panel_listItem a:focus, 105 .cke_skin_kama .cke_panel_listItem a:active 106 106 { 107 107 border-color: #316ac5; … … 109 109 } 110 110 111 .cke_ hc .cke_panel_listItem.cke_selected a,112 .cke_ hc .cke_panel_listItem a:hover,113 .cke_ hc .cke_panel_listItem a:focus,114 .cke_ hc .cke_panel_listItem a:active111 .cke_skin_kama .cke_hc .cke_panel_listItem.cke_selected a, 112 .cke_skin_kama .cke_hc .cke_panel_listItem a:hover, 113 .cke_skin_kama .cke_hc .cke_panel_listItem a:focus, 114 .cke_skin_kama .cke_hc .cke_panel_listItem a:active 115 115 { 116 116 border-width: 3px; … … 118 118 } 119 119 120 .cke_ panel_grouptitle120 .cke_skin_kama .cke_panel_block .cke_panel_grouptitle 121 121 { 122 122 font-size: 11px; … … 130 130 } 131 131 132 .cke_ panel_listItem p,133 .cke_ panel_listItem h1,134 .cke_ panel_listItem h2,135 .cke_ panel_listItem h3,136 .cke_ panel_listItem h4,137 .cke_ panel_listItem h5,138 .cke_ panel_listItem h6,139 .cke_ panel_listItem pre132 .cke_skin_kama .cke_panel_listItem p, 133 .cke_skin_kama .cke_panel_listItem h1, 134 .cke_skin_kama .cke_panel_listItem h2, 135 .cke_skin_kama .cke_panel_listItem h3, 136 .cke_skin_kama .cke_panel_listItem h4, 137 .cke_skin_kama .cke_panel_listItem h5, 138 .cke_skin_kama .cke_panel_listItem h6, 139 .cke_skin_kama .cke_panel_listItem pre 140 140 { 141 141 margin-top: 3px; … … 150 150 } 151 151 152 .cke_ colorblock152 .cke_skin_kama .cke_colorblock 153 153 { 154 154 padding: 3px; … … 157 157 } 158 158 159 .cke_ colorblock,160 .cke_ colorblock a159 .cke_skin_kama .cke_colorblock, 160 .cke_skin_kama .cke_colorblock a 161 161 { 162 162 text-decoration: none; … … 164 164 } 165 165 166 span.cke_colorbox166 .cke_skin_kama span.cke_colorbox 167 167 { 168 168 width: 10px; … … 172 172 } 173 173 174 .cke_ rtl span.cke_colorbox174 .cke_skin_kama .cke_rtl span.cke_colorbox 175 175 { 176 176 float: right; 177 177 } 178 178 179 a.cke_colorbox179 .cke_skin_kama a.cke_colorbox 180 180 { 181 181 border: #fff 1px solid; … … 184 184 } 185 185 186 .cke_ rtl a.cke_colorbox186 .cke_skin_kama .cke_rtl a.cke_colorbox 187 187 { 188 188 float: right; 189 189 } 190 190 191 a:hover.cke_colorbox,192 a:focus.cke_colorbox,193 a:active.cke_colorbox191 .cke_skin_kama a:hover.cke_colorbox, 192 .cke_skin_kama a:focus.cke_colorbox, 193 .cke_skin_kama a:active.cke_colorbox 194 194 { 195 195 border: #316ac5 1px solid; … … 197 197 } 198 198 199 a.cke_colorauto,200 a.cke_colormore199 .cke_skin_kama a.cke_colorauto, 200 .cke_skin_kama a.cke_colormore 201 201 { 202 202 border: #fff 1px solid; … … 206 206 } 207 207 208 a:hover.cke_colorauto,209 a:hover.cke_colormore,210 a:focus.cke_colorauto,211 a:focus.cke_colormore,212 a:active.cke_colorauto,213 a:active.cke_colormore208 .cke_skin_kama a:hover.cke_colorauto, 209 .cke_skin_kama a:hover.cke_colormore, 210 .cke_skin_kama a:focus.cke_colorauto, 211 .cke_skin_kama a:focus.cke_colormore, 212 .cke_skin_kama a:active.cke_colorauto, 213 .cke_skin_kama a:active.cke_colormore 214 214 { 215 215 border: #316ac5 1px solid; -
CKEditor/branches/features/v4-panel/_source/skins/kama/reset.css
r6348 r7017 32 32 } 33 33 34 .cke_skin_kama h1 35 { 36 font-size: 1.8em; 37 } 38 .cke_skin_kama h2 39 { 40 font-size: 1.6em; 41 } 42 .cke_skin_kama h3 43 { 44 font-size: 1.4em; 45 } 46 .cke_skin_kama h4 47 { 48 font-size: 1.2em; 49 } 50 .cke_skin_kama h5 51 { 52 font-size: 1em; 53 } 54 .cke_skin_kama h6 55 { 56 font-size: 0.8em; 57 } 58 59 .cke_skin_kama h1, 60 .cke_skin_kama h2, 61 .cke_skin_kama h3, 62 .cke_skin_kama h4, 63 .cke_skin_kama h5, 64 .cke_skin_kama h6 65 { 66 font-weight: bolder; 67 } 68 69 .cke_skin_kama pre, 70 .cke_skin_kama code, 71 .cke_skin_kama kbd, 72 .cke_skin_kama samp, 73 .cke_skin_kama tt 74 { 75 font-family: monospace; 76 } 77 78 .cke_skin_kama address, 79 .cke_skin_kama cite, 80 .cke_skin_kama var 81 { 82 font-style: italic; 83 } 84 85 .cke_skin_kama ins 86 { 87 text-decoration: underline; 88 } 89 90 .cke_skin_kama del 91 { 92 text-decoration: line-through; 93 } 94 95 .cke_skin_kama big 96 { 97 font-size: 15px; 98 } 99 .cke_skin_kama small 100 { 101 font-size: 10px; 102 } 103 104 105 cke_skin_kama 34 106 .cke_skin_kama .cke_rtl *, 35 107 .cke_skin_kama .cke_rtl a:hover, -
CKEditor/branches/features/v4-panel/_source/skins/kama/skin.js
r6904 r7017 1 /*1 /* 2 2 Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved. 3 3 For licensing, see LICENSE.html or http://ckeditor.com/license … … 174 174 { 175 175 var panel = event.data[ 0 ]; 176 var iframe = panel.element.getElementsByTag( 'iframe' ).getItem( 0 ).getFrameDocument(); 177 178 // Add stylesheet if missing. 179 if ( !iframe.getById( 'cke_ui_color' ) ) 180 { 181 var node = getStylesheet( iframe ); 182 uiColorMenus.push( node ); 183 184 var color = editor.getUiColor(); 185 // Set uiColor for new menu. 186 if ( color ) 187 updateStylesheets( [ node ], uiColorMenuCss, [ [ uiColorRegexp, color ] ] ); 176 var panelFrame = panel._iframe; 177 if ( panelFrame ) 178 { 179 var frameDoc = this._.iframe.getFrameDocument(); 180 // Add stylesheet if missing. 181 if ( !frameDoc.getById( 'cke_ui_color' ) ) 182 { 183 var node = getStylesheet( frameDoc ); 184 uiColorMenus.push( node ); 185 186 var color = editor.getUiColor(); 187 // Set uiColor for new menu. 188 if ( color ) 189 updateStylesheets( [ node ], uiColorMenuCss, [ [ uiColorRegexp, color ] ] ); 190 } 188 191 } 189 192 });
Note: See TracChangeset
for help on using the changeset viewer.
