Changeset 6694
- Timestamp:
- 01/31/2008 06:10:46 PM (17 years ago)
- Location:
- trunk
- Files:
-
- 26 added
- 36 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/wp-admin/js/post.js
r6675 r6694 179 179 jQuery('.categorychecklist :checkbox').change( syncChecks ).filter( ':checked' ).change(); 180 180 }); 181 182 wpEditorInit = function() { 183 // Activate tinyMCE if it's the user's default editor 184 if ( ( 'undefined' == typeof wpTinyMCEConfig ) || 'tinymce' == wpTinyMCEConfig.defaultEditor ) { 185 document.getElementById('editorcontainer').style.padding = '0px'; 186 tinyMCE.execCommand("mceAddControl", true, "content"); 187 } else { 188 var H; 189 if ( H = tinymce.util.Cookie.getHash("TinyMCE_content_size") ) 190 document.getElementById('content').style.height = H.ch - 30 + 'px'; 191 } 192 }; 193 194 switchEditors = { 195 196 saveCallback : function(el, content, body) { 197 198 document.getElementById(el).style.color = '#fff'; 199 if ( tinyMCE.activeEditor.isHidden() ) 200 content = document.getElementById(el).value; 201 else 202 content = this.pre_wpautop(content); 203 204 return content; 205 }, 206 207 pre_wpautop : function(content) { 208 // We have a TON of cleanup to do. 209 210 // content = content.replace(/\n|\r/g, ' '); 211 // Remove anonymous, empty paragraphs. 212 content = content.replace(new RegExp('<p>(\\s| |<br>)*</p>', 'mg'), ''); 213 214 // Mark </p> if it has any attributes. 215 content = content.replace(new RegExp('(<p[^>]+>.*?)</p>', 'mg'), '$1</p#>'); 216 217 // Get it ready for wpautop. 218 content = content.replace(new RegExp('\\s*<p>', 'mgi'), ''); 219 content = content.replace(new RegExp('\\s*</p>\\s*', 'mgi'), '\n\n'); 220 content = content.replace(new RegExp('\\n\\s*\\n', 'mgi'), '\n\n'); 221 content = content.replace(new RegExp('\\s*<br ?/?>\\s*', 'gi'), '\n'); 222 223 // Fix some block element newline issues 224 var blocklist = 'blockquote|ul|ol|li|table|thead|tr|th|td|div|h\\d|pre'; 225 content = content.replace(new RegExp('\\s*<(('+blocklist+') ?[^>]*)\\s*>', 'mg'), '\n<$1>'); 226 content = content.replace(new RegExp('\\s*</('+blocklist+')>\\s*', 'mg'), '</$1>\n'); 227 content = content.replace(new RegExp('<li>', 'g'), '\t<li>'); 228 229 if ( content.indexOf('<object') != -1 ) { 230 content = content.replace(new RegExp('\\s*<param([^>]*)>\\s*', 'g'), "<param$1>"); // no pee inside object/embed 231 content = content.replace(new RegExp('\\s*</embed>\\s*', 'g'), '</embed>'); 232 } 233 234 // Unmark special paragraph closing tags 235 content = content.replace(new RegExp('</p#>', 'g'), '</p>\n'); 236 content = content.replace(new RegExp('\\s*(<p[^>]+>.*</p>)', 'mg'), '\n$1'); 237 238 // Trim trailing whitespace 239 content = content.replace(new RegExp('\\s*$', ''), ''); 240 241 // Hope. 242 return content; 243 }, 244 245 go : function(id) { 246 var ed = tinyMCE.get(id); 247 var qt = document.getElementById('quicktags'); 248 var H = document.getElementById('edButtonHTML'); 249 var P = document.getElementById('edButtonPreview'); 250 var ta = document.getElementById(id); 251 var ec = document.getElementById('editorcontainer'); 252 253 if ( ! ed || ed.isHidden() ) { 254 ta.style.color = '#fff'; 255 256 this.edToggle(P, H); 257 edCloseAllTags(); // :-( 258 259 qt.style.display = 'none'; 260 ec.style.padding = '0px'; 261 262 ta.value = this.wpautop(ta.value); 263 264 if ( ed ) ed.show(); 265 else tinyMCE.execCommand("mceAddControl", false, id); 266 267 this.wpSetDefaultEditor( 'tinymce' ); 268 } else { 269 this.edToggle(H, P); 270 tinyMCE.triggerSave(); 271 ta.style.height = tinyMCE.activeEditor.contentAreaContainer.offsetHeight + 6 + 'px'; 272 273 if ( tinymce.isIE6 ) 274 ta.style.width = tinyMCE.activeEditor.contentAreaContainer.offsetWidth - 12 + 'px'; 275 276 ed.hide(); 277 ta.value = this.pre_wpautop(ta.value); 278 279 qt.style.display = 'block'; 280 ec.style.padding = '6px'; 281 ta.style.color = ''; 282 283 this.wpSetDefaultEditor( 'html' ); 284 } 285 }, 286 287 edToggle : function(A, B) { 288 A.className = 'active'; 289 B.className = ''; 290 291 B.onclick = A.onclick; 292 A.onclick = null; 293 }, 294 295 wpSetDefaultEditor : function( editor ) { 296 try { 297 editor = escape( editor.toString() ); 298 } catch(err) { 299 editor = 'tinymce'; 300 } 301 302 var userID = document.getElementById('user-id'); 303 var date = new Date(); 304 date.setTime(date.getTime()+(10*365*24*60*60*1000)); 305 document.cookie = "wordpress_editor_" + userID.value + "=" + editor + "; expires=" + date.toGMTString(); 306 }, 307 308 wpautop : function(pee) { 309 var blocklist = 'table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|address|math|p|h[1-6]'; 310 311 pee = pee + "\n\n"; 312 pee = pee.replace(new RegExp('<br />\\s*<br />', 'gi'), "\n\n"); 313 pee = pee.replace(new RegExp('(<(?:'+blocklist+')[^>]*>)', 'gi'), "\n$1"); 314 pee = pee.replace(new RegExp('(</(?:'+blocklist+')>)', 'gi'), "$1\n\n"); 315 pee = pee.replace(new RegExp("\\r\\n|\\r", 'g'), "\n"); 316 pee = pee.replace(new RegExp("\\n\\s*\\n+", 'g'), "\n\n"); 317 pee = pee.replace(new RegExp('([\\s\\S]+?)\\n\\n', 'mg'), "<p>$1</p>\n"); 318 pee = pee.replace(new RegExp('<p>\\s*?</p>', 'gi'), ''); 319 pee = pee.replace(new RegExp('<p>\\s*(</?(?:'+blocklist+')[^>]*>)\\s*</p>', 'gi'), "$1"); 320 pee = pee.replace(new RegExp("<p>(<li.+?)</p>", 'gi'), "$1"); 321 pee = pee.replace(new RegExp('<p><blockquote([^>]*)>', 'gi'), "<blockquote$1><p>"); 322 pee = pee.replace(new RegExp('</blockquote></p>', 'gi'), '</p></blockquote>'); 323 pee = pee.replace(new RegExp('<p>\\s*(</?(?:'+blocklist+')[^>]*>)', 'gi'), "$1"); 324 pee = pee.replace(new RegExp('(</?(?:'+blocklist+')[^>]*>)\\s*</p>', 'gi'), "$1"); 325 pee = pee.replace(new RegExp('\\s*\\n', 'gi'), "<br />\n"); 326 pee = pee.replace(new RegExp('(</?(?:'+blocklist+')[^>]*>)\\s*<br />', 'gi'), "$1"); 327 pee = pee.replace(new RegExp('<br />(\\s*</?(?:p|li|div|dl|dd|dt|th|pre|td|ul|ol)>)', 'gi'), '$1'); 328 pee = pee.replace(new RegExp('^((?: )*)\\s', 'mg'), '$1 '); 329 //pee = pee.replace(new RegExp('(<pre.*?>)(.*?)</pre>!ise', " stripslashes('$1') . stripslashes(clean_pre('$2')) . '</pre>' "); // Hmm... 330 return pee; 331 } 332 } -
trunk/wp-admin/wp-admin.css
r6638 r6694 371 371 } 372 372 373 #postdivrich #content { 374 padding: 5px; 375 line-height: 140%; 373 #editorcontainer #content { 374 padding: 0; 375 line-height: 150%; 376 border: 0 none; 377 } 378 379 #editorcontainer { 380 padding: 6px; 376 381 } 377 382 … … 395 400 396 401 #postdivrich #quicktags { 397 background: #f0f0ee; 398 padding: 0; 399 border: 1px solid #ccc; 400 border-bottom: none; 402 background: #cee1ef; 403 padding: 0; 404 border: 0 none; 401 405 } 402 406 … … 1179 1183 } 1180 1184 1181 #poststuff .postbox, #titlediv {1185 #poststuff .postbox, #titlediv, #poststuff .postarea { 1182 1186 margin-left: 20px; 1183 1187 border: 1px solid #ebebeb; … … 1189 1193 1190 1194 #poststuff .postarea { 1191 margin-left: 20px;1192 1195 margin-right: 8px; 1193 1196 } … … 1224 1227 #poststuff #edButtonPreview, #poststuff #edButtonHTML { 1225 1228 display: block; 1226 height: 18px;1229 height: 20px; 1227 1230 padding: 5px; 1228 1231 margin-right: 8px; … … 1236 1239 color: #333; 1237 1240 font-weight: bold; 1238 -moz-border-radius: 2px; 1241 -moz-border-radius-topright: 2px; 1242 -moz-border-radius-topleft: 2px; 1239 1243 } 1240 1244 -
trunk/wp-includes/general-template.php
r6682 r6694 929 929 $wp_default_editor = wp_default_editor(); 930 930 $active = " class='active'"; 931 $inactive = " onclick='switchEditors (\"$id\");'";931 $inactive = " onclick='switchEditors.go(\"$id\");'"; 932 932 933 933 if ( 'tinymce' == $wp_default_editor ) 934 934 add_filter('the_editor_content', 'wp_richedit_pre'); 935 935 936 // The following line moves the border so that the active button "attaches" to the toolbar. Only IE needs it. 937 ?> 938 936 // The following line moves the border so that the active button "attaches" to the toolbar. Only IE needs it. 937 ?> 938 <style type="text/css"> 939 939 #postdivrich table, #postdivrich #quicktags {border-top: none;} 940 940 #quicktags {border-bottom: none; padding-bottom: 2px; margin-bottom: -1px;} 941 941 </style> 942 942 943 <div id='editor-toolbar' style='display:none;'> 943 <div class='zerosize'><input accesskey='e' type='button' onclick='switchEditors ("<?php echo $id; ?>")' /></div>944 <div class='zerosize'><input accesskey='e' type='button' onclick='switchEditors.go("<?php echo $id; ?>")' /></div> 944 945 <a id='edButtonHTML'<?php echo 'html' == $wp_default_editor ? $active : $inactive; ?>><?php _e('HTML'); ?></a> 945 946 <a id='edButtonPreview'<?php echo 'tinymce' == $wp_default_editor ? $active : $inactive; ?>><?php _e('Visual'); ?></a> … … 974 975 <?php endif; // 'html' != $wp_default_editor 975 976 976 $the_editor = apply_filters('the_editor', "<div ><textarea class='' $rows cols='40' name='$id' tabindex='2' id='$id'>%s</textarea></div>\n");977 $the_editor = apply_filters('the_editor', "<div id='editorcontainer'><textarea class='' $rows cols='40' name='$id' tabindex='2' id='$id'>%s</textarea></div>\n"); 977 978 $the_editor_content = apply_filters('the_editor_content', $content); 978 979 … … 987 988 if ( typeof tinyMCE != 'undefined' ) { 988 989 // This code is meant to allow tabbing from Title to Post (TinyMCE). 989 if ( tinyMCE.isMSIE ) { 990 document.getElementById('<?php echo $prev_id; ?>').onkeydown = function (e) { 991 if ( tinyMCE.idCounter == 0 ) 992 return true; 993 e = e ? e : window.event; 994 if (e.keyCode == 9 && !e.shiftKey && !e.controlKey && !e.altKey) { 995 var i = tinyMCE.getInstanceById('<?php echo $id; ?>'); 996 if(typeof i == 'undefined') 997 return true; 998 tinyMCE.execCommand("mceStartTyping"); 999 this.blur(); 1000 i.contentWindow.focus(); 1001 e.returnValue = false; 1002 return false; 1003 } 1004 } 1005 } else { 1006 document.getElementById('<?php echo $prev_id; ?>').onkeypress = function (e) { 1007 if ( tinyMCE.idCounter == 0 ) 1008 return true; 1009 e = e ? e : window.event; 1010 if (e.keyCode == 9 && !e.shiftKey && !e.controlKey && !e.altKey) { 1011 var i = tinyMCE.getInstanceById('<?php echo $id; ?>'); 1012 if(typeof i == 'undefined') 1013 return true; 1014 tinyMCE.execCommand("mceStartTyping"); 1015 this.blur(); 1016 i.contentWindow.focus(); 1017 e.returnValue = false; 1018 return false; 1019 } 1020 } 1021 } 990 document.getElementById('<?php echo $prev_id; ?>').onkeydown = function (e) { 991 e = e || window.event; 992 if (e.keyCode == 9 && !e.shiftKey && !e.controlKey && !e.altKey) { 993 if ( tinyMCE.activeEditor ) { 994 e = null; 995 if ( tinyMCE.activeEditor.isHidden() ) return true; 996 tinyMCE.activeEditor.focus(); 997 return false; 998 } 999 return true; 1000 } 1001 } 1022 1002 } 1023 1003 <?php endif; ?> -
trunk/wp-includes/js/autosave.js
r6649 r6694 83 83 84 84 function autosave() { 85 var rich = ( (typeof tinyMCE != "undefined") && tinyMCE.getInstanceById('content')) ? true : false;85 var rich = ( (typeof tinyMCE != "undefined") && tinyMCE.activeEditor && ! tinyMCE.activeEditor.isHidden() ) ? true : false; 86 86 var post_data = { 87 87 action: "autosave", … … 94 94 95 95 /* Gotta do this up here so we can check the length when tinyMCE is in use */ 96 if ( typeof tinyMCE == "undefined" || tinyMCE.configs.length < 1 || rich == false ) { 97 post_data["content"] = jQuery("#content").val(); 98 } else { 96 if ( rich ) { 99 97 // Don't run while the TinyMCE spellcheck is on. 100 if(tinyMCE.selectedInstance.spellcheckerOn) return; 101 tinyMCE.wpTriggerSave(); 102 post_data["content"] = jQuery("#content").val(); 103 } 98 if ( tinyMCE.activeEditor.plugins.spellchecker && tinyMCE.activeEditor.plugins.spellchecker.active ) return; 99 tinyMCE.triggerSave(); 100 } 101 102 post_data["content"] = jQuery("#content").val(); 104 103 105 104 if(post_data["post_title"].length==0 || post_data["content"].length==0 || post_data["post_title"] + post_data["content"] == autosaveLast) { … … 123 122 post_data["excerpt"] = jQuery("#excerpt").val(); 124 123 125 if ( typeof tinyMCE == "undefined" || tinyMCE.configs.length < 1 || rich == false ) { 126 post_data["content"] = jQuery("#content").val(); 127 } else { 128 tinyMCE.wpTriggerSave(); 129 post_data["content"] = jQuery("#content").val(); 130 } 124 if ( rich ) 125 tinyMCE.triggerSave(); 126 127 post_data["content"] = jQuery("#content").val(); 131 128 132 129 if(parseInt(post_data["post_ID"]) < 1) { -
trunk/wp-includes/js/tinymce/plugins/autosave/editor_plugin.js
r6632 r6694 1 /** 2 * $Id$ 3 * 4 * @author Moxiecode 5 * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved. 6 */ 7 8 (function() { 9 tinymce.create('tinymce.plugins.AutoSavePlugin', { 10 init : function(ed, url) { 11 var t = this; 12 13 t.editor = ed; 14 15 window.onbeforeunload = tinymce.plugins.AutoSavePlugin._beforeUnloadHandler; 16 }, 17 18 getInfo : function() { 19 return { 20 longname : 'Auto save', 21 author : 'Moxiecode Systems AB', 22 authorurl : 'http://tinymce.moxiecode.com', 23 infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autosave', 24 version : tinymce.majorVersion + "." + tinymce.minorVersion 25 }; 26 }, 27 28 // Private plugin internal methods 29 30 'static' : { 31 _beforeUnloadHandler : function() { 32 var msg; 33 34 tinymce.each(tinyMCE.editors, function(ed) { 35 if (ed.getParam("fullscreen_is_enabled")) 36 return; 37 38 if (ed.isDirty()) { 39 msg = ed.getLang("autosave.unload_msg"); 40 return false; 41 } 42 }); 43 44 return msg; 45 } 46 } 47 }); 48 49 // Register plugin 50 tinymce.PluginManager.add('autosave', tinymce.plugins.AutoSavePlugin); 51 })(); 1 (function(){tinymce.create('tinymce.plugins.AutoSavePlugin',{init:function(ed,url){var t=this;t.editor=ed;window.onbeforeunload=tinymce.plugins.AutoSavePlugin._beforeUnloadHandler;},getInfo:function(){return{longname:'Auto save',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autosave',version:tinymce.majorVersion+"."+tinymce.minorVersion};},'static':{_beforeUnloadHandler:function(){var msg;tinymce.each(tinyMCE.editors,function(ed){if(ed.getParam("fullscreen_is_enabled"))return;if(ed.isDirty()){msg=ed.getLang("autosave.unload_msg");return false;}});return msg;}}});tinymce.PluginManager.add('autosave',tinymce.plugins.AutoSavePlugin);})(); -
trunk/wp-includes/js/tinymce/plugins/directionality/editor_plugin.js
r6632 r6694 1 /** 2 * $Id: editor_plugin_src.js 520 2008-01-07 16:30:32Z spocke $ 3 * 4 * @author Moxiecode 5 * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved. 6 */ 7 8 (function() { 9 tinymce.create('tinymce.plugins.Directionality', { 10 init : function(ed, url) { 11 var t = this; 12 13 t.editor = ed; 14 15 ed.addCommand('mceDirectionLTR', function() { 16 var e = ed.dom.getParent(ed.selection.getNode(), ed.dom.isBlock); 17 18 if (e) { 19 if (ed.dom.getAttrib(e, "dir") != "ltr") 20 ed.dom.setAttrib(e, "dir", "ltr"); 21 else 22 ed.dom.setAttrib(e, "dir", ""); 23 } 24 25 ed.nodeChanged(); 26 }); 27 28 ed.addCommand('mceDirectionRTL', function() { 29 var e = ed.dom.getParent(ed.selection.getNode(), ed.dom.isBlock); 30 31 if (e) { 32 if (ed.dom.getAttrib(e, "dir") != "rtl") 33 ed.dom.setAttrib(e, "dir", "rtl"); 34 else 35 ed.dom.setAttrib(e, "dir", ""); 36 } 37 38 ed.nodeChanged(); 39 }); 40 41 ed.addButton('ltr', {title : 'directionality.ltr_desc', cmd : 'mceDirectionLTR'}); 42 ed.addButton('rtl', {title : 'directionality.rtl_desc', cmd : 'mceDirectionRTL'}); 43 44 ed.onNodeChange.add(t._nodeChange, t); 45 }, 46 47 getInfo : function() { 48 return { 49 longname : 'Directionality', 50 author : 'Moxiecode Systems AB', 51 authorurl : 'http://tinymce.moxiecode.com', 52 infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/directionality', 53 version : tinymce.majorVersion + "." + tinymce.minorVersion 54 }; 55 }, 56 57 // Private methods 58 59 _nodeChange : function(ed, cm, n) { 60 var dom = ed.dom, dir; 61 62 n = dom.getParent(n, dom.isBlock); 63 if (!n) { 64 cm.setDisabled('ltr', 1); 65 cm.setDisabled('rtl', 1); 66 return; 67 } 68 69 dir = dom.getAttrib(n, 'dir'); 70 cm.setActive('ltr', dir == "ltr"); 71 cm.setDisabled('ltr', 0); 72 cm.setActive('rtl', dir == "rtl"); 73 cm.setDisabled('rtl', 0); 74 } 75 }); 76 77 // Register plugin 78 tinymce.PluginManager.add('directionality', tinymce.plugins.Directionality); 79 })(); 1 (function(){tinymce.create('tinymce.plugins.Directionality',{init:function(ed,url){var t=this;t.editor=ed;ed.addCommand('mceDirectionLTR',function(){var e=ed.dom.getParent(ed.selection.getNode(),ed.dom.isBlock);if(e){if(ed.dom.getAttrib(e,"dir")!="ltr")ed.dom.setAttrib(e,"dir","ltr");else ed.dom.setAttrib(e,"dir","");}ed.nodeChanged();});ed.addCommand('mceDirectionRTL',function(){var e=ed.dom.getParent(ed.selection.getNode(),ed.dom.isBlock);if(e){if(ed.dom.getAttrib(e,"dir")!="rtl")ed.dom.setAttrib(e,"dir","rtl");else ed.dom.setAttrib(e,"dir","");}ed.nodeChanged();});ed.addButton('ltr',{title:'directionality.ltr_desc',cmd:'mceDirectionLTR'});ed.addButton('rtl',{title:'directionality.rtl_desc',cmd:'mceDirectionRTL'});ed.onNodeChange.add(t._nodeChange,t);},getInfo:function(){return{longname:'Directionality',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/directionality',version:tinymce.majorVersion+"."+tinymce.minorVersion};},_nodeChange:function(ed,cm,n){var dom=ed.dom,dir;n=dom.getParent(n,dom.isBlock);if(!n){cm.setDisabled('ltr',1);cm.setDisabled('rtl',1);return;}dir=dom.getAttrib(n,'dir');cm.setActive('ltr',dir=="ltr");cm.setDisabled('ltr',0);cm.setActive('rtl',dir=="rtl");cm.setDisabled('rtl',0);}});tinymce.PluginManager.add('directionality',tinymce.plugins.Directionality);})(); -
trunk/wp-includes/js/tinymce/plugins/fullscreen/editor_plugin.js
r6689 r6694 1 /** 2 * $Id: editor_plugin_src.js 544 2008-01-17 13:07:00Z spocke $ 3 * 4 * @author Moxiecode 5 * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved. 6 */ 7 8 (function() { 9 var DOM = tinymce.DOM; 10 11 tinymce.create('tinymce.plugins.FullScreenPlugin', { 12 init : function(ed, url) { 13 var t = this, s = {}, vp; 14 15 t.editor = ed; 16 17 // Register commands 18 ed.addCommand('mceFullScreen', function() { 19 var win, de = document.documentElement; 20 21 if (ed.getParam('fullscreen_is_enabled')) { 22 if (ed.getParam('fullscreen_new_window')) 23 closeFullscreen(); // Call to close in new window 24 else { 25 window.setTimeout(function() { 26 tinyMCE.get(ed.getParam('fullscreen_editor_id')).setContent(ed.getContent({format : 'raw'}), {format : 'raw'}); 27 tinyMCE.remove(ed); 28 DOM.remove('mce_fullscreen_container'); 29 de.style.overflow = ed.getParam('fullscreen_html_overflow'); 30 DOM.setStyle(document.body, 'overflow', ed.getParam('fullscreen_overflow')); 31 window.scrollTo(ed.getParam('fullscreen_scrollx'), ed.getParam('fullscreen_scrolly')); 32 }, 10); 33 } 34 35 return; 36 } 37 38 if (ed.getParam('fullscreen_new_window')) { 39 win = window.open(url + "/fullscreen.htm", "mceFullScreenPopup", "fullscreen=yes,menubar=no,toolbar=no,scrollbars=no,resizable=no,left=0,top=0,width=" + screen.availWidth + ",height=" + screen.availHeight); 40 try { 41 win.resizeTo(screen.availWidth, screen.availHeight); 42 } catch (e) { 43 // Ignore 44 } 45 } else { 46 s.fullscreen_overflow = DOM.getStyle(document.body, 'overflow', 1) || 'auto'; 47 s.fullscreen_html_overflow = DOM.getStyle(de, 'overflow', 1); 48 vp = DOM.getViewPort(); 49 s.fullscreen_scrollx = vp.x; 50 s.fullscreen_scrolly = vp.y; 51 52 // Fixes an Opera bug where the scrollbars doesn't reappear 53 if (tinymce.isOpera && s.fullscreen_overflow == 'visible') 54 s.fullscreen_overflow = 'auto'; 55 56 // Fixes an IE bug where horizontal scrollbars would appear 57 if (tinymce.isIE && s.fullscreen_overflow == 'scroll') 58 s.fullscreen_overflow = 'auto'; 59 60 if (s.fullscreen_overflow == '0px') 61 s.fullscreen_overflow = ''; 62 63 DOM.setStyle(document.body, 'overflow', 'hidden'); 64 de.style.overflow = 'hidden'; //Fix for IE6/7 65 vp = DOM.getViewPort(); 66 window.scrollTo(0, 0); 67 68 if (tinymce.isIE) 69 vp.h -= 1; 70 71 n = DOM.add(document.body, 'div', {id : 'mce_fullscreen_container', style : 'position:absolute;top:0;left:0;width:' + vp.w + 'px;height:' + vp.h + 'px;z-index:150;'}); 72 DOM.add(n, 'div', {id : 'mce_fullscreen'}); 73 74 tinymce.each(ed.settings, function(v, n) { 75 s[n] = v; 76 }); 77 78 s.id = 'mce_fullscreen'; 79 s.width = n.clientWidth; 80 s.height = n.clientHeight - 15; 81 s.fullscreen_is_enabled = true; 82 s.fullscreen_editor_id = ed.id; 83 s.theme_advanced_resizing = false; 84 85 tinymce.each(ed.getParam('fullscreen_settings'), function(v, k) { 86 s[k] = v; 87 }); 88 89 if (s.theme_advanced_toolbar_location === 'external') 90 s.theme_advanced_toolbar_location = 'top'; 91 92 t.fullscreenEditor = new tinymce.Editor('mce_fullscreen', s); 93 t.fullscreenEditor.onInit.add(function() { 94 t.fullscreenEditor.setContent(ed.getContent({format : 'raw', no_events : 1}), {format : 'raw', no_events : 1}); 95 }); 96 97 t.fullscreenEditor.render(); 98 tinyMCE.add(t.fullscreenEditor); 99 100 t.fullscreenElement = new tinymce.dom.Element('mce_fullscreen_container'); 101 t.fullscreenElement.update(); 102 //document.body.overflow = 'hidden'; 103 } 104 }); 105 106 // Register buttons 107 ed.addButton('fullscreen', {title : 'fullscreen.desc', cmd : 'mceFullScreen'}); 108 109 ed.onNodeChange.add(function(ed, cm) { 110 cm.setActive('fullscreen', ed.getParam('fullscreen_is_enabled')); 111 }); 112 }, 113 114 getInfo : function() { 115 return { 116 longname : 'Fullscreen', 117 author : 'Moxiecode Systems AB', 118 authorurl : 'http://tinymce.moxiecode.com', 119 infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/fullscreen', 120 version : tinymce.majorVersion + "." + tinymce.minorVersion 121 }; 122 } 123 }); 124 125 // Register plugin 126 tinymce.PluginManager.add('fullscreen', tinymce.plugins.FullScreenPlugin); 127 })(); 1 (function(){var DOM=tinymce.DOM;tinymce.create('tinymce.plugins.FullScreenPlugin',{init:function(ed,url){var t=this,s={},vp;t.editor=ed;ed.addCommand('mceFullScreen',function(){var win,de=document.documentElement;if(ed.getParam('fullscreen_is_enabled')){if(ed.getParam('fullscreen_new_window'))closeFullscreen();else{window.setTimeout(function(){tinyMCE.get(ed.getParam('fullscreen_editor_id')).setContent(ed.getContent({format:'raw'}),{format:'raw'});tinyMCE.remove(ed);DOM.remove('mce_fullscreen_container');de.style.overflow=ed.getParam('fullscreen_html_overflow');DOM.setStyle(document.body,'overflow',ed.getParam('fullscreen_overflow'));window.scrollTo(ed.getParam('fullscreen_scrollx'),ed.getParam('fullscreen_scrolly'));},10);}return;}if(ed.getParam('fullscreen_new_window')){win=window.open(url+"/fullscreen.htm","mceFullScreenPopup","fullscreen=yes,menubar=no,toolbar=no,scrollbars=no,resizable=no,left=0,top=0,width="+screen.availWidth+",height="+screen.availHeight);try{win.resizeTo(screen.availWidth,screen.availHeight);}catch(e){}}else{s.fullscreen_overflow=DOM.getStyle(document.body,'overflow',1)||'auto';s.fullscreen_html_overflow=DOM.getStyle(de,'overflow',1);vp=DOM.getViewPort();s.fullscreen_scrollx=vp.x;s.fullscreen_scrolly=vp.y;if(tinymce.isOpera&&s.fullscreen_overflow=='visible')s.fullscreen_overflow='auto';if(tinymce.isIE&&s.fullscreen_overflow=='scroll')s.fullscreen_overflow='auto';if(s.fullscreen_overflow=='0px')s.fullscreen_overflow='';DOM.setStyle(document.body,'overflow','hidden');de.style.overflow='hidden';vp=DOM.getViewPort();window.scrollTo(0,0);if(tinymce.isIE)vp.h-=1;n=DOM.add(document.body,'div',{id:'mce_fullscreen_container',style:'position:absolute;top:0;left:0;width:'+vp.w+'px;height:'+vp.h+'px;z-index:150;'});DOM.add(n,'div',{id:'mce_fullscreen'});tinymce.each(ed.settings,function(v,n){s[n]=v;});s.id='mce_fullscreen';s.width=n.clientWidth;s.height=n.clientHeight-15;s.fullscreen_is_enabled=true;s.fullscreen_editor_id=ed.id;s.theme_advanced_resizing=false;tinymce.each(ed.getParam('fullscreen_settings'),function(v,k){s[k]=v;});if(s.theme_advanced_toolbar_location==='external')s.theme_advanced_toolbar_location='top';t.fullscreenEditor=new tinymce.Editor('mce_fullscreen',s);t.fullscreenEditor.onInit.add(function(){t.fullscreenEditor.setContent(ed.getContent({format:'raw',no_events:1}),{format:'raw',no_events:1});});t.fullscreenEditor.render();tinyMCE.add(t.fullscreenEditor);t.fullscreenElement=new tinymce.dom.Element('mce_fullscreen_container');t.fullscreenElement.update();}});ed.addButton('fullscreen',{title:'fullscreen.desc',cmd:'mceFullScreen'});ed.onNodeChange.add(function(ed,cm){cm.setActive('fullscreen',ed.getParam('fullscreen_is_enabled'));});},getInfo:function(){return{longname:'Fullscreen',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/fullscreen',version:tinymce.majorVersion+"."+tinymce.minorVersion};}});tinymce.PluginManager.add('fullscreen',tinymce.plugins.FullScreenPlugin);})(); -
trunk/wp-includes/js/tinymce/plugins/fullscreen/fullscreen.htm
r6689 r6694 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 1 2 <html xmlns="http://www.w3.org/1999/xhtml"> 2 3 <head> 3 <title> {$lang_fullscreen_title}</title>4 <title></title> 4 5 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> 5 6 <script type="text/javascript" src="../../tiny_mce.js"></script> … … 70 71 return false; 71 72 } 72 73 function init() {74 var e = document.getElementById('fullscreenarea');75 e.value = window.opener.tinyMCE.activeEditor.getContent({format : 'raw'});76 settings['width'] = e.clientWidth;77 settings['height'] = e.clientHeight;78 tinyMCE.init(settings);79 }80 73 </script> 81 74 <base target="_self" /> 82 75 </head> 83 <body onload="init();" style="margin:0; overflow:hidden; height:100%;" scrolling="no" scroll="no">84 <form onsubmit="doParentSubmit();" style="height: 100%">76 <body style="margin:0;overflow:hidden;width:100%;height:100%" scrolling="no" scroll="no"> 77 <form onsubmit="doParentSubmit();"> 85 78 <textarea id="fullscreenarea" style="width:100%; height:100%"></textarea> 86 79 </form> 80 81 <script type="text/javascript"> 82 var e = document.getElementById('fullscreenarea'); 83 e.value = window.opener.tinyMCE.activeEditor.getContent({format : 'raw'}); 84 settings['width'] = window.innerWidth || document.body.clientWidth; 85 settings['height'] = (window.innerHeight || document.body.clientHeight) - 18; 86 tinyMCE.init(settings); 87 </script> 88 87 89 </body> 88 90 </html> -
trunk/wp-includes/js/tinymce/plugins/inlinepopups/editor_plugin.js
r6632 r6694 1 /** 2 * $Id: editor_plugin_src.js 520 2008-01-07 16:30:32Z spocke $ 3 * 4 * @author Moxiecode 5 * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved. 6 */ 7 8 (function() { 9 var DOM = tinymce.DOM, Element = tinymce.dom.Element, Event = tinymce.dom.Event, each = tinymce.each, is = tinymce.is; 10 11 tinymce.create('tinymce.plugins.InlinePopups', { 12 init : function(ed, url) { 13 // Replace window manager 14 ed.onBeforeRenderUI.add(function() { 15 ed.windowManager = new tinymce.InlineWindowManager(ed); 16 DOM.loadCSS(url + '/skins/' + (ed.settings.inlinepopups_skin || 'clearlooks2') + "/window.css"); 17 }); 18 }, 19 20 getInfo : function() { 21 return { 22 longname : 'InlinePopups', 23 author : 'Moxiecode Systems AB', 24 authorurl : 'http://tinymce.moxiecode.com', 25 infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/inlinepopups', 26 version : tinymce.majorVersion + "." + tinymce.minorVersion 27 }; 28 } 29 }); 30 31 tinymce.create('tinymce.InlineWindowManager:tinymce.WindowManager', { 32 InlineWindowManager : function(ed) { 33 var t = this; 34 35 t.parent(ed); 36 t.zIndex = 1000; 37 }, 38 39 open : function(f, p) { 40 var t = this, id, opt = '', ed = t.editor, dw = 0, dh = 0, vp, po, mdf, clf, we, w; 41 42 f = f || {}; 43 p = p || {}; 44 45 // Run native windows 46 if (!f.inline) 47 return t.parent(f, p); 48 49 t.bookmark = ed.selection.getBookmark('simple'); 50 id = DOM.uniqueId(); 51 vp = DOM.getViewPort(); 52 f.width = parseInt(f.width || 320); 53 f.height = parseInt(f.height || 240) + (tinymce.isIE ? 8 : 0); 54 f.min_width = parseInt(f.min_width || 150); 55 f.min_height = parseInt(f.min_height || 100); 56 f.max_width = parseInt(f.max_width || 2000); 57 f.max_height = parseInt(f.max_height || 2000); 58 f.left = f.left || Math.round(Math.max(vp.x, vp.x + (vp.w / 2.0) - (f.width / 2.0))); 59 f.top = f.top || Math.round(Math.max(vp.y, vp.y + (vp.h / 2.0) - (f.height / 2.0))); 60 f.movable = f.resizable = true; 61 p.mce_width = f.width; 62 p.mce_height = f.height; 63 p.mce_inline = true; 64 p.mce_window_id = id; 65 66 // Transpose 67 // po = DOM.getPos(ed.getContainer()); 68 // f.left -= po.x; 69 // f.top -= po.y; 70 71 t.features = f; 72 t.params = p; 73 t.onOpen.dispatch(t, f, p); 74 75 if (f.type) { 76 opt += ' modal ' + f.type; 77 f.resizable = false; 78 } 79 80 if (f.statusbar) 81 opt += ' statusbar'; 82 83 if (f.resizable) 84 opt += ' resizable'; 85 86 if (f.minimizable) 87 opt += ' minimizable'; 88 89 if (f.maximizable) 90 opt += ' maximizable'; 91 92 if (f.movable) 93 opt += ' movable'; 94 95 // Create DOM objects 96 t._addAll(document.body, 97 ['div', {id : id, 'class' : ed.settings.inlinepopups_skin || 'clearlooks2', style : 'width:100px;height:100px'}, 98 ['div', {id : id + '_wrapper', 'class' : 'wrapper' + opt}, 99 ['div', {id : id + '_top', 'class' : 'top'}, 100 ['div', {'class' : 'left'}], 101 ['div', {'class' : 'center'}], 102 ['div', {'class' : 'right'}], 103 ['span', {id : id + '_title'}, f.title || ''] 104 ], 105 106 ['div', {id : id + '_middle', 'class' : 'middle'}, 107 ['div', {id : id + '_left', 'class' : 'left'}], 108 ['span', {id : id + '_content'}], 109 ['div', {id : id + '_right', 'class' : 'right'}] 110 ], 111 112 ['div', {id : id + '_bottom', 'class' : 'bottom'}, 113 ['div', {'class' : 'left'}], 114 ['div', {'class' : 'center'}], 115 ['div', {'class' : 'right'}], 116 ['span', {id : id + '_status'}, 'Content'] 117 ], 118 119 ['a', {'class' : 'move', href : 'javascript:;'}], 120 ['a', {'class' : 'min', href : 'javascript:;', onmousedown : 'return false;'}], 121 ['a', {'class' : 'max', href : 'javascript:;', onmousedown : 'return false;'}], 122 ['a', {'class' : 'med', href : 'javascript:;', onmousedown : 'return false;'}], 123 ['a', {'class' : 'close', href : 'javascript:;', onmousedown : 'return false;'}], 124 ['a', {id : id + '_resize_n', 'class' : 'resize resize-n', href : 'javascript:;'}], 125 ['a', {id : id + '_resize_s', 'class' : 'resize resize-s', href : 'javascript:;'}], 126 ['a', {id : id + '_resize_w', 'class' : 'resize resize-w', href : 'javascript:;'}], 127 ['a', {id : id + '_resize_e', 'class' : 'resize resize-e', href : 'javascript:;'}], 128 ['a', {id : id + '_resize_nw', 'class' : 'resize resize-nw', href : 'javascript:;'}], 129 ['a', {id : id + '_resize_ne', 'class' : 'resize resize-ne', href : 'javascript:;'}], 130 ['a', {id : id + '_resize_sw', 'class' : 'resize resize-sw', href : 'javascript:;'}], 131 ['a', {id : id + '_resize_se', 'class' : 'resize resize-se', href : 'javascript:;'}] 132 ] 133 ] 134 ); 135 136 DOM.setStyles(id, {top : -10000, left : -10000}); 137 138 // Fix gecko rendering bug, where the editors iframe messed with window contents 139 if (tinymce.isGecko) 140 DOM.setStyle(id, 'overflow', 'auto'); 141 142 // Measure borders 143 if (!f.type) { 144 dw += DOM.get(id + '_left').clientWidth; 145 dw += DOM.get(id + '_right').clientWidth; 146 dh += DOM.get(id + '_top').clientHeight; 147 dh += DOM.get(id + '_bottom').clientHeight; 148 } 149 150 // Resize window 151 DOM.setStyles(id, {top : f.top, left : f.left, width : f.width + dw, height : f.height + dh}); 152 153 if (!f.type) { 154 DOM.add(id + '_content', 'iframe', {id : id + '_ifr', src : 'javascript:""', frameBorder : 0, style : 'border:0;width:10px;height:10px'}); 155 DOM.setStyles(id + '_ifr', {width : f.width, height : f.height}); 156 DOM.setAttrib(id + '_ifr', 'src', f.url || f.file); 157 } else { 158 DOM.add(id + '_wrapper', 'a', {id : id + '_ok', 'class' : 'button ok', href : 'javascript:;', onmousedown : 'return false;'}, 'Ok'); 159 160 if (f.type == 'confirm') 161 DOM.add(id + '_wrapper', 'a', {'class' : 'button cancel', href : 'javascript:;', onmousedown : 'return false;'}, 'Cancel'); 162 163 DOM.add(id + '_middle', 'div', {'class' : 'icon'}); 164 DOM.setHTML(id + '_content', f.content.replace('\n', '<br />')); 165 } 166 167 // Register events 168 mdf = Event.add(id, 'mousedown', function(e) { 169 var n = e.target, w, vp; 170 171 w = t.windows[id]; 172 t.focus(id); 173 174 if (n.nodeName == 'A' || n.nodeName == 'a') { 175 if (n.className == 'max') { 176 w.oldPos = w.element.getXY(); 177 w.oldSize = w.element.getSize(); 178 179 vp = DOM.getViewPort(); 180 181 // Reduce viewport size to avoid scrollbars 182 vp.w -= 2; 183 vp.h -= 2; 184 185 w.element.moveTo(vp.x, vp.y); 186 w.element.resizeTo(vp.w, vp.h); 187 DOM.setStyles(id + '_ifr', {width : vp.w - w.deltaWidth, height : vp.h - w.deltaHeight}); 188 DOM.addClass(id + '_wrapper', 'maximized'); 189 } else if (n.className == 'med') { 190 // Reset to old size 191 w.element.moveTo(w.oldPos.x, w.oldPos.y); 192 w.element.resizeTo(w.oldSize.w, w.oldSize.h); 193 w.iframeElement.resizeTo(w.oldSize.w - w.deltaWidth, w.oldSize.h - w.deltaHeight); 194 195 DOM.removeClass(id + '_wrapper', 'maximized'); 196 } else if (n.className == 'move') 197 return t._startDrag(id, e, n.className); 198 else if (DOM.hasClass(n, 'resize')) 199 return t._startDrag(id, e, n.className.substring(7)); 200 } 201 }); 202 203 clf = Event.add(id, 'click', function(e) { 204 var n = e.target; 205 206 t.focus(id); 207 208 if (n.nodeName == 'A' || n.nodeName == 'a') { 209 switch (n.className) { 210 case 'close': 211 t.close(null, id); 212 return Event.cancel(e); 213 214 case 'button ok': 215 case 'button cancel': 216 f.button_func(n.className == 'button ok'); 217 return Event.cancel(e); 218 } 219 } 220 }); 221 222 // Add window 223 t.windows = t.windows || {}; 224 w = t.windows[id] = { 225 id : id, 226 mousedown_func : mdf, 227 click_func : clf, 228 element : new Element(id, {blocker : 1, container : ed.getContainer()}), 229 iframeElement : new Element(id + '_ifr'), 230 features : f, 231 deltaWidth : dw, 232 deltaHeight : dh 233 }; 234 235 w.iframeElement.on('focus', function() { 236 t.focus(id); 237 }); 238 239 t.focus(id); 240 t._fixIELayout(id, 1); 241 242 // if (DOM.get(id + '_ok')) 243 // DOM.get(id + '_ok').focus(); 244 245 return w; 246 }, 247 248 focus : function(id) { 249 var t = this, w = t.windows[id]; 250 251 w.zIndex = this.zIndex++; 252 w.element.setStyle('zIndex', w.zIndex); 253 w.element.update(); 254 255 id = id + '_wrapper'; 256 DOM.removeClass(t.lastId, 'focus'); 257 DOM.addClass(id, 'focus'); 258 t.lastId = id; 259 }, 260 261 _addAll : function(te, ne) { 262 var i, n, t = this, dom = tinymce.DOM; 263 264 if (is(ne, 'string')) 265 te.appendChild(dom.doc.createTextNode(ne)); 266 else if (ne.length) { 267 te = te.appendChild(dom.create(ne[0], ne[1])); 268 269 for (i=2; i<ne.length; i++) 270 t._addAll(te, ne[i]); 271 } 272 }, 273 274 _startDrag : function(id, se, ac) { 275 var t = this, mu, mm, d = document, eb, w = t.windows[id], we = w.element, sp = we.getXY(), p, sz, ph, cp, vp, sx, sy, sex, sey, dx, dy, dw, dh; 276 277 // Get positons and sizes 278 // cp = DOM.getPos(t.editor.getContainer()); 279 cp = {x : 0, y : 0}; 280 vp = DOM.getViewPort(); 281 282 // Reduce viewport size to avoid scrollbars 283 vp.w -= 2; 284 vp.h -= 2; 285 286 sex = se.screenX; 287 sey = se.screenY; 288 dx = dy = dw = dh = 0; 289 290 // Handle mouse up 291 mu = Event.add(d, 'mouseup', function(e) { 292 Event.remove(d, 'mouseup', mu); 293 Event.remove(d, 'mousemove', mm); 294 295 if (eb) 296 eb.remove(); 297 298 we.moveBy(dx, dy); 299 we.resizeBy(dw, dh); 300 sz = we.getSize(); 301 DOM.setStyles(id + '_ifr', {width : sz.w - w.deltaWidth, height : sz.h - w.deltaHeight}); 302 t._fixIELayout(id, 1); 303 304 return Event.cancel(e); 305 }); 306 307 if (ac != 'move') 308 startMove(); 309 310 function startMove() { 311 if (eb) 312 return; 313 314 t._fixIELayout(id, 0); 315 316 // Setup event blocker 317 DOM.add(d.body, 'div', { 318 id : 'mceEventBlocker', 319 'class' : 'mceEventBlocker ' + (t.editor.settings.inlinepopups_skin || 'clearlooks2'), 320 style : {left : vp.x, top : vp.y, width : vp.w - 20, height : vp.h - 20, zIndex : 20001} 321 }); 322 eb = new Element('mceEventBlocker'); 323 eb.update(); 324 325 // Setup placeholder 326 p = we.getXY(); 327 sz = we.getSize(); 328 sx = cp.x + p.x - vp.x; 329 sy = cp.y + p.y - vp.y; 330 DOM.add(eb.get(), 'div', {id : 'mcePlaceHolder', 'class' : 'placeholder', style : {left : sx, top : sy, width : sz.w, height : sz.h}}); 331 ph = new Element('mcePlaceHolder'); 332 }; 333 334 // Handle mouse move/drag 335 mm = Event.add(d, 'mousemove', function(e) { 336 var x, y, v; 337 338 startMove(); 339 340 x = e.screenX - sex; 341 y = e.screenY - sey; 342 343 switch (ac) { 344 case 'resize-w': 345 dx = x; 346 dw = 0 - x; 347 break; 348 349 case 'resize-e': 350 dw = x; 351 break; 352 353 case 'resize-n': 354 case 'resize-nw': 355 case 'resize-ne': 356 if (ac == "resize-nw") { 357 dx = x; 358 dw = 0 - x; 359 } else if (ac == "resize-ne") 360 dw = x; 361 362 dy = y; 363 dh = 0 - y; 364 break; 365 366 case 'resize-s': 367 case 'resize-sw': 368 case 'resize-se': 369 if (ac == "resize-sw") { 370 dx = x; 371 dw = 0 - x; 372 } else if (ac == "resize-se") 373 dw = x; 374 375 dh = y; 376 break; 377 378 case 'move': 379 dx = x; 380 dy = y; 381 break; 382 } 383 384 // Boundary check 385 if (dw < (v = w.features.min_width - sz.w)) { 386 if (dx !== 0) 387 dx += dw - v; 388 389 dw = v; 390 } 391 392 if (dh < (v = w.features.min_height - sz.h)) { 393 if (dy !== 0) 394 dy += dh - v; 395 396 dh = v; 397 } 398 399 dw = Math.min(dw, w.features.max_width - sz.w); 400 dh = Math.min(dh, w.features.max_height - sz.h); 401 dx = Math.max(dx, vp.x - (sx + vp.x)); 402 dy = Math.max(dy, vp.y - (sy + vp.y)); 403 dx = Math.min(dx, (vp.w + vp.x) - (sx + sz.w + vp.x)); 404 dy = Math.min(dy, (vp.h + vp.y) - (sy + sz.h + vp.y)); 405 406 // Move if needed 407 if (dx + dy !== 0) { 408 if (sx + dx < 0) 409 dx = 0; 410 411 if (sy + dy < 0) 412 dy = 0; 413 414 ph.moveTo(sx + dx, sy + dy); 415 } 416 417 // Resize if needed 418 if (dw + dh !== 0) 419 ph.resizeTo(sz.w + dw, sz.h + dh); 420 421 return Event.cancel(e); 422 }); 423 424 return Event.cancel(se); 425 }, 426 427 resizeBy : function(dw, dh, id) { 428 var w = this.windows[id]; 429 430 if (w) { 431 w.element.resizeBy(dw, dh); 432 w.iframeElement.resizeBy(dw, dh); 433 } 434 }, 435 436 close : function(win, id) { 437 var t = this, w, d = document, ix = 0, fw; 438 439 // Probably not inline 440 if (!id && win) { 441 t.parent(win); 442 return; 443 } 444 445 if (w = t.windows[id]) { 446 t.onClose.dispatch(t); 447 Event.remove(d, 'mousedown', w.mousedownFunc); 448 Event.remove(d, 'click', w.clickFunc); 449 450 DOM.setAttrib(id + '_ifr', 'src', 'javascript:""'); // Prevent leak 451 w.element.remove(); 452 delete t.windows[id]; 453 454 // Find front most window and focus that 455 each (t.windows, function(w) { 456 if (w.zIndex > ix) { 457 fw = w; 458 ix = w.zIndex; 459 } 460 }); 461 462 if (fw) 463 t.focus(fw.id); 464 } 465 }, 466 467 setTitle : function(ti, id) { 468 DOM.get(id + '_title').innerHTML = DOM.encode(ti); 469 }, 470 471 alert : function(txt, cb, s) { 472 var t = this, w; 473 474 w = t.open({ 475 title : t, 476 type : 'alert', 477 button_func : function(s) { 478 if (cb) 479 cb.call(s || t, s); 480 481 t.close(null, w.id); 482 }, 483 content : DOM.encode(t.editor.getLang(txt, txt)), 484 inline : 1, 485 width : 400, 486 height : 130 487 }); 488 }, 489 490 confirm : function(txt, cb, s) { 491 var t = this, w; 492 493 w = t.open({ 494 title : t, 495 type : 'confirm', 496 button_func : function(s) { 497 if (cb) 498 cb.call(s || t, s); 499 500 t.close(null, w.id); 501 }, 502 content : DOM.encode(t.editor.getLang(txt, txt)), 503 inline : 1, 504 width : 400, 505 height : 130 506 }); 507 }, 508 509 // Internal functions 510 511 _fixIELayout : function(id, s) { 512 var w, img; 513 514 if (!tinymce.isIE6) 515 return; 516 517 // Fixes the bug where hover flickers and does odd things in IE6 518 each(['n','s','w','e','nw','ne','sw','se'], function(v) { 519 var e = DOM.get(id + '_resize_' + v); 520 521 DOM.setStyles(e, { 522 width : s ? e.clientWidth : '', 523 height : s ? e.clientHeight : '', 524 cursor : DOM.getStyle(e, 'cursor', 1) 525 }); 526 527 DOM.setStyle(id + "_bottom", 'bottom', '-1px'); 528 529 e = 0; 530 }); 531 532 // Fixes graphics glitch 533 if (w = this.windows[id]) { 534 // Fixes rendering bug after resize 535 w.element.hide(); 536 w.element.show(); 537 538 // Forced a repaint of the window 539 //DOM.get(id).style.filter = ''; 540 541 // IE has a bug where images used in CSS won't get loaded 542 // sometimes when the cache in the browser is disabled 543 // This fix tries to solve it by loading the images using the image object 544 each(DOM.select('div,a', id), function(e, i) { 545 if (e.currentStyle.backgroundImage != 'none') { 546 img = new Image(); 547 img.src = e.currentStyle.backgroundImage.replace(/url\(\"(.+)\"\)/, '$1'); 548 } 549 }); 550 551 DOM.get(id).style.filter = ''; 552 } 553 } 554 }); 555 556 // Register plugin 557 tinymce.PluginManager.add('inlinepopups', tinymce.plugins.InlinePopups); 558 })(); 559 1 (function(){var DOM=tinymce.DOM,Element=tinymce.dom.Element,Event=tinymce.dom.Event,each=tinymce.each,is=tinymce.is;tinymce.create('tinymce.plugins.InlinePopups',{init:function(ed,url){ed.onBeforeRenderUI.add(function(){ed.windowManager=new tinymce.InlineWindowManager(ed);DOM.loadCSS(url+'/skins/'+(ed.settings.inlinepopups_skin||'clearlooks2')+"/window.css");});},getInfo:function(){return{longname:'InlinePopups',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/inlinepopups',version:tinymce.majorVersion+"."+tinymce.minorVersion};}});tinymce.create('tinymce.InlineWindowManager:tinymce.WindowManager',{InlineWindowManager:function(ed){var t=this;t.parent(ed);t.zIndex=1000;},open:function(f,p){var t=this,id,opt='',ed=t.editor,dw=0,dh=0,vp,po,mdf,clf,we,w;f=f||{};p=p||{};if(!f.inline)return t.parent(f,p);t.bookmark=ed.selection.getBookmark('simple');id=DOM.uniqueId();vp=DOM.getViewPort();f.width=parseInt(f.width||320);f.height=parseInt(f.height||240)+(tinymce.isIE?8:0);f.min_width=parseInt(f.min_width||150);f.min_height=parseInt(f.min_height||100);f.max_width=parseInt(f.max_width||2000);f.max_height=parseInt(f.max_height||2000);f.left=f.left||Math.round(Math.max(vp.x,vp.x+(vp.w/ 2.0) - (f.width /2.0)));f.top=f.top||Math.round(Math.max(vp.y,vp.y+(vp.h/ 2.0) - (f.height /2.0)));f.movable=f.resizable=true;p.mce_width=f.width;p.mce_height=f.height;p.mce_inline=true;p.mce_window_id=id;t.features=f;t.params=p;t.onOpen.dispatch(t,f,p);if(f.type){opt+=' modal '+f.type;f.resizable=false;}if(f.statusbar)opt+=' statusbar';if(f.resizable)opt+=' resizable';if(f.minimizable)opt+=' minimizable';if(f.maximizable)opt+=' maximizable';if(f.movable)opt+=' movable';t._addAll(document.body,['div',{id:id,'class':ed.settings.inlinepopups_skin||'clearlooks2',style:'width:100px;height:100px'},['div',{id:id+'_wrapper','class':'wrapper'+opt},['div',{id:id+'_top','class':'top'},['div',{'class':'left'}],['div',{'class':'center'}],['div',{'class':'right'}],['span',{id:id+'_title'},f.title||'']],['div',{id:id+'_middle','class':'middle'},['div',{id:id+'_left','class':'left'}],['span',{id:id+'_content'}],['div',{id:id+'_right','class':'right'}]],['div',{id:id+'_bottom','class':'bottom'},['div',{'class':'left'}],['div',{'class':'center'}],['div',{'class':'right'}],['span',{id:id+'_status'},'Content']],['a',{'class':'move',href:'javascript:;'}],['a',{'class':'min',href:'javascript:;',onmousedown:'return false;'}],['a',{'class':'max',href:'javascript:;',onmousedown:'return false;'}],['a',{'class':'med',href:'javascript:;',onmousedown:'return false;'}],['a',{'class':'close',href:'javascript:;',onmousedown:'return false;'}],['a',{id:id+'_resize_n','class':'resize resize-n',href:'javascript:;'}],['a',{id:id+'_resize_s','class':'resize resize-s',href:'javascript:;'}],['a',{id:id+'_resize_w','class':'resize resize-w',href:'javascript:;'}],['a',{id:id+'_resize_e','class':'resize resize-e',href:'javascript:;'}],['a',{id:id+'_resize_nw','class':'resize resize-nw',href:'javascript:;'}],['a',{id:id+'_resize_ne','class':'resize resize-ne',href:'javascript:;'}],['a',{id:id+'_resize_sw','class':'resize resize-sw',href:'javascript:;'}],['a',{id:id+'_resize_se','class':'resize resize-se',href:'javascript:;'}]]]);DOM.setStyles(id,{top:-10000,left:-10000});if(tinymce.isGecko)DOM.setStyle(id,'overflow','auto');if(!f.type){dw+=DOM.get(id+'_left').clientWidth;dw+=DOM.get(id+'_right').clientWidth;dh+=DOM.get(id+'_top').clientHeight;dh+=DOM.get(id+'_bottom').clientHeight;}DOM.setStyles(id,{top:f.top,left:f.left,width:f.width+dw,height:f.height+dh});if(!f.type){DOM.add(id+'_content','iframe',{id:id+'_ifr',src:'javascript:""',frameBorder:0,style:'border:0;width:10px;height:10px'});DOM.setStyles(id+'_ifr',{width:f.width,height:f.height});DOM.setAttrib(id+'_ifr','src',f.url||f.file);}else{DOM.add(id+'_wrapper','a',{id:id+'_ok','class':'button ok',href:'javascript:;',onmousedown:'return false;'},'Ok');if(f.type=='confirm')DOM.add(id+'_wrapper','a',{'class':'button cancel',href:'javascript:;',onmousedown:'return false;'},'Cancel');DOM.add(id+'_middle','div',{'class':'icon'});DOM.setHTML(id+'_content',f.content.replace('\n','<br />'));}mdf=Event.add(id,'mousedown',function(e){var n=e.target,w,vp;w=t.windows[id];t.focus(id);if(n.nodeName=='A'||n.nodeName=='a'){if(n.className=='max'){w.oldPos=w.element.getXY();w.oldSize=w.element.getSize();vp=DOM.getViewPort();vp.w-=2;vp.h-=2;w.element.moveTo(vp.x,vp.y);w.element.resizeTo(vp.w,vp.h);DOM.setStyles(id+'_ifr',{width:vp.w-w.deltaWidth,height:vp.h-w.deltaHeight});DOM.addClass(id+'_wrapper','maximized');}else if(n.className=='med'){w.element.moveTo(w.oldPos.x,w.oldPos.y);w.element.resizeTo(w.oldSize.w,w.oldSize.h);w.iframeElement.resizeTo(w.oldSize.w-w.deltaWidth,w.oldSize.h-w.deltaHeight);DOM.removeClass(id+'_wrapper','maximized');}else if(n.className=='move')return t._startDrag(id,e,n.className);else if(DOM.hasClass(n,'resize'))return t._startDrag(id,e,n.className.substring(7));}});clf=Event.add(id,'click',function(e){var n=e.target;t.focus(id);if(n.nodeName=='A'||n.nodeName=='a'){switch(n.className){case'close':t.close(null,id);return Event.cancel(e);case'button ok':case'button cancel':f.button_func(n.className=='button ok');return Event.cancel(e);}}});t.windows=t.windows||{};w=t.windows[id]={id:id,mousedown_func:mdf,click_func:clf,element:new Element(id,{blocker:1,container:ed.getContainer()}),iframeElement:new Element(id+'_ifr'),features:f,deltaWidth:dw,deltaHeight:dh};w.iframeElement.on('focus',function(){t.focus(id);});t.focus(id);t._fixIELayout(id,1);return w;},focus:function(id){var t=this,w=t.windows[id];w.zIndex=this.zIndex++;w.element.setStyle('zIndex',w.zIndex);w.element.update();id=id+'_wrapper';DOM.removeClass(t.lastId,'focus');DOM.addClass(id,'focus');t.lastId=id;},_addAll:function(te,ne){var i,n,t=this,dom=tinymce.DOM;if(is(ne,'string'))te.appendChild(dom.doc.createTextNode(ne));else if(ne.length){te=te.appendChild(dom.create(ne[0],ne[1]));for(i=2;i<ne.length;i++)t._addAll(te,ne[i]);}},_startDrag:function(id,se,ac){var t=this,mu,mm,d=document,eb,w=t.windows[id],we=w.element,sp=we.getXY(),p,sz,ph,cp,vp,sx,sy,sex,sey,dx,dy,dw,dh;cp={x:0,y:0};vp=DOM.getViewPort();vp.w-=2;vp.h-=2;sex=se.screenX;sey=se.screenY;dx=dy=dw=dh=0;mu=Event.add(d,'mouseup',function(e){Event.remove(d,'mouseup',mu);Event.remove(d,'mousemove',mm);if(eb)eb.remove();we.moveBy(dx,dy);we.resizeBy(dw,dh);sz=we.getSize();DOM.setStyles(id+'_ifr',{width:sz.w-w.deltaWidth,height:sz.h-w.deltaHeight});t._fixIELayout(id,1);return Event.cancel(e);});if(ac!='move')startMove();function startMove(){if(eb)return;t._fixIELayout(id,0);DOM.add(d.body,'div',{id:'mceEventBlocker','class':'mceEventBlocker '+(t.editor.settings.inlinepopups_skin||'clearlooks2'),style:{left:vp.x,top:vp.y,width:vp.w-20,height:vp.h-20,zIndex:20001}});eb=new Element('mceEventBlocker');eb.update();p=we.getXY();sz=we.getSize();sx=cp.x+p.x-vp.x;sy=cp.y+p.y-vp.y;DOM.add(eb.get(),'div',{id:'mcePlaceHolder','class':'placeholder',style:{left:sx,top:sy,width:sz.w,height:sz.h}});ph=new Element('mcePlaceHolder');};mm=Event.add(d,'mousemove',function(e){var x,y,v;startMove();x=e.screenX-sex;y=e.screenY-sey;switch(ac){case'resize-w':dx=x;dw=0-x;break;case'resize-e':dw=x;break;case'resize-n':case'resize-nw':case'resize-ne':if(ac=="resize-nw"){dx=x;dw=0-x;}else if(ac=="resize-ne")dw=x;dy=y;dh=0-y;break;case'resize-s':case'resize-sw':case'resize-se':if(ac=="resize-sw"){dx=x;dw=0-x;}else if(ac=="resize-se")dw=x;dh=y;break;case'move':dx=x;dy=y;break;}if(dw<(v=w.features.min_width-sz.w)){if(dx!==0)dx+=dw-v;dw=v;}if(dh<(v=w.features.min_height-sz.h)){if(dy!==0)dy+=dh-v;dh=v;}dw=Math.min(dw,w.features.max_width-sz.w);dh=Math.min(dh,w.features.max_height-sz.h);dx=Math.max(dx,vp.x-(sx+vp.x));dy=Math.max(dy,vp.y-(sy+vp.y));dx=Math.min(dx,(vp.w+vp.x)-(sx+sz.w+vp.x));dy=Math.min(dy,(vp.h+vp.y)-(sy+sz.h+vp.y));if(dx+dy!==0){if(sx+dx<0)dx=0;if(sy+dy<0)dy=0;ph.moveTo(sx+dx,sy+dy);}if(dw+dh!==0)ph.resizeTo(sz.w+dw,sz.h+dh);return Event.cancel(e);});return Event.cancel(se);},resizeBy:function(dw,dh,id){var w=this.windows[id];if(w){w.element.resizeBy(dw,dh);w.iframeElement.resizeBy(dw,dh);}},close:function(win,id){var t=this,w,d=document,ix=0,fw;if(!id&&win){t.parent(win);return;}if(w=t.windows[id]){t.onClose.dispatch(t);Event.remove(d,'mousedown',w.mousedownFunc);Event.remove(d,'click',w.clickFunc);DOM.setAttrib(id+'_ifr','src','javascript:""');w.element.remove();delete t.windows[id];each(t.windows,function(w){if(w.zIndex>ix){fw=w;ix=w.zIndex;}});if(fw)t.focus(fw.id);}},setTitle:function(ti,id){DOM.get(id+'_title').innerHTML=DOM.encode(ti);},alert:function(txt,cb,s){var t=this,w;w=t.open({title:t,type:'alert',button_func:function(s){if(cb)cb.call(s||t,s);t.close(null,w.id);},content:DOM.encode(t.editor.getLang(txt,txt)),inline:1,width:400,height:130});},confirm:function(txt,cb,s){var t=this,w;w=t.open({title:t,type:'confirm',button_func:function(s){if(cb)cb.call(s||t,s);t.close(null,w.id);},content:DOM.encode(t.editor.getLang(txt,txt)),inline:1,width:400,height:130});},_fixIELayout:function(id,s){var w,img;if(!tinymce.isIE6)return;each(['n','s','w','e','nw','ne','sw','se'],function(v){var e=DOM.get(id+'_resize_'+v);DOM.setStyles(e,{width:s?e.clientWidth:'',height:s?e.clientHeight:'',cursor:DOM.getStyle(e,'cursor',1)});DOM.setStyle(id+"_bottom",'bottom','-1px');e=0;});if(w=this.windows[id]){w.element.hide();w.element.show();each(DOM.select('div,a',id),function(e,i){if(e.currentStyle.backgroundImage!='none'){img=new Image();img.src=e.currentStyle.backgroundImage.replace(/url\(\"(.+)\"\)/,'$1');}});DOM.get(id).style.filter='';}}});tinymce.PluginManager.add('inlinepopups',tinymce.plugins.InlinePopups);})(); -
trunk/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/window.css
r6632 r6694 9 9 10 10 /* Top */ 11 .clearlooks2 .top, .clearlooks2 .top div {top:0; width:100%; height:23px} 12 .clearlooks2 .top .left {width:6px; background:url(img/corners.gif)} 13 .clearlooks2 .top .center {right:6px; width:100%; height:23px; background:url(img/horizontal.gif) 12px 0; clip:rect(auto auto auto 12px)} 14 .clearlooks2 .top .right {right:0; width:6px; height:23px; background:url(img/corners.gif) -12px 0} 15 .clearlooks2 .top span {width:100%; text-align:center; vertical-align:middle; line-height:23px; font-weight:bold} 16 .clearlooks2 .focus .top .left {background:url(img/corners.gif) -6px 0} 17 .clearlooks2 .focus .top .center {background:url(img/horizontal.gif) 0 -23px} 18 .clearlooks2 .focus .top .right {background:url(img/corners.gif) -18px 0} 19 .clearlooks2 .focus .top span {color:#FFF} 11 .clearlooks2 .top, 12 .clearlooks2 .top div { 13 top:0; 14 width:100%; 15 height:23px 16 } 17 .clearlooks2 .top .left { 18 width:55%; 19 background: #cee1ef; 20 border-left: 1px solid #c6d9e9; 21 border-top: 1px solid #c6d9e9; 22 } 23 .clearlooks2 .top .center { 24 /*right:6px; 25 width:100%; 26 height:23px; 27 background: #dedede; 28 border-top: 1px solid #ccc;*/ 29 } 30 .clearlooks2 .top .right { 31 right:0; 32 width:55%; 33 height:23px; 34 background: #cee1ef; 35 border-right: 1px solid #c6d9e9; 36 border-top: 1px solid #c6d9e9; 37 } 38 .clearlooks2 .top span { 39 width:100%; 40 font: 12px/20px bold "Lucida Grande","Lucida Sans Unicode",Tahoma,Verdana,sans-serif; 41 text-align:center; 42 vertical-align:middle; 43 line-height:23px; 44 font-weight:bold 45 } 46 .clearlooks2 .focus .top .left { 47 background: #2683ae; 48 border-left: 1px solid #464646; 49 border-top: 1px solid #464646; 50 } 51 .clearlooks2 .focus .top .center { 52 /*background: #2683ae; 53 border-top: 1px solid #454545;*/ 54 } 55 .clearlooks2 .focus .top .right { 56 background: #2683ae; 57 border-right: 1px solid #464646; 58 border-top: 1px solid #464646; 59 } 60 .clearlooks2 .focus .top span { 61 color:#FFF 62 } 20 63 21 64 /* Middle */ 22 65 .clearlooks2 .middle, .clearlooks2 .middle div {top:0} 23 66 .clearlooks2 .middle {width:100%; height:100%; clip:rect(23px auto auto auto)} 24 .clearlooks2 .middle .left {left:0; width:5px; height:100%; background: url(img/vertical.gif) -5px 0}67 .clearlooks2 .middle .left {left:0; width:5px; height:100%; background:#eaf3ea;border-left:1px solid #c6d9e9;} 25 68 .clearlooks2 .middle span {top:23px; left:5px; width:100%; height:100%; background:#FFF} 26 .clearlooks2 .middle .right {right:0; width:5px; height:100%; background: url(img/vertical.gif)}69 .clearlooks2 .middle .right {right:0; width:5px; height:100%; background:#eaf3ea;border-right:1px solid #c6d9e9;} 27 70 28 71 /* Bottom */ 29 72 .clearlooks2 .bottom, .clearlooks2 .bottom div {height:6px} 30 .clearlooks2 .bottom {left:0; bottom:0; width:100% }31 .clearlooks2 .bottom div {top:0 }32 .clearlooks2 .bottom .left {left:0; width:5px; background: url(img/corners.gif) -34px -6px}33 .clearlooks2 .bottom .center {left:5px; width:100%; background:url(img/horizontal.gif) 0 -46px}34 .clearlooks2 .bottom .right {right:0; width: 5px; background: url(img/corners.gif) -34px 0}73 .clearlooks2 .bottom {left:0; bottom:0; width:100%;background:#eaf3ea;border-bottom:1px solid #c6d9e9;} 74 .clearlooks2 .bottom div {top:0;} 75 .clearlooks2 .bottom .left {left:0; width:5px; background:#eaf3ea;border-left:1px solid #c6d9e9;} 76 .clearlooks2 .bottom .center {left:5px; width:100%; } 77 .clearlooks2 .bottom .right {right:0; width:6px; background:#eaf3ea url(img/drag.gif) no-repeat;border-right:1px solid #c6d9e9;} 35 78 .clearlooks2 .bottom span {display:none} 36 79 .clearlooks2 .statusbar .bottom, .clearlooks2 .statusbar .bottom div {height:23px} -
trunk/wp-includes/js/tinymce/plugins/media/editor_plugin.js
r6632 r6694 1 /** 2 * $Id: editor_plugin_src.js 520 2008-01-07 16:30:32Z spocke $ 3 * 4 * @author Moxiecode 5 * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved. 6 */ 7 8 (function() { 9 var each = tinymce.each; 10 11 tinymce.create('tinymce.plugins.MediaPlugin', { 12 init : function(ed, url) { 13 var t = this; 14 15 t.editor = ed; 16 t.url = url; 17 18 function isMediaElm(n) { 19 return /^(mceItemFlash|mceItemShockWave|mceItemWindowsMedia|mceItemQuickTime|mceItemRealMedia)$/.test(n.className); 20 }; 21 22 // Register commands 23 ed.addCommand('mceMedia', function() { 24 ed.windowManager.open({ 25 file : url + '/media.htm', 26 width : 430 + parseInt(ed.getLang('media.delta_width', 0)), 27 height : 470 + parseInt(ed.getLang('media.delta_height', 0)), 28 inline : 1 29 }, { 30 plugin_url : url 31 }); 32 }); 33 34 // Register buttons 35 ed.addButton('media', {title : 'media.desc', cmd : 'mceMedia'}); 36 37 ed.onNodeChange.add(function(ed, cm, n) { 38 cm.setActive('media', n.nodeName == 'IMG' && isMediaElm(n)); 39 }); 40 41 ed.onInit.add(function() { 42 var lo = { 43 mceItemFlash : 'flash', 44 mceItemShockWave : 'shockwave', 45 mceItemWindowsMedia : 'windowsmedia', 46 mceItemQuickTime : 'quicktime', 47 mceItemRealMedia : 'realmedia' 48 }; 49 50 ed.dom.loadCSS(url + "/css/content.css"); 51 52 if (ed.theme.onResolveName) { 53 ed.theme.onResolveName.add(function(th, o) { 54 if (o.name == 'img') { 55 each(lo, function(v, k) { 56 if (ed.dom.hasClass(o.node, k)) { 57 o.name = v; 58 o.title = ed.dom.getAttrib(o.node, 'title'); 59 return false; 60 } 61 }); 62 } 63 }); 64 } 65 66 if (ed && ed.plugins.contextmenu) { 67 ed.plugins.contextmenu.onContextMenu.add(function(th, m, e) { 68 if (e.nodeName == 'IMG' && /mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(e.className)) { 69 m.add({title : 'media.edit', icon : 'media', cmd : 'mceMedia'}); 70 } 71 }); 72 } 73 }); 74 75 ed.onBeforeSetContent.add(function(ed, o) { 76 var h = o.content; 77 78 h = h.replace(/<script[^>]*>\s*write(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)\(\{([^\)]*)\}\);\s*<\/script>/gi, function(a, b, c) { 79 var o = eval("({" + c + "})"); 80 81 return '<img class="mceItem' + b + '" title="' + ed.dom.encode(c) + '" src="' + url + '/img/trans.gif" width="' + o.width + '" height="' + o.height + '" />' 82 }); 83 84 h = h.replace(/<object([^>]*)>/gi, '<div class="mceItemObject" $1>'); 85 h = h.replace(/<embed([^>]*)>/gi, '<div class="mceItemEmbed" $1>'); 86 h = h.replace(/<\/(object|embed)([^>]*)>/gi, '</div>'); 87 h = h.replace(/<param([^>]*)>/gi, function(a, b) {return '<div ' + b.replace(/value=/g, '_value=') + ' class="mceItemParam"></div>'}); 88 h = h.replace(/\/ class=\"mceItemParam\"><\/div>/gi, 'class="mceItemParam"></div>'); 89 90 o.content = h; 91 }); 92 93 ed.onSetContent.add(function() { 94 t._divsToImgs(ed.getBody()); 95 }); 96 97 ed.onPreProcess.add(function(ed, o) { 98 var dom = ed.dom; 99 100 if (o.set) { 101 t._divsToImgs(o.node); 102 103 each(dom.select('IMG', o.node), function(n) { 104 var p; 105 106 if (isMediaElm(n)) { 107 p = t._parse(n.title); 108 dom.setAttrib(n, 'width', dom.getAttrib(n, 'width', p.width || 100)); 109 dom.setAttrib(n, 'height', dom.getAttrib(n, 'height', p.height || 100)); 110 } 111 }); 112 } 113 114 if (o.get) { 115 each(dom.select('IMG', o.node), function(n) { 116 var ci, cb, mt; 117 118 if (ed.getParam('media_use_script')) { 119 if (isMediaElm(n)) 120 n.className = n.className.replace(/mceItem/g, 'mceTemp'); 121 122 return; 123 } 124 125 switch (n.className) { 126 case 'mceItemFlash': 127 ci = 'd27cdb6e-ae6d-11cf-96b8-444553540000'; 128 cb = 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0'; 129 mt = 'application/x-shockwave-flash'; 130 break; 131 132 case 'mceItemShockWave': 133 ci = '166b1bca-3f9c-11cf-8075-444553540000'; 134 cb = 'http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0'; 135 mt = 'application/x-director'; 136 break; 137 138 case 'mceItemWindowsMedia': 139 ci = ed.getParam('media_wmp6_compatible') ? '05589fa1-c356-11ce-bf01-00aa0055595a' : '6bf52a52-394a-11d3-b153-00c04f79faa6'; 140 cb = 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701'; 141 mt = 'application/x-mplayer2'; 142 break; 143 144 case 'mceItemQuickTime': 145 ci = '02bf25d5-8c17-4b23-bc80-d3488abddc6b'; 146 cb = 'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0'; 147 mt = 'video/quicktime'; 148 break; 149 150 case 'mceItemRealMedia': 151 ci = 'cfcdaa03-8be4-11cf-b84b-0020afbbccfa'; 152 cb = 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0'; 153 mt = 'audio/x-pn-realaudio-plugin'; 154 break; 155 } 156 157 if (ci) { 158 dom.replace(t._buildObj({ 159 classid : ci, 160 codebase : cb, 161 type : mt 162 }, n), n); 163 } 164 }); 165 } 166 }); 167 168 ed.onPostProcess.add(function(ed, o) { 169 o.content = o.content.replace(/_value=/g, 'value='); 170 }); 171 172 if (ed.getParam('media_use_script')) { 173 function getAttr(s, n) { 174 n = new RegExp(n + '=\"([^\"]+)\"', 'g').exec(s); 175 176 return n ? ed.dom.decode(n[1]) : ''; 177 }; 178 179 ed.onPostProcess.add(function(ed, o) { 180 o.content = o.content.replace(/<img[^>]+>/g, function(im) { 181 var cl = getAttr(im, 'class'); 182 183 if (/^(mceTempFlash|mceTempShockWave|mceTempWindowsMedia|mceTempQuickTime|mceTempRealMedia)$/.test(cl)) { 184 at = t._parse(getAttr(im, 'title')); 185 at.width = getAttr(im, 'width'); 186 at.height = getAttr(im, 'height'); 187 im = '<script type="text/javascript">write' + cl.substring(7) + '({' + t._serialize(at) + '});</script>'; 188 } 189 190 return im; 191 }); 192 }); 193 } 194 }, 195 196 getInfo : function() { 197 return { 198 longname : 'Media', 199 author : 'Moxiecode Systems AB', 200 authorurl : 'http://tinymce.moxiecode.com', 201 infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/media', 202 version : tinymce.majorVersion + "." + tinymce.minorVersion 203 }; 204 }, 205 206 // Private methods 207 208 _buildObj : function(o, n) { 209 var ob, ed = this.editor, dom = ed.dom, p = this._parse(n.title); 210 211 p.width = o.width = dom.getAttrib(n, 'width') || 100; 212 p.height = o.height = dom.getAttrib(n, 'height') || 100; 213 214 ob = dom.create('div', { 215 mce_name : 'object', 216 classid : "clsid:" + o.classid, 217 codebase : o.codebase, 218 width : o.width, 219 height : o.height 220 }); 221 222 if (p.src) 223 p.src = ed.convertURL(p.src, 'src', n); 224 225 each (p, function(v, k) { 226 if (v && !/^(width|height|codebase|classid)$/.test(k)) 227 dom.add(ob, 'div', {mce_name : 'param', name : k, '_value' : v}); 228 }); 229 230 dom.add(ob, 'div', tinymce.extend({mce_name : 'embed', type : o.type}, p)); 231 232 return ob; 233 }, 234 235 _divsToImgs : function(p) { 236 var t = this, dom = t.editor.dom, im, ci; 237 238 each(dom.select('div', p), function(n) { 239 // Convert object into image 240 if (dom.getAttrib(n, 'class') == 'mceItemObject') { 241 ci = dom.getAttrib(n, "classid").toLowerCase().replace(/\s+/g, ''); 242 243 switch (ci) { 244 case 'clsid:d27cdb6e-ae6d-11cf-96b8-444553540000': 245 dom.replace(t._createImg('mceItemFlash', n), n); 246 break; 247 248 case 'clsid:166b1bca-3f9c-11cf-8075-444553540000': 249 dom.replace(t._createImg('mceItemShockWave', n), n); 250 break; 251 252 case 'clsid:6bf52a52-394a-11d3-b153-00c04f79faa6': 253 case 'clsid:22d6f312-b0f6-11d0-94ab-0080c74c7e95': 254 case 'clsid:05589fa1-c356-11ce-bf01-00aa0055595a': 255 dom.replace(t._createImg('mceItemWindowsMedia', n), n); 256 break; 257 258 case 'clsid:02bf25d5-8c17-4b23-bc80-d3488abddc6b': 259 dom.replace(t._createImg('mceItemQuickTime', n), n); 260 break; 261 262 case 'clsid:cfcdaa03-8be4-11cf-b84b-0020afbbccfa': 263 dom.replace(t._createImg('mceItemRealMedia', n), n); 264 break; 265 266 default: 267 dom.replace(t._createImg('mceItemFlash', n), n); 268 } 269 } 270 }); 271 }, 272 273 _createImg : function(cl, n) { 274 var im, dom = this.editor.dom, pa = {}, ti = ''; 275 276 // Create image 277 im = dom.create('img', { 278 src : this.url + '/img/trans.gif', 279 width : dom.getAttrib(n, 'width') || 100, 280 height : dom.getAttrib(n, 'height') || 100, 281 'class' : cl 282 }); 283 284 // Setup base parameters 285 each(['id', 'name', 'width', 'height', 'bgcolor', 'align'], function(n) { 286 var v = dom.getAttrib(n, 'align'); 287 288 if (v) 289 pa[v] = v; 290 }); 291 292 // Add optional parameters 293 each(dom.select('div', n), function(n) { 294 if (dom.hasClass(n, 'mceItemParam')) 295 pa[dom.getAttrib(n, 'name')] = dom.getAttrib(n, '_value'); 296 }); 297 298 // Use src not movie 299 if (pa.movie) { 300 pa.src = pa.movie; 301 delete pa.movie; 302 } 303 304 delete pa.width; 305 delete pa.height; 306 307 im.title = this._serialize(pa); 308 309 return im; 310 }, 311 312 _parse : function(s) { 313 return tinymce.util.JSON.parse('{' + s + '}'); 314 }, 315 316 _serialize : function(o) { 317 return tinymce.util.JSON.serialize(o).replace(/[{}]/g, ''); 318 } 319 }); 320 321 // Register plugin 322 tinymce.PluginManager.add('media', tinymce.plugins.MediaPlugin); 323 })(); 1 (function(){var each=tinymce.each;tinymce.create('tinymce.plugins.MediaPlugin',{init:function(ed,url){var t=this;t.editor=ed;t.url=url;function isMediaElm(n){return/^(mceItemFlash|mceItemShockWave|mceItemWindowsMedia|mceItemQuickTime|mceItemRealMedia)$/.test(n.className);};ed.addCommand('mceMedia',function(){ed.windowManager.open({file:url+'/media.htm',width:430+parseInt(ed.getLang('media.delta_width',0)),height:470+parseInt(ed.getLang('media.delta_height',0)),inline:1},{plugin_url:url});});ed.addButton('media',{title:'media.desc',cmd:'mceMedia'});ed.onNodeChange.add(function(ed,cm,n){cm.setActive('media',n.nodeName=='IMG'&&isMediaElm(n));});ed.onInit.add(function(){var lo={mceItemFlash:'flash',mceItemShockWave:'shockwave',mceItemWindowsMedia:'windowsmedia',mceItemQuickTime:'quicktime',mceItemRealMedia:'realmedia'};ed.dom.loadCSS(url+"/css/content.css");if(ed.theme.onResolveName){ed.theme.onResolveName.add(function(th,o){if(o.name=='img'){each(lo,function(v,k){if(ed.dom.hasClass(o.node,k)){o.name=v;o.title=ed.dom.getAttrib(o.node,'title');return false;}});}});}if(ed&&ed.plugins.contextmenu){ed.plugins.contextmenu.onContextMenu.add(function(th,m,e){if(e.nodeName=='IMG'&&/mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(e.className)){m.add({title:'media.edit',icon:'media',cmd:'mceMedia'});}});}});ed.onBeforeSetContent.add(function(ed,o){var h=o.content;h=h.replace(/<script[^>]*>\s*write(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)\(\{([^\)]*)\}\);\s*<\/script>/gi,function(a,b,c){var o=eval("({"+c+"})");return'<img class="mceItem'+b+'" title="'+ed.dom.encode(c)+'" src="'+url+'/img/trans.gif" width="'+o.width+'" height="'+o.height+'" />'});h=h.replace(/<object([^>]*)>/gi,'<span class="mceItemObject" $1>');h=h.replace(/<embed([^>]*)>/gi,'<span class="mceItemEmbed" $1>');h=h.replace(/<\/(object|embed)([^>]*)>/gi,'</span>');h=h.replace(/<param([^>]*)>/gi,function(a,b){return'<span '+b.replace(/value=/g,'_value=')+' class="mceItemParam"></span>'});h=h.replace(/\/ class=\"mceItemParam\"><\/span>/gi,'class="mceItemParam"></span>');o.content=h;});ed.onSetContent.add(function(){t._spansToImgs(ed.getBody());});ed.onPreProcess.add(function(ed,o){var dom=ed.dom;if(o.set){t._spansToImgs(o.node);each(dom.select('IMG',o.node),function(n){var p;if(isMediaElm(n)){p=t._parse(n.title);dom.setAttrib(n,'width',dom.getAttrib(n,'width',p.width||100));dom.setAttrib(n,'height',dom.getAttrib(n,'height',p.height||100));}});}if(o.get){each(dom.select('IMG',o.node),function(n){var ci,cb,mt;if(ed.getParam('media_use_script')){if(isMediaElm(n))n.className=n.className.replace(/mceItem/g,'mceTemp');return;}switch(n.className){case'mceItemFlash':ci='d27cdb6e-ae6d-11cf-96b8-444553540000';cb='http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0';mt='application/x-shockwave-flash';break;case'mceItemShockWave':ci='166b1bca-3f9c-11cf-8075-444553540000';cb='http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0';mt='application/x-director';break;case'mceItemWindowsMedia':ci=ed.getParam('media_wmp6_compatible')?'05589fa1-c356-11ce-bf01-00aa0055595a':'6bf52a52-394a-11d3-b153-00c04f79faa6';cb='http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701';mt='application/x-mplayer2';break;case'mceItemQuickTime':ci='02bf25d5-8c17-4b23-bc80-d3488abddc6b';cb='http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0';mt='video/quicktime';break;case'mceItemRealMedia':ci='cfcdaa03-8be4-11cf-b84b-0020afbbccfa';cb='http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0';mt='audio/x-pn-realaudio-plugin';break;}if(ci){dom.replace(t._buildObj({classid:ci,codebase:cb,type:mt},n),n);}});}});ed.onPostProcess.add(function(ed,o){o.content=o.content.replace(/_value=/g,'value=');});if(ed.getParam('media_use_script')){function getAttr(s,n){n=new RegExp(n+'=\"([^\"]+)\"','g').exec(s);return n?ed.dom.decode(n[1]):'';};ed.onPostProcess.add(function(ed,o){o.content=o.content.replace(/<img[^>]+>/g,function(im){var cl=getAttr(im,'class');if(/^(mceTempFlash|mceTempShockWave|mceTempWindowsMedia|mceTempQuickTime|mceTempRealMedia)$/.test(cl)){at=t._parse(getAttr(im,'title'));at.width=getAttr(im,'width');at.height=getAttr(im,'height');im='<script type="text/javascript">write'+cl.substring(7)+'({'+t._serialize(at)+'});</script>';}return im;});});}},getInfo:function(){return{longname:'Media',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/media',version:tinymce.majorVersion+"."+tinymce.minorVersion};},_buildObj:function(o,n){var ob,ed=this.editor,dom=ed.dom,p=this._parse(n.title);p.width=o.width=dom.getAttrib(n,'width')||100;p.height=o.height=dom.getAttrib(n,'height')||100;ob=dom.create('span',{mce_name:'object',classid:"clsid:"+o.classid,codebase:o.codebase,width:o.width,height:o.height});if(p.src)p.src=ed.convertURL(p.src,'src',n);each(p,function(v,k){if(v&&!/^(width|height|codebase|classid)$/.test(k))dom.add(ob,'span',{mce_name:'param',name:k,'_value':v});});dom.add(ob,'span',tinymce.extend({mce_name:'embed',type:o.type},p));return ob;},_spansToImgs:function(p){var t=this,dom=t.editor.dom,im,ci;each(dom.select('span',p),function(n){if(dom.getAttrib(n,'class')=='mceItemObject'){ci=dom.getAttrib(n,"classid").toLowerCase().replace(/\s+/g,'');switch(ci){case'clsid:d27cdb6e-ae6d-11cf-96b8-444553540000':dom.replace(t._createImg('mceItemFlash',n),n);break;case'clsid:166b1bca-3f9c-11cf-8075-444553540000':dom.replace(t._createImg('mceItemShockWave',n),n);break;case'clsid:6bf52a52-394a-11d3-b153-00c04f79faa6':case'clsid:22d6f312-b0f6-11d0-94ab-0080c74c7e95':case'clsid:05589fa1-c356-11ce-bf01-00aa0055595a':dom.replace(t._createImg('mceItemWindowsMedia',n),n);break;case'clsid:02bf25d5-8c17-4b23-bc80-d3488abddc6b':dom.replace(t._createImg('mceItemQuickTime',n),n);break;case'clsid:cfcdaa03-8be4-11cf-b84b-0020afbbccfa':dom.replace(t._createImg('mceItemRealMedia',n),n);break;default:dom.replace(t._createImg('mceItemFlash',n),n);}}});},_createImg:function(cl,n){var im,dom=this.editor.dom,pa={},ti='';im=dom.create('img',{src:this.url+'/img/trans.gif',width:dom.getAttrib(n,'width')||100,height:dom.getAttrib(n,'height')||100,'class':cl});each(['id','name','width','height','bgcolor','align'],function(n){var v=dom.getAttrib(n,'align');if(v)pa[v]=v;});each(dom.select('span',n),function(n){if(dom.hasClass(n,'mceItemParam'))pa[dom.getAttrib(n,'name')]=dom.getAttrib(n,'_value');});if(pa.movie){pa.src=pa.movie;delete pa.movie;}delete pa.width;delete pa.height;im.title=this._serialize(pa);return im;},_parse:function(s){return tinymce.util.JSON.parse('{'+s+'}');},_serialize:function(o){return tinymce.util.JSON.serialize(o).replace(/[{}]/g,'');}});tinymce.PluginManager.add('media',tinymce.plugins.MediaPlugin);})(); -
trunk/wp-includes/js/tinymce/plugins/media/media.htm
r6632 r6694 3 3 <head> 4 4 <title>{#media_dlg.title}</title> 5 5 <script type="text/javascript" src="../../tiny_mce_popup.js"></script> 6 6 <script type="text/javascript" src="js/media.js"></script> 7 7 <script type="text/javascript" src="../../utils/mctabs.js"></script> … … 10 10 <script type="text/javascript" src="../../utils/editable_selects.js"></script> 11 11 <link href="css/media.css" rel="stylesheet" type="text/css" /> 12 <base target="_self" /> 12 <script type="text/javascript">tinyMCEPopup.onInit.add(function(){window.setTimeout(function(){document.getElementById('src').focus();},500);});</script> 13 <base target="_self" /> 13 14 </head> 14 15 <body style="display: none"> … … 812 813 <div class="mceActionPanel"> 813 814 <div style="float: left"> 814 <input type="button" id=" insert" name="insert" value="{#insert}" onclick="insertMedia();" />815 <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" /> 815 816 </div> 816 817 817 818 <div style="float: right"> 818 <input type=" button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />819 <input type="submit" id="insert" name="insert" value="{#insert}" onclick="insertMedia();" /> 819 820 </div> 820 821 </div> -
trunk/wp-includes/js/tinymce/plugins/paste/editor_plugin.js
r6632 r6694 1 /** 2 * $Id: editor_plugin_src.js 520 2008-01-07 16:30:32Z spocke $ 3 * 4 * @author Moxiecode 5 * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved. 6 */ 7 8 (function() { 9 var Event = tinymce.dom.Event; 10 11 tinymce.create('tinymce.plugins.PastePlugin', { 12 init : function(ed, url) { 13 var t = this; 14 15 t.editor = ed; 16 17 // Register commands 18 ed.addCommand('mcePasteText', function(ui, v) { 19 if (ui) { 20 ed.windowManager.open({ 21 file : url + '/pastetext.htm', 22 width : 450, 23 height : 400, 24 inline : 1 25 }, { 26 plugin_url : url 27 }); 28 } else 29 t._insertText(v.html, v.linebreaks); 30 }); 31 32 ed.addCommand('mcePasteWord', function(ui, v) { 33 if (ui) { 34 ed.windowManager.open({ 35 file : url + '/pasteword.htm', 36 width : 450, 37 height : 400, 38 inline : 1 39 }, { 40 plugin_url : url 41 }); 42 } else 43 t._insertWordContent(v); 44 }); 45 46 ed.addCommand('mceSelectAll', function() { 47 ed.execCommand('selectall'); 48 }); 49 50 // Register buttons 51 ed.addButton('pastetext', {title : 'paste.paste_text_desc', cmd : 'mcePasteText', ui : true}); 52 ed.addButton('pasteword', {title : 'paste.paste_word_desc', cmd : 'mcePasteWord', ui : true}); 53 ed.addButton('selectall', {title : 'paste.selectall_desc', cmd : 'mceSelectAll'}); 54 55 if (ed.getParam("paste_auto_cleanup_on_paste", false)) { 56 ed.onPaste.add(function(ed, e) { 57 return t._handlePasteEvent(e) 58 }); 59 } 60 61 if (!tinymce.isIE && ed.getParam("paste_auto_cleanup_on_paste", false)) { 62 // Force paste dialog if non IE browser 63 ed.onKeyDown.add(function(ed, e) { 64 if (e.ctrlKey && e.keyCode == 86) { 65 window.setTimeout(function() { 66 ed.execCommand("mcePasteText", true); 67 }, 1); 68 69 Event.cancel(e); 70 } 71 }); 72 } 73 }, 74 75 getInfo : function() { 76 return { 77 longname : 'Paste text/word', 78 author : 'Moxiecode Systems AB', 79 authorurl : 'http://tinymce.moxiecode.com', 80 infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/paste', 81 version : tinymce.majorVersion + "." + tinymce.minorVersion 82 }; 83 }, 84 85 // Private methods 86 87 _handlePasteEvent : function(e) { 88 var html = this._clipboardHTML(), ed = this.editor, sel = ed.selection, r; 89 90 // Removes italic, strong etc, the if was needed due to bug #1437114 91 if (ed && (r = sel.getRng()) && r.text.length > 0) 92 ed.execCommand('delete'); 93 94 if (html && html.length > 0) 95 ed.execCommand('mcePasteWord', false, html); 96 97 return Event.cancel(e); 98 }, 99 100 _insertText : function(content, bLinebreaks) { 101 if (content && content.length > 0) { 102 if (bLinebreaks) { 103 // Special paragraph treatment 104 if (this.editor.getParam("paste_create_paragraphs", true)) { 105 var rl = this.editor.getParam("paste_replace_list", '\u2122,<sup>TM</sup>,\u2026,...,\u201c|\u201d,",\u2019,\',\u2013|\u2014|\u2015|\u2212,-').split(','); 106 for (var i=0; i<rl.length; i+=2) 107 content = content.replace(new RegExp(rl[i], 'gi'), rl[i+1]); 108 109 content = content.replace(/\r\n\r\n/g, '</p><p>'); 110 content = content.replace(/\r\r/g, '</p><p>'); 111 content = content.replace(/\n\n/g, '</p><p>'); 112 113 // Has paragraphs 114 if ((pos = content.indexOf('</p><p>')) != -1) { 115 this.editor.execCommand("Delete"); 116 117 var node = this.editor.selection.getNode(); 118 119 // Get list of elements to break 120 var breakElms = []; 121 122 do { 123 if (node.nodeType == 1) { 124 // Don't break tables and break at body 125 if (node.nodeName == "TD" || node.nodeName == "BODY") 126 break; 127 128 breakElms[breakElms.length] = node; 129 } 130 } while(node = node.parentNode); 131 132 var before = "", after = "</p>"; 133 before += content.substring(0, pos); 134 135 for (var i=0; i<breakElms.length; i++) { 136 before += "</" + breakElms[i].nodeName + ">"; 137 after += "<" + breakElms[(breakElms.length-1)-i].nodeName + ">"; 138 } 139 140 before += "<p>"; 141 content = before + content.substring(pos+7) + after; 142 } 143 } 144 145 if (this.editor.getParam("paste_create_linebreaks", true)) { 146 content = content.replace(/\r\n/g, '<br />'); 147 content = content.replace(/\r/g, '<br />'); 148 content = content.replace(/\n/g, '<br />'); 149 } 150 } 151 152 this.editor.execCommand("mceInsertRawHTML", false, content); 153 } 154 }, 155 156 _insertWordContent : function(content) { 157 var t = this, ed = t.editor; 158 159 if (content && content.length > 0) { 160 // Cleanup Word content 161 var bull = String.fromCharCode(8226); 162 var middot = String.fromCharCode(183); 163 var cb; 164 165 if ((cb = this.editor.getParam("paste_insert_word_content_callback", "")) != "") 166 content = eval(cb + "('before', content)"); 167 168 var rl = this.editor.getParam("paste_replace_list", '\u2122,<sup>TM</sup>,\u2026,...,\u201c|\u201d,",\u2019,\',\u2013|\u2014|\u2015|\u2212,-').split(','); 169 for (var i=0; i<rl.length; i+=2) 170 content = content.replace(new RegExp(rl[i], 'gi'), rl[i+1]); 171 172 if (this.editor.getParam("paste_convert_headers_to_strong", false)) { 173 content = content.replace(new RegExp('<p class=MsoHeading.*?>(.*?)<\/p>', 'gi'), '<p><b>$1</b></p>'); 174 } 175 176 content = content.replace(new RegExp('tab-stops: list [0-9]+.0pt">', 'gi'), '">' + "--list--"); 177 content = content.replace(new RegExp(bull + "(.*?)<BR>", "gi"), "<p>" + middot + "$1</p>"); 178 content = content.replace(new RegExp('<SPAN style="mso-list: Ignore">', 'gi'), "<span>" + bull); // Covert to bull list 179 content = content.replace(/<o:p><\/o:p>/gi, ""); 180 content = content.replace(new RegExp('<br style="page-break-before: always;.*>', 'gi'), '-- page break --'); // Replace pagebreaks 181 content = content.replace(new RegExp('<(!--)([^>]*)(--)>', 'g'), ""); // Word comments 182 183 if (this.editor.getParam("paste_remove_spans", true)) 184 content = content.replace(/<\/?span[^>]*>/gi, ""); 185 186 if (this.editor.getParam("paste_remove_styles", true)) 187 content = content.replace(new RegExp('<(\\w[^>]*) style="([^"]*)"([^>]*)', 'gi'), "<$1$3"); 188 189 content = content.replace(/<\/?font[^>]*>/gi, ""); 190 191 // Strips class attributes. 192 switch (this.editor.getParam("paste_strip_class_attributes", "all")) { 193 case "all": 194 content = content.replace(/<(\w[^>]*) class=([^ |>]*)([^>]*)/gi, "<$1$3"); 195 break; 196 197 case "mso": 198 content = content.replace(new RegExp('<(\\w[^>]*) class="?mso([^ |>]*)([^>]*)', 'gi'), "<$1$3"); 199 break; 200 } 201 202 content = content.replace(new RegExp('href="?' + this._reEscape("" + document.location) + '', 'gi'), 'href="' + this.editor.documentBaseURI.getURI()); 203 content = content.replace(/<(\w[^>]*) lang=([^ |>]*)([^>]*)/gi, "<$1$3"); 204 content = content.replace(/<\\?\?xml[^>]*>/gi, ""); 205 content = content.replace(/<\/?\w+:[^>]*>/gi, ""); 206 content = content.replace(/-- page break --\s*<p> <\/p>/gi, ""); // Remove pagebreaks 207 content = content.replace(/-- page break --/gi, ""); // Remove pagebreaks 208 209 // content = content.replace(/\/? */gi, ""); 210 // content = content.replace(/<p> <\/p>/gi, ''); 211 212 if (!this.editor.getParam('force_p_newlines')) { 213 content = content.replace('', '' ,'gi'); 214 content = content.replace('</p>', '<br /><br />' ,'gi'); 215 } 216 217 if (!tinymce.isIE && !this.editor.getParam('force_p_newlines')) { 218 content = content.replace(/<\/?p[^>]*>/gi, ""); 219 } 220 221 content = content.replace(/<\/?div[^>]*>/gi, ""); 222 223 // Convert all middlot lists to UL lists 224 if (this.editor.getParam("paste_convert_middot_lists", true)) { 225 var div = ed.dom.create("div", null, content); 226 227 // Convert all middot paragraphs to li elements 228 var className = this.editor.getParam("paste_unindented_list_class", "unIndentedList"); 229 230 while (this._convertMiddots(div, "--list--")) ; // bull 231 while (this._convertMiddots(div, middot, className)) ; // Middot 232 while (this._convertMiddots(div, bull)) ; // bull 233 234 content = div.innerHTML; 235 } 236 237 // Replace all headers with strong and fix some other issues 238 if (this.editor.getParam("paste_convert_headers_to_strong", false)) { 239 content = content.replace(/<h[1-6]> <\/h[1-6]>/gi, '<p> </p>'); 240 content = content.replace(/<h[1-6]>/gi, '<p><b>'); 241 content = content.replace(/<\/h[1-6]>/gi, '</b></p>'); 242 content = content.replace(/<b> <\/b>/gi, '<b> </b>'); 243 content = content.replace(/^( )*/gi, ''); 244 } 245 246 content = content.replace(/--list--/gi, ""); // Remove --list-- 247 248 if ((cb = this.editor.getParam("paste_insert_word_content_callback", "")) != "") 249 content = eval(cb + "('after', content)"); 250 251 // Insert cleaned content 252 this.editor.execCommand("mceInsertContent", false, content); 253 254 if (this.editor.getParam('paste_force_cleanup_wordpaste', true)) { 255 var ed = this.editor; 256 257 window.setTimeout(function() { 258 ed.execCommand("mceCleanup"); 259 }, 1); // Do normal cleanup detached from this thread 260 } 261 } 262 }, 263 264 _reEscape : function(s) { 265 var l = "?.\\*[](){}+^$:"; 266 var o = ""; 267 268 for (var i=0; i<s.length; i++) { 269 var c = s.charAt(i); 270 271 if (l.indexOf(c) != -1) 272 o += '\\' + c; 273 else 274 o += c; 275 } 276 277 return o; 278 }, 279 280 _convertMiddots : function(div, search, class_name) { 281 var mdot = String.fromCharCode(183); 282 var bull = String.fromCharCode(8226); 283 284 var nodes = div.getElementsByTagName("p"); 285 var prevul; 286 for (var i=0; i<nodes.length; i++) { 287 var p = nodes[i]; 288 289 // Is middot 290 if (p.innerHTML.indexOf(search) == 0) { 291 var ul = document.createElement("ul"); 292 293 if (class_name) 294 ul.className = class_name; 295 296 // Add the first one 297 var li = document.createElement("li"); 298 li.innerHTML = p.innerHTML.replace(new RegExp('' + mdot + '|' + bull + '|--list--| ', "gi"), ''); 299 ul.appendChild(li); 300 301 // Add the rest 302 var np = p.nextSibling; 303 while (np) { 304 // If the node is whitespace, then 305 // ignore it and continue on. 306 if (np.nodeType == 3 && new RegExp('^\\s$', 'm').test(np.nodeValue)) { 307 np = np.nextSibling; 308 continue; 309 } 310 311 if (search == mdot) { 312 if (np.nodeType == 1 && new RegExp('^o(\\s+| )').test(np.innerHTML)) { 313 // Second level of nesting 314 if (!prevul) { 315 prevul = ul; 316 ul = document.createElement("ul"); 317 prevul.appendChild(ul); 318 } 319 np.innerHTML = np.innerHTML.replace(/^o/, ''); 320 } else { 321 // Pop the stack if we're going back up to the first level 322 if (prevul) { 323 ul = prevul; 324 prevul = null; 325 } 326 // Not element or middot paragraph 327 if (np.nodeType != 1 || np.innerHTML.indexOf(search) != 0) 328 break; 329 } 330 } else { 331 // Not element or middot paragraph 332 if (np.nodeType != 1 || np.innerHTML.indexOf(search) != 0) 333 break; 334 } 335 336 var cp = np.nextSibling; 337 var li = document.createElement("li"); 338 li.innerHTML = np.innerHTML.replace(new RegExp('' + mdot + '|' + bull + '|--list--| ', "gi"), ''); 339 np.parentNode.removeChild(np); 340 ul.appendChild(li); 341 np = cp; 342 } 343 344 p.parentNode.replaceChild(ul, p); 345 346 return true; 347 } 348 } 349 350 return false; 351 }, 352 353 _clipboardHTML : function() { 354 var div = document.getElementById('_TinyMCE_clipboardHTML'); 355 356 if (!div) { 357 var div = document.createElement('DIV'); 358 div.id = '_TinyMCE_clipboardHTML'; 359 360 with (div.style) { 361 visibility = 'hidden'; 362 overflow = 'hidden'; 363 position = 'absolute'; 364 width = 1; 365 height = 1; 366 } 367 368 document.body.appendChild(div); 369 } 370 371 div.innerHTML = ''; 372 var rng = document.body.createTextRange(); 373 rng.moveToElementText(div); 374 rng.execCommand('Paste'); 375 var html = div.innerHTML; 376 div.innerHTML = ''; 377 return html; 378 } 379 }); 380 381 // Register plugin 382 tinymce.PluginManager.add('paste', tinymce.plugins.PastePlugin); 383 })(); 1 (function(){var Event=tinymce.dom.Event;tinymce.create('tinymce.plugins.PastePlugin',{init:function(ed,url){var t=this;t.editor=ed;ed.addCommand('mcePasteText',function(ui,v){if(ui){ed.windowManager.open({file:url+'/pastetext.htm',width:450,height:400,inline:1},{plugin_url:url});}else t._insertText(v.html,v.linebreaks);});ed.addCommand('mcePasteWord',function(ui,v){if(ui){ed.windowManager.open({file:url+'/pasteword.htm',width:450,height:400,inline:1},{plugin_url:url});}else t._insertWordContent(v);});ed.addCommand('mceSelectAll',function(){ed.execCommand('selectall');});ed.addButton('pastetext',{title:'paste.paste_text_desc',cmd:'mcePasteText',ui:true});ed.addButton('pasteword',{title:'paste.paste_word_desc',cmd:'mcePasteWord',ui:true});ed.addButton('selectall',{title:'paste.selectall_desc',cmd:'mceSelectAll'});if(ed.getParam("paste_auto_cleanup_on_paste",false)){ed.onPaste.add(function(ed,e){return t._handlePasteEvent(e)});}if(!tinymce.isIE&&ed.getParam("paste_auto_cleanup_on_paste",false)){ed.onKeyDown.add(function(ed,e){if(e.ctrlKey&&e.keyCode==86){window.setTimeout(function(){ed.execCommand("mcePasteText",true);},1);Event.cancel(e);}});}},getInfo:function(){return{longname:'Paste text/word',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/paste',version:tinymce.majorVersion+"."+tinymce.minorVersion};},_handlePasteEvent:function(e){var html=this._clipboardHTML(),ed=this.editor,sel=ed.selection,r;if(ed&&(r=sel.getRng())&&r.text.length>0)ed.execCommand('delete');if(html&&html.length>0)ed.execCommand('mcePasteWord',false,html);return Event.cancel(e);},_insertText:function(content,bLinebreaks){if(content&&content.length>0){if(bLinebreaks){if(this.editor.getParam("paste_create_paragraphs",true)){var rl=this.editor.getParam("paste_replace_list",'\u2122,<sup>TM</sup>,\u2026,...,\u201c|\u201d,",\u2019,\',\u2013|\u2014|\u2015|\u2212,-').split(',');for(var i=0;i<rl.length;i+=2)content=content.replace(new RegExp(rl[i],'gi'),rl[i+1]);content=content.replace(/\r\n\r\n/g,'</p><p>');content=content.replace(/\r\r/g,'</p><p>');content=content.replace(/\n\n/g,'</p><p>');if((pos=content.indexOf('</p><p>'))!=-1){this.editor.execCommand("Delete");var node=this.editor.selection.getNode();var breakElms=[];do{if(node.nodeType==1){if(node.nodeName=="TD"||node.nodeName=="BODY")break;breakElms[breakElms.length]=node;}}while(node=node.parentNode);var before="",after="</p>";before+=content.substring(0,pos);for(var i=0;i<breakElms.length;i++){before+="</"+breakElms[i].nodeName+">";after+="<"+breakElms[(breakElms.length-1)-i].nodeName+">";}before+="<p>";content=before+content.substring(pos+7)+after;}}if(this.editor.getParam("paste_create_linebreaks",true)){content=content.replace(/\r\n/g,'<br />');content=content.replace(/\r/g,'<br />');content=content.replace(/\n/g,'<br />');}}this.editor.execCommand("mceInsertRawHTML",false,content);}},_insertWordContent:function(content){var t=this,ed=t.editor;if(content&&content.length>0){var bull=String.fromCharCode(8226);var middot=String.fromCharCode(183);var cb;if((cb=this.editor.getParam("paste_insert_word_content_callback",""))!="")content=eval(cb+"('before', content)");var rl=this.editor.getParam("paste_replace_list",'\u2122,<sup>TM</sup>,\u2026,...,\u201c|\u201d,",\u2019,\',\u2013|\u2014|\u2015|\u2212,-').split(',');for(var i=0;i<rl.length;i+=2)content=content.replace(new RegExp(rl[i],'gi'),rl[i+1]);if(this.editor.getParam("paste_convert_headers_to_strong",false)){content=content.replace(new RegExp('<p class=MsoHeading.*?>(.*?)<\/p>','gi'),'<p><b>$1</b></p>');}content=content.replace(new RegExp('tab-stops: list [0-9]+.0pt">','gi'),'">'+"--list--");content=content.replace(new RegExp(bull+"(.*?)<BR>","gi"),"<p>"+middot+"$1</p>");content=content.replace(new RegExp('<SPAN style="mso-list: Ignore">','gi'),"<span>"+bull);content=content.replace(/<o:p><\/o:p>/gi,"");content=content.replace(new RegExp('<br style="page-break-before: always;.*>','gi'),'-- page break --');content=content.replace(new RegExp('<(!--)([^>]*)(--)>','g'),"");if(this.editor.getParam("paste_remove_spans",true))content=content.replace(/<\/?span[^>]*>/gi,"");if(this.editor.getParam("paste_remove_styles",true))content=content.replace(new RegExp('<(\\w[^>]*) style="([^"]*)"([^>]*)','gi'),"<$1$3");content=content.replace(/<\/?font[^>]*>/gi,"");switch(this.editor.getParam("paste_strip_class_attributes","all")){case"all":content=content.replace(/<(\w[^>]*) class=([^ |>]*)([^>]*)/gi,"<$1$3");break;case"mso":content=content.replace(new RegExp('<(\\w[^>]*) class="?mso([^ |>]*)([^>]*)','gi'),"<$1$3");break;}content=content.replace(new RegExp('href="?'+this._reEscape(""+document.location)+'','gi'),'href="'+this.editor.documentBaseURI.getURI());content=content.replace(/<(\w[^>]*) lang=([^ |>]*)([^>]*)/gi,"<$1$3");content=content.replace(/<\\?\?xml[^>]*>/gi,"");content=content.replace(/<\/?\w+:[^>]*>/gi,"");content=content.replace(/-- page break --\s*<p> <\/p>/gi,"");content=content.replace(/-- page break --/gi,"");if(!this.editor.getParam('force_p_newlines')){content=content.replace('','','gi');content=content.replace('</p>','<br /><br />','gi');}if(!tinymce.isIE&&!this.editor.getParam('force_p_newlines')){content=content.replace(/<\/?p[^>]*>/gi,"");}content=content.replace(/<\/?div[^>]*>/gi,"");if(this.editor.getParam("paste_convert_middot_lists",true)){var div=ed.dom.create("div",null,content);var className=this.editor.getParam("paste_unindented_list_class","unIndentedList");while(this._convertMiddots(div,"--list--"));while(this._convertMiddots(div,middot,className));while(this._convertMiddots(div,bull));content=div.innerHTML;}if(this.editor.getParam("paste_convert_headers_to_strong",false)){content=content.replace(/<h[1-6]> <\/h[1-6]>/gi,'<p> </p>');content=content.replace(/<h[1-6]>/gi,'<p><b>');content=content.replace(/<\/h[1-6]>/gi,'</b></p>');content=content.replace(/<b> <\/b>/gi,'<b> </b>');content=content.replace(/^( )*/gi,'');}content=content.replace(/--list--/gi,"");if((cb=this.editor.getParam("paste_insert_word_content_callback",""))!="")content=eval(cb+"('after', content)");this.editor.execCommand("mceInsertContent",false,content);if(this.editor.getParam('paste_force_cleanup_wordpaste',true)){var ed=this.editor;window.setTimeout(function(){ed.execCommand("mceCleanup");},1);}}},_reEscape:function(s){var l="?.\\*[](){}+^$:";var o="";for(var i=0;i<s.length;i++){var c=s.charAt(i);if(l.indexOf(c)!=-1)o+='\\'+c;else o+=c;}return o;},_convertMiddots:function(div,search,class_name){var mdot=String.fromCharCode(183);var bull=String.fromCharCode(8226);var nodes=div.getElementsByTagName("p");var prevul;for(var i=0;i<nodes.length;i++){var p=nodes[i];if(p.innerHTML.indexOf(search)==0){var ul=document.createElement("ul");if(class_name)ul.className=class_name;var li=document.createElement("li");li.innerHTML=p.innerHTML.replace(new RegExp(''+mdot+'|'+bull+'|--list--| ',"gi"),'');ul.appendChild(li);var np=p.nextSibling;while(np){if(np.nodeType==3&&new RegExp('^\\s$','m').test(np.nodeValue)){np=np.nextSibling;continue;}if(search==mdot){if(np.nodeType==1&&new RegExp('^o(\\s+| )').test(np.innerHTML)){if(!prevul){prevul=ul;ul=document.createElement("ul");prevul.appendChild(ul);}np.innerHTML=np.innerHTML.replace(/^o/,'');}else{if(prevul){ul=prevul;prevul=null;}if(np.nodeType!=1||np.innerHTML.indexOf(search)!=0)break;}}else{if(np.nodeType!=1||np.innerHTML.indexOf(search)!=0)break;}var cp=np.nextSibling;var li=document.createElement("li");li.innerHTML=np.innerHTML.replace(new RegExp(''+mdot+'|'+bull+'|--list--| ',"gi"),'');np.parentNode.removeChild(np);ul.appendChild(li);np=cp;}p.parentNode.replaceChild(ul,p);return true;}}return false;},_clipboardHTML:function(){var div=document.getElementById('_TinyMCE_clipboardHTML');if(!div){var div=document.createElement('DIV');div.id='_TinyMCE_clipboardHTML';with(div.style){visibility='hidden';overflow='hidden';position='absolute';width=1;height=1;}document.body.appendChild(div);}div.innerHTML='';var rng=document.body.createTextRange();rng.moveToElementText(div);rng.execCommand('Paste');var html=div.innerHTML;div.innerHTML='';return html;}});tinymce.PluginManager.add('paste',tinymce.plugins.PastePlugin);})(); -
trunk/wp-includes/js/tinymce/plugins/paste/pastetext.htm
r6632 r6694 3 3 <title>{#paste.paste_text_desc}</title> 4 4 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> 5 5 <script type="text/javascript" src="../../tiny_mce_popup.js"></script> 6 6 <script type="text/javascript" src="js/pastetext.js"></script> 7 <base target="_self" /> 7 <script type="text/javascript">tinyMCEPopup.onInit.add(function(){window.setTimeout(function(){document.getElementById('htmlSource').focus();},500);});</script> 8 <base target="_self" /> 8 9 </head> 9 10 <body onresize="resizeInputs();" style="display:none; overflow:hidden;"> … … 23 24 <div class="mceActionPanel"> 24 25 <div style="float: left"> 25 <input type="button" name=" insert" value="{#insert}" onclick="saveContent();" id="insert" />26 <input type="button" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" id="cancel" /> 26 27 </div> 27 28 28 29 <div style="float: right"> 29 <input type=" button" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" id="cancel" />30 <input type="submit" name="insert" value="{#insert}" onclick="saveContent();" id="insert" /> 30 31 </div> 31 32 </div> -
trunk/wp-includes/js/tinymce/plugins/paste/pasteword.htm
r6632 r6694 18 18 <div class="mceActionPanel"> 19 19 <div style="float: left"> 20 <input type="button" id=" insert" name="insert" value="{#insert}" onclick="saveContent();" />20 <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" /> 21 21 </div> 22 22 23 23 <div style="float: right"> 24 <input type=" button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />24 <input type="submit" id="insert" name="insert" value="{#insert}" onclick="saveContent();" /> 25 25 </div> 26 26 </div> -
trunk/wp-includes/js/tinymce/plugins/safari/editor_plugin.js
r6632 r6694 1 /** 2 * $Id: editor_plugin_src.js 264 2007-04-26 20:53:09Z spocke $ 3 * 4 * @author Moxiecode 5 * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved. 6 */ 7 8 (function() { 9 var Event = tinymce.dom.Event, grep = tinymce.grep, each = tinymce.each, inArray = tinymce.inArray, isOldWebKit = tinymce.isOldWebKit; 10 11 tinymce.create('tinymce.plugins.Safari', { 12 init : function(ed) { 13 var t = this, dom; 14 15 // Ignore on non webkit 16 if (!tinymce.isWebKit) 17 return; 18 19 t.editor = ed; 20 t.webKitFontSizes = ['x-small', 'small', 'medium', 'large', 'x-large', 'xx-large', '-webkit-xxx-large']; 21 t.namedFontSizes = ['xx-small', 'x-small','small','medium','large','x-large', 'xx-large']; 22 23 // Safari will crash if the build in createlink command is used 24 /* ed.addCommand('CreateLink', function(u, v) { 25 ed.execCommand("mceInsertContent", false, '<a href="' + dom.encode(v) + '">' + ed.selection.getContent() + '</a>'); 26 });*/ 27 28 // Workaround for FormatBlock bug, http://bugs.webkit.org/show_bug.cgi?id=16004 29 ed.addCommand('FormatBlock', function(u, v) { 30 var dom = ed.dom, e = dom.getParent(ed.selection.getNode(), dom.isBlock); 31 32 if (e) 33 dom.replace(dom.create(v), e, 1); 34 else 35 ed.getDoc().execCommand("FormatBlock", false, v); 36 }); 37 38 // Workaround for InsertHTML bug, http://bugs.webkit.org/show_bug.cgi?id=16382 39 ed.addCommand('mceInsertContent', function(u, v) { 40 ed.getDoc().execCommand("InsertText", false, 'mce_marker'); 41 ed.getBody().innerHTML = ed.getBody().innerHTML.replace(/mce_marker/g, v + '<span id="_mce_tmp">XX</span>'); 42 ed.selection.select(ed.dom.get('_mce_tmp')); 43 ed.getDoc().execCommand("Delete", false, ' '); 44 }); 45 46 // Workaround for List ID bug, http://bugs.webkit.org/show_bug.cgi?id=16004 47 /* function addList(c) { 48 var cb = Event.add(ed.getDoc(), 'DOMNodeInserted', function(e) { 49 e = e.target; 50 51 if (e.nodeName == 'OL' || e.nodeName == 'UL') 52 e.id = ''; 53 }); 54 55 ed.getDoc().execCommand(c, false, false); 56 Event.remove(ed.getDoc(), 'DOMNodeInserted', cb); 57 }; 58 59 ed.addCommand('InsertUnorderedList', function() {addList('InsertUnorderedList');}); 60 ed.addCommand('InsertOrderedList', function() {addList('InsertOrderedList');});*/ 61 62 // Safari returns incorrect values 63 ed.addQueryValueHandler('FontSize', function(u, v) { 64 var e, v; 65 66 // Check for the real font size at the start of selection 67 if ((e = ed.dom.getParent(ed.selection.getStart(), 'span')) && (v = e.style.fontSize)) 68 return tinymce.inArray(t.namedFontSizes, v) + 1; 69 70 // Check for the real font size at the end of selection 71 if ((e = ed.dom.getParent(ed.selection.getEnd(), 'span')) && (v = e.style.fontSize)) 72 return tinymce.inArray(t.namedFontSizes, v) + 1; 73 74 // Return default value it's better than nothing right! 75 return ed.getDoc().queryCommandValue('FontSize'); 76 }); 77 78 // Safari returns incorrect values 79 ed.addQueryValueHandler('FontName', function(u, v) { 80 var e, v; 81 82 // Check for the real font name at the start of selection 83 if ((e = ed.dom.getParent(ed.selection.getStart(), 'span')) && (v = e.style.fontFamily)) 84 return v.replace(/, /g, ','); 85 86 // Check for the real font name at the end of selection 87 if ((e = ed.dom.getParent(ed.selection.getEnd(), 'span')) && (v = e.style.fontFamily)) 88 return v.replace(/, /g, ','); 89 90 // Return default value it's better than nothing right! 91 return ed.getDoc().queryCommandValue('FontName'); 92 }); 93 94 // Workaround for bug, http://bugs.webkit.org/show_bug.cgi?id=12250 95 ed.onClick.add(function(ed, e) { 96 e = e.target; 97 98 if (e.nodeName == 'IMG') { 99 t.selElm = e; 100 ed.selection.select(e); 101 } else 102 t.selElm = null; 103 }); 104 105 ed.onBeforeExecCommand.add(function(ed, c, b) { 106 var r = t.bookmarkRng; 107 108 // Restore selection 109 if (r) { 110 ed.selection.setRng(r); 111 t.bookmarkRng = null; 112 //console.debug('restore', r.startContainer, r.startOffset, r.endContainer, r.endOffset); 113 } 114 }); 115 116 ed.onInit.add(function() { 117 t._fixWebKitSpans(); 118 119 ed.windowManager.onOpen.add(function() { 120 var r = ed.selection.getRng(); 121 122 // Store selection if valid 123 if (r.startContainer != ed.getDoc()) { 124 t.bookmarkRng = r.cloneRange(); 125 //console.debug('store', r.startContainer, r.startOffset, r.endContainer, r.endOffset); 126 } 127 }); 128 129 ed.windowManager.onClose.add(function() { 130 t.bookmarkRng = null; 131 }); 132 133 if (isOldWebKit) 134 t._patchSafari2x(ed); 135 }); 136 137 ed.onSetContent.add(function() { 138 dom = ed.dom; 139 140 // Convert strong,b,em,u,strike to spans 141 each(['strong','b','em','u','strike','sub','sup','a'], function(v) { 142 each(grep(dom.select(v)).reverse(), function(n) { 143 var nn = n.nodeName.toLowerCase(), st; 144 145 // Convert anchors into images 146 if (nn == 'a') { 147 if (n.name) 148 dom.replace(dom.create('img', {mce_name : 'a', name : n.name, 'class' : 'mceItemAnchor'}), n); 149 150 return; 151 } 152 153 switch (nn) { 154 case 'b': 155 case 'strong': 156 if (nn == 'b') 157 nn = 'strong'; 158 159 st = 'font-weight: bold;'; 160 break; 161 162 case 'em': 163 st = 'font-style: italic;'; 164 break; 165 166 case 'u': 167 st = 'text-decoration: underline;'; 168 break; 169 170 case 'sub': 171 st = 'vertical-align: sub;'; 172 break; 173 174 case 'sup': 175 st = 'vertical-align: super;'; 176 break; 177 178 case 'strike': 179 st = 'text-decoration: line-through;'; 180 break; 181 } 182 183 dom.replace(dom.create('span', {mce_name : nn, style : st, 'class' : 'Apple-style-span'}), n, 1); 184 }); 185 }); 186 }); 187 188 ed.onPreProcess.add(function(ed, o) { 189 dom = ed.dom; 190 191 each(grep(o.node.getElementsByTagName('span')).reverse(), function(n) { 192 var v, bg; 193 194 if (o.get) { 195 if (dom.hasClass(n, 'Apple-style-span')) { 196 bg = n.style.backgroundColor; 197 198 switch (dom.getAttrib(n, 'mce_name')) { 199 case 'font': 200 if (!ed.settings.convert_fonts_to_spans) 201 dom.setAttrib(n, 'style', ''); 202 break; 203 204 case 'strong': 205 case 'em': 206 case 'sub': 207 case 'sup': 208 dom.setAttrib(n, 'style', ''); 209 break; 210 211 case 'strike': 212 case 'u': 213 if (!ed.settings.inline_styles) 214 dom.setAttrib(n, 'style', ''); 215 else 216 dom.setAttrib(n, 'mce_name', ''); 217 218 break; 219 220 default: 221 if (!ed.settings.inline_styles) 222 dom.setAttrib(n, 'style', ''); 223 } 224 225 226 if (bg) 227 n.style.backgroundColor = bg; 228 } 229 } 230 231 if (dom.hasClass(n, 'mceItemRemoved')) 232 dom.remove(n, 1); 233 }); 234 }); 235 236 ed.onPostProcess.add(function(ed, o) { 237 // Safari adds BR at end of all block elements 238 o.content = o.content.replace(/<br \/><\/(h[1-6]|div|p|address|pre)>/g, '</$1>'); 239 240 // Safari adds id="undefined" to HR elements 241 o.content = o.content.replace(/ id=\"undefined\"/g, ''); 242 }); 243 }, 244 245 _fixWebKitSpans : function() { 246 var t = this, ed = t.editor; 247 248 if (!isOldWebKit) { 249 // Use mutator events on new WebKit 250 Event.add(ed.getDoc(), 'DOMNodeInserted', function(e) { 251 e = e.target; 252 253 if (e && e.nodeType == 1) 254 t._fixAppleSpan(e); 255 }); 256 } else { 257 // Do post command processing in old WebKit since the browser crashes on Mutator events :( 258 ed.onExecCommand.add(function() { 259 each(ed.dom.select('span'), function(n) { 260 t._fixAppleSpan(n); 261 }); 262 263 ed.nodeChanged(); 264 }); 265 } 266 }, 267 268 _fixAppleSpan : function(e) { 269 var ed = this.editor, dom = ed.dom, fz = this.webKitFontSizes, fzn = this.namedFontSizes, s = ed.settings, st, p; 270 271 if (dom.getAttrib(e, 'mce_fixed')) 272 return; 273 274 // Handle Apple style spans 275 if (e.nodeName == 'SPAN' && e.className == 'Apple-style-span') { 276 st = e.style; 277 278 if (!s.convert_fonts_to_spans) { 279 if (st.fontSize) { 280 dom.setAttrib(e, 'mce_name', 'font'); 281 dom.setAttrib(e, 'size', inArray(fz, st.fontSize) + 1); 282 } 283 284 if (st.fontFamily) { 285 dom.setAttrib(e, 'mce_name', 'font'); 286 dom.setAttrib(e, 'face', st.fontFamily); 287 } 288 289 if (st.color) { 290 dom.setAttrib(e, 'mce_name', 'font'); 291 dom.setAttrib(e, 'color', dom.toHex(st.color)); 292 } 293 294 if (st.backgroundColor) { 295 dom.setAttrib(e, 'mce_name', 'font'); 296 dom.setStyle(e, 'background-color', st.backgroundColor); 297 } 298 } else { 299 if (st.fontSize) 300 dom.setStyle(e, 'fontSize', fzn[inArray(fz, st.fontSize)]); 301 } 302 303 if (st.fontWeight == 'bold') 304 dom.setAttrib(e, 'mce_name', 'strong'); 305 306 if (st.fontStyle == 'italic') 307 dom.setAttrib(e, 'mce_name', 'em'); 308 309 if (st.textDecoration == 'underline') 310 dom.setAttrib(e, 'mce_name', 'u'); 311 312 if (st.textDecoration == 'line-through') 313 dom.setAttrib(e, 'mce_name', 'strike'); 314 315 if (st.verticalAlign == 'super') 316 dom.setAttrib(e, 'mce_name', 'sup'); 317 318 if (st.verticalAlign == 'sub') 319 dom.setAttrib(e, 'mce_name', 'sub'); 320 321 dom.setAttrib(e, 'mce_fixed', '1'); 322 } 323 }, 324 325 _patchSafari2x : function(ed) { 326 var t = this, setContent, getNode, dom = ed.dom, lr; 327 328 // Inline dialogs 329 if (ed.windowManager.onBeforeOpen) { 330 ed.windowManager.onBeforeOpen.add(function() { 331 r = ed.selection.getRng(); 332 }); 333 } 334 335 // Fake select on 2.x 336 ed.selection.select = function(n) { 337 this.getSel().setBaseAndExtent(n, 0, n, 1); 338 }; 339 340 getNode = ed.selection.getNode; 341 ed.selection.getNode = function() { 342 return t.selElm || getNode.call(this); 343 }; 344 345 // Fake range on Safari 2.x 346 ed.selection.getRng = function() { 347 var t = this, s = t.getSel(), d = ed.getDoc(), r, rb, ra, di; 348 349 // Fake range on Safari 2.x 350 if (s.anchorNode) { 351 r = d.createRange(); 352 353 try { 354 // Setup before range 355 rb = d.createRange(); 356 rb.setStart(s.anchorNode, s.anchorOffset); 357 rb.collapse(1); 358 359 // Setup after range 360 ra = d.createRange(); 361 ra.setStart(s.focusNode, s.focusOffset); 362 ra.collapse(1); 363 364 // Setup start/end points by comparing locations 365 di = rb.compareBoundaryPoints(rb.START_TO_END, ra) < 0; 366 r.setStart(di ? s.anchorNode : s.focusNode, di ? s.anchorOffset : s.focusOffset); 367 r.setEnd(di ? s.focusNode : s.anchorNode, di ? s.focusOffset : s.anchorOffset); 368 369 lr = r; 370 } catch (ex) { 371 // Sometimes fails, at least we tried to do it by the book. I hope Safari 2.x will go disappear soooon!!! 372 } 373 } 374 375 return r || lr; 376 }; 377 378 // Fix setContent so it works 379 setContent = ed.selection.setContent; 380 ed.selection.setContent = function(h, s) { 381 var r = this.getRng(), b; 382 383 try { 384 setContent.call(this, h, s); 385 } catch (ex) { 386 // Workaround for Safari 2.x 387 b = dom.create('body'); 388 b.innerHTML = h; 389 390 each(b.childNodes, function(n) { 391 r.insertNode(n.cloneNode(true)); 392 }); 393 } 394 }; 395 } 396 }); 397 398 // Register plugin 399 tinymce.PluginManager.add('safari', tinymce.plugins.Safari); 400 })(); 401 1 (function(){var Event=tinymce.dom.Event,grep=tinymce.grep,each=tinymce.each,inArray=tinymce.inArray,isOldWebKit=tinymce.isOldWebKit;tinymce.create('tinymce.plugins.Safari',{init:function(ed){var t=this,dom;if(!tinymce.isWebKit)return;t.editor=ed;t.webKitFontSizes=['x-small','small','medium','large','x-large','xx-large','-webkit-xxx-large'];t.namedFontSizes=['xx-small','x-small','small','medium','large','x-large','xx-large'];ed.addCommand('FormatBlock',function(u,v){var dom=ed.dom,e=dom.getParent(ed.selection.getNode(),dom.isBlock);if(e)dom.replace(dom.create(v),e,1);else ed.getDoc().execCommand("FormatBlock",false,v);});ed.addCommand('mceInsertContent',function(u,v){ed.getDoc().execCommand("InsertText",false,'mce_marker');ed.getBody().innerHTML=ed.getBody().innerHTML.replace(/mce_marker/g,v+'<span id="_mce_tmp">XX</span>');ed.selection.select(ed.dom.get('_mce_tmp'));ed.getDoc().execCommand("Delete",false,' ');});ed.onKeyPress.add(function(ed,e){if(e.keyCode==13&&e.shiftKey){t._insertBR(ed);Event.cancel(e);}});ed.addQueryValueHandler('FontSize',function(u,v){var e,v;if((e=ed.dom.getParent(ed.selection.getStart(),'span'))&&(v=e.style.fontSize))return tinymce.inArray(t.namedFontSizes,v)+1;if((e=ed.dom.getParent(ed.selection.getEnd(),'span'))&&(v=e.style.fontSize))return tinymce.inArray(t.namedFontSizes,v)+1;return ed.getDoc().queryCommandValue('FontSize');});ed.addQueryValueHandler('FontName',function(u,v){var e,v;if((e=ed.dom.getParent(ed.selection.getStart(),'span'))&&(v=e.style.fontFamily))return v.replace(/, /g,',');if((e=ed.dom.getParent(ed.selection.getEnd(),'span'))&&(v=e.style.fontFamily))return v.replace(/, /g,',');return ed.getDoc().queryCommandValue('FontName');});ed.onClick.add(function(ed,e){e=e.target;if(e.nodeName=='IMG'){t.selElm=e;ed.selection.select(e);}else t.selElm=null;});ed.onBeforeExecCommand.add(function(ed,c,b){var r=t.bookmarkRng;if(r){ed.selection.setRng(r);t.bookmarkRng=null;}});ed.onInit.add(function(){t._fixWebKitSpans();ed.windowManager.onOpen.add(function(){var r=ed.selection.getRng();if(r.startContainer!=ed.getDoc()){t.bookmarkRng=r.cloneRange();}});ed.windowManager.onClose.add(function(){t.bookmarkRng=null;});if(isOldWebKit)t._patchSafari2x(ed);});ed.onSetContent.add(function(){dom=ed.dom;each(['strong','b','em','u','strike','sub','sup','a'],function(v){each(grep(dom.select(v)).reverse(),function(n){var nn=n.nodeName.toLowerCase(),st;if(nn=='a'){if(n.name)dom.replace(dom.create('img',{mce_name:'a',name:n.name,'class':'mceItemAnchor'}),n);return;}switch(nn){case'b':case'strong':if(nn=='b')nn='strong';st='font-weight: bold;';break;case'em':st='font-style: italic;';break;case'u':st='text-decoration: underline;';break;case'sub':st='vertical-align: sub;';break;case'sup':st='vertical-align: super;';break;case'strike':st='text-decoration: line-through;';break;}dom.replace(dom.create('span',{mce_name:nn,style:st,'class':'Apple-style-span'}),n,1);});});});ed.onPreProcess.add(function(ed,o){dom=ed.dom;each(grep(o.node.getElementsByTagName('span')).reverse(),function(n){var v,bg;if(o.get){if(dom.hasClass(n,'Apple-style-span')){bg=n.style.backgroundColor;switch(dom.getAttrib(n,'mce_name')){case'font':if(!ed.settings.convert_fonts_to_spans)dom.setAttrib(n,'style','');break;case'strong':case'em':case'sub':case'sup':dom.setAttrib(n,'style','');break;case'strike':case'u':if(!ed.settings.inline_styles)dom.setAttrib(n,'style','');else dom.setAttrib(n,'mce_name','');break;default:if(!ed.settings.inline_styles)dom.setAttrib(n,'style','');}if(bg)n.style.backgroundColor=bg;}}if(dom.hasClass(n,'mceItemRemoved'))dom.remove(n,1);});});ed.onPostProcess.add(function(ed,o){o.content=o.content.replace(/<br \/><\/(h[1-6]|div|p|address|pre)>/g,'</$1>');o.content=o.content.replace(/ id=\"undefined\"/g,'');});},_fixWebKitSpans:function(){var t=this,ed=t.editor;if(!isOldWebKit){Event.add(ed.getDoc(),'DOMNodeInserted',function(e){e=e.target;if(e&&e.nodeType==1)t._fixAppleSpan(e);});}else{ed.onExecCommand.add(function(){each(ed.dom.select('span'),function(n){t._fixAppleSpan(n);});ed.nodeChanged();});}},_fixAppleSpan:function(e){var ed=this.editor,dom=ed.dom,fz=this.webKitFontSizes,fzn=this.namedFontSizes,s=ed.settings,st,p;if(dom.getAttrib(e,'mce_fixed'))return;if(e.nodeName=='SPAN'&&e.className=='Apple-style-span'){st=e.style;if(!s.convert_fonts_to_spans){if(st.fontSize){dom.setAttrib(e,'mce_name','font');dom.setAttrib(e,'size',inArray(fz,st.fontSize)+1);}if(st.fontFamily){dom.setAttrib(e,'mce_name','font');dom.setAttrib(e,'face',st.fontFamily);}if(st.color){dom.setAttrib(e,'mce_name','font');dom.setAttrib(e,'color',dom.toHex(st.color));}if(st.backgroundColor){dom.setAttrib(e,'mce_name','font');dom.setStyle(e,'background-color',st.backgroundColor);}}else{if(st.fontSize)dom.setStyle(e,'fontSize',fzn[inArray(fz,st.fontSize)]);}if(st.fontWeight=='bold')dom.setAttrib(e,'mce_name','strong');if(st.fontStyle=='italic')dom.setAttrib(e,'mce_name','em');if(st.textDecoration=='underline')dom.setAttrib(e,'mce_name','u');if(st.textDecoration=='line-through')dom.setAttrib(e,'mce_name','strike');if(st.verticalAlign=='super')dom.setAttrib(e,'mce_name','sup');if(st.verticalAlign=='sub')dom.setAttrib(e,'mce_name','sub');dom.setAttrib(e,'mce_fixed','1');}},_patchSafari2x:function(ed){var t=this,setContent,getNode,dom=ed.dom,lr;if(ed.windowManager.onBeforeOpen){ed.windowManager.onBeforeOpen.add(function(){r=ed.selection.getRng();});}ed.selection.select=function(n){this.getSel().setBaseAndExtent(n,0,n,1);};getNode=ed.selection.getNode;ed.selection.getNode=function(){return t.selElm||getNode.call(this);};ed.selection.getRng=function(){var t=this,s=t.getSel(),d=ed.getDoc(),r,rb,ra,di;if(s.anchorNode){r=d.createRange();try{rb=d.createRange();rb.setStart(s.anchorNode,s.anchorOffset);rb.collapse(1);ra=d.createRange();ra.setStart(s.focusNode,s.focusOffset);ra.collapse(1);di=rb.compareBoundaryPoints(rb.START_TO_END,ra)<0;r.setStart(di?s.anchorNode:s.focusNode,di?s.anchorOffset:s.focusOffset);r.setEnd(di?s.focusNode:s.anchorNode,di?s.focusOffset:s.anchorOffset);lr=r;}catch(ex){}}return r||lr;};setContent=ed.selection.setContent;ed.selection.setContent=function(h,s){var r=this.getRng(),b;try{setContent.call(this,h,s);}catch(ex){b=dom.create('body');b.innerHTML=h;each(b.childNodes,function(n){r.insertNode(n.cloneNode(true));});}};},_insertBR:function(ed){var dom=ed.dom,s=ed.selection,r=s.getRng(),br;r.insertNode(br=dom.create('br'));r.setStartAfter(br);r.setEndAfter(br);s.setRng(r);if(s.getSel().focusNode==br.previousSibling){s.select(dom.insertAfter(dom.doc.createTextNode('\u00a0'),br));s.collapse(1);}ed.getWin().scrollTo(0,dom.getPos(s.getRng().startContainer).y);}});tinymce.PluginManager.add('safari',tinymce.plugins.Safari);})(); -
trunk/wp-includes/js/tinymce/plugins/wordpress/editor_plugin.js
r6632 r6694 1 /* Import plugin specific language pack */ 2 //tinyMCE.importPluginLanguagePack('wordpress', 'en'); 1 /** 2 * Wordpress plugin. 3 */ 3 4 4 var TinyMCE_wordpressPlugin = { 5 getInfo : function() { 6 return { 7 longname : 'WordPress Plugin', 8 author : 'WordPress', 9 authorurl : 'http://wordpress.org', 10 infourl : 'http://wordpress.org', 11 version : '1' 12 }; 13 }, 5 (function() { 6 var DOM = tinymce.DOM; 14 7 15 getControlHTML : function(control_name) { 16 switch (control_name) { 17 case "wp_more": 18 return tinyMCE.getButtonHTML(control_name, 'lang_wordpress_more_button', '{$pluginurl}/images/more.gif', 'wpMore'); 19 case "wp_page": 20 return tinyMCE.getButtonHTML(control_name, 'lang_wordpress_page_button', '{$pluginurl}/images/page.gif', 'wpPage'); 21 case "wp_help": 22 var buttons = tinyMCE.getButtonHTML(control_name, 'lang_help_button_title', '{$pluginurl}/images/help.gif', 'wpHelp'); 23 var hiddenControls = '<div class="zerosize">' 24 + '<input type="button" accesskey="n" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceSpellCheck\',false);" />' 25 + '<input type="button" accesskey="k" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Strikethrough\',false);" />' 26 + '<input type="button" accesskey="l" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'InsertUnorderedList\',false);" />' 27 + '<input type="button" accesskey="o" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'InsertOrderedList\',false);" />' 28 + '<input type="button" accesskey="w" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Outdent\',false);" />' 29 + '<input type="button" accesskey="q" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Indent\',false);" />' 30 + '<input type="button" accesskey="f" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'JustifyLeft\',false);" />' 31 + '<input type="button" accesskey="c" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'JustifyCenter\',false);" />' 32 + '<input type="button" accesskey="r" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'JustifyRight\',false);" />' 33 + '<input type="button" accesskey="j" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'JustifyFull\',false);" />' 34 + '<input type="button" accesskey="a" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceLink\',true);" />' 35 + '<input type="button" accesskey="s" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'unlink\',false);" />' 36 + '<input type="button" accesskey="m" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceImage\',true);" />' 37 + '<input type="button" accesskey="t" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'wpMore\');" />' 38 + '<input type="button" accesskey="g" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'wpPage\');" />' 39 + '<input type="button" accesskey="u" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Undo\',false);" />' 40 + '<input type="button" accesskey="y" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Redo\',false);" />' 41 + '<input type="button" accesskey="h" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'wpHelp\',false);" />' 42 + '<input type="button" accesskey="b" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Bold\',false);" />' 43 + '<input type="button" accesskey="v" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'wpAdv\',false);" />' 44 + '</div>'; 45 return buttons+hiddenControls; 46 case "wp_adv": 47 return tinyMCE.getButtonHTML(control_name, 'lang_wordpress_adv_button', '{$pluginurl}/images/toolbars.gif', 'wpAdv'); 48 case "wp_adv_start": 49 return '<div id="wpadvbar" style="display:none;"><br />'; 50 case "wp_adv_end": 51 return '</div>'; 52 } 53 return ''; 54 }, 8 // Load plugin specific language pack 9 tinymce.PluginManager.requireLangPack('wordpress'); 55 10 56 execCommand : function(editor_id, element, command, user_interface, value) { 57 var inst = tinyMCE.getInstanceById(editor_id); 58 var focusElm = inst.getFocusElement(); 59 var doc = inst.getDoc(); 11 tinymce.create('tinymce.plugins.WordPress', { 12 init : function(ed, url) { 13 var t = this, tbId = ed.getParam('wordpress_adv_toolbar', 'toolbar2'); 14 var moreHTML = '<img src="' + url + '/img/trans.gif" class="mceWPmore mceItemNoResize" title="'+ed.getLang('wordpress.wp_more_alt')+'" />'; 15 var nextpageHTML = '<img src="' + url + '/img/trans.gif" class="mceWPnextpage mceItemNoResize" title="'+ed.getLang('wordpress.wp_page_alt')+'" />'; 60 16 61 function getAttrib(elm, name) { 62 return elm.getAttribute(name) ? elm.getAttribute(name) : ""; 63 } 17 // Hides the specified toolbar and resizes the iframe 18 ed.onPostRender.add(function() { 19 DOM.hide(ed.controlManager.get(tbId).id); 20 t._resizeIframe(ed, tbId, 28); 21 }); 64 22 65 // Handle commands 66 switch (command) { 67 case "wpMore": 68 var flag = ""; 69 var template = new Array(); 70 var altMore = tinyMCE.getLang('lang_wordpress_more_alt'); 23 // Register buttons 24 ed.addButton('wp_more', { 25 title : 'wordpress.wp_more_desc', 26 image : url + '/img/more.gif', 27 onclick : function() { 28 ed.execCommand('mceInsertContent', 0, moreHTML); 29 } 30 }); 71 31 72 // Is selection a image 73 if (focusElm != null && focusElm.nodeName.toLowerCase() == "img") { 74 flag = getAttrib(focusElm, 'class'); 32 ed.addButton('wp_page', { 33 title : 'wordpress.wp_page_desc', 34 image : url + '/img/page.gif', 35 onclick : function() { 36 // ed.execCommand('mcePageBreak'); 37 ed.execCommand('mceInsertContent', 0, nextpageHTML); 38 } 39 }); 75 40 76 if (flag != 'mce_plugin_wordpress_more') // Not a wordpress 77 return true; 41 ed.addButton('wp_help', { 42 title : 'wordpress.wp_help_desc', 43 image : url + '/img/help.gif', 44 onclick : function() { 45 ed.windowManager.open({ 46 url : tinymce.baseURL + '/wp-mce-help.php', 47 width : 450, 48 height : 420, 49 inline : 1 50 }); 51 } 52 }); 78 53 79 action = "update"; 80 } 54 ed.addButton('wp_adv', { 55 title : 'wordpress.wp_adv_desc', 56 image : url + '/img/toolbars.gif', 57 onclick : function() { 58 var id = ed.controlManager.get(tbId).id, cm = ed.controlManager; 81 59 82 html = '' 83 + '<img src="' + (tinyMCE.getParam("theme_href") + "/images/spacer.gif") + '" ' 84 + ' width="100%" height="10px" ' 85 + 'alt="'+altMore+'" title="'+altMore+'" class="mce_plugin_wordpress_more" name="mce_plugin_wordpress_more" />'; 86 tinyMCE.execInstanceCommand(editor_id, 'mceInsertContent', false, html); 87 tinyMCE.selectedInstance.repaint(); 88 return true; 89 90 case "wpPage": 91 var flag = ""; 92 var template = new Array(); 93 var altPage = tinyMCE.getLang('lang_wordpress_more_alt'); 94 95 // Is selection a image 96 if (focusElm != null && focusElm.nodeName.toLowerCase() == "img") { 97 flag = getAttrib(focusElm, 'name'); 98 99 if (flag != 'mce_plugin_wordpress_page') // Not a wordpress 100 return true; 101 102 action = "update"; 103 } 104 105 html = '' 106 + '<img src="' + (tinyMCE.getParam("theme_href") + "/images/spacer.gif") + '" ' 107 + ' width="100%" height="10px" ' 108 + 'alt="'+altPage+'" title="'+altPage+'" class="mce_plugin_wordpress_page" name="mce_plugin_wordpress_page" />'; 109 tinyMCE.execCommand("mceInsertContent",true,html); 110 tinyMCE.selectedInstance.repaint(); 111 return true; 112 113 case "wpHelp": 114 var template = new Array(); 115 116 template['file'] = tinyMCE.baseURL + '/wp-mce-help.php'; 117 template['width'] = 480; 118 template['height'] = 380; 119 120 args = { 121 resizable : 'yes', 122 scrollbars : 'yes' 123 }; 124 125 tinyMCE.openWindow(template, args); 126 return true; 127 case "wpAdv": 128 var adv = document.getElementById('wpadvbar'); 129 if ( adv.style.display == 'none' ) { 130 adv.style.display = 'block'; 131 tinyMCE.switchClass(editor_id + '_wp_adv', 'mceButtonSelected'); 132 } else { 133 adv.style.display = 'none'; 134 tinyMCE.switchClass(editor_id + '_wp_adv', 'mceButtonNormal'); 135 } 136 return true; 137 } 138 139 // Pass to next handler in chain 140 return false; 141 }, 142 143 cleanup : function(type, content) { 144 switch (type) { 145 146 case "insert_to_editor": 147 var startPos = 0; 148 var altMore = tinyMCE.getLang('lang_wordpress_more_alt'); 149 var altPage = tinyMCE.getLang('lang_wordpress_page_alt'); 150 151 // Parse all <!--more--> tags and replace them with images 152 while ((startPos = content.indexOf('<!--more', startPos)) != -1) { 153 var endPos = content.indexOf('-->', startPos) + 3; 154 // Insert image 155 var moreText = content.substring(startPos + 8, endPos - 3); 156 var contentAfter = content.substring(endPos); 157 content = content.substring(0, startPos); 158 content += '<img src="' + (tinyMCE.getParam("theme_href") + "/images/spacer.gif") + '" '; 159 content += ' width="100%" height="10px" moretext="'+moreText+'" '; 160 content += 'alt="'+altMore+'" title="'+altMore+'" class="mce_plugin_wordpress_more" name="mce_plugin_wordpress_more" />'; 161 content += contentAfter; 162 163 startPos++; 164 } 165 var startPos = 0; 166 167 // Parse all <!--page--> tags and replace them with images 168 while ((startPos = content.indexOf('<!--nextpage-->', startPos)) != -1) { 169 // Insert image 170 var contentAfter = content.substring(startPos + 15); 171 content = content.substring(0, startPos); 172 content += '<img src="' + (tinyMCE.getParam("theme_href") + "/images/spacer.gif") + '" '; 173 content += ' width="100%" height="10px" '; 174 content += 'alt="'+altPage+'" title="'+altPage+'" class="mce_plugin_wordpress_page" name="mce_plugin_wordpress_page" />'; 175 content += contentAfter; 176 177 startPos++; 178 } 179 180 // Look for \n in <pre>, replace with <br> 181 var startPos = -1; 182 while ((startPos = content.indexOf('<pre', startPos+1)) != -1) { 183 var endPos = content.indexOf('</pre>', startPos+1); 184 var innerPos = content.indexOf('>', startPos+1); 185 var chunkBefore = content.substring(0, innerPos); 186 var chunkAfter = content.substring(endPos); 187 188 var innards = content.substring(innerPos, endPos); 189 innards = innards.replace(/\n/g, '<br />'); 190 content = chunkBefore + innards + chunkAfter; 191 } 192 193 break; 194 195 case "get_from_editor": 196 // Parse all img tags and replace them with <!--more--> 197 var startPos = -1; 198 while ((startPos = content.indexOf('<img', startPos+1)) != -1) { 199 var endPos = content.indexOf('/>', startPos); 200 var attribs = this._parseAttributes(content.substring(startPos + 4, endPos)); 201 202 if (attribs['class'] == "mce_plugin_wordpress_more" || attribs['name'] == "mce_plugin_wordpress_more") { 203 endPos += 2; 204 205 var moreText = attribs['moretext'] ? attribs['moretext'] : ''; 206 var embedHTML = '<!--more'+moreText+'-->'; 207 208 // Insert embed/object chunk 209 chunkBefore = content.substring(0, startPos); 210 chunkAfter = content.substring(endPos); 211 content = chunkBefore + embedHTML + chunkAfter; 212 } 213 if (attribs['class'] == "mce_plugin_wordpress_page" || attribs['name'] == "mce_plugin_wordpress_page") { 214 endPos += 2; 215 216 var embedHTML = '<!--nextpage-->'; 217 218 // Insert embed/object chunk 219 chunkBefore = content.substring(0, startPos); 220 chunkAfter = content.substring(endPos); 221 content = chunkBefore + embedHTML + chunkAfter; 60 if (DOM.isHidden(id)) { 61 cm.setActive('wp_adv', 1); 62 DOM.show(id); 63 t._resizeIframe(ed, tbId, -28); 64 } else { 65 cm.setActive('wp_adv', 0); 66 DOM.hide(id); 67 t._resizeIframe(ed, tbId, 28); 222 68 } 223 69 } 70 }); 224 71 225 // Remove normal line breaks 226 content = content.replace(/\n|\r/g, ' '); 72 // Add listeners to handle more break 73 t._handleMoreBreak(ed, url); 74 }, 227 75 228 // Look for <br> in <pre>, replace with \n 229 var startPos = -1; 230 while ((startPos = content.indexOf('<pre', startPos+1)) != -1) { 231 var endPos = content.indexOf('</pre>', startPos+1); 232 var innerPos = content.indexOf('>', startPos+1); 233 var chunkBefore = content.substring(0, innerPos); 234 var chunkAfter = content.substring(endPos); 235 236 var innards = content.substring(innerPos, endPos); 237 innards = innards.replace(new RegExp('<br\\s?/?>', 'g'), '\n'); 238 innards = innards.replace(new RegExp('\\s$', ''), ''); 239 content = chunkBefore + innards + chunkAfter; 76 getInfo : function() { 77 return { 78 longname : 'WordPress Plugin', 79 author : 'WordPress', // add Moxiecode? 80 authorurl : 'http://wordpress.org', 81 infourl : 'http://wordpress.org', 82 version : '1.0a1' 83 }; 84 }, 85 86 // Internal functions 87 88 // Resizes the iframe by a relative height value 89 _resizeIframe : function(ed, tb_id, dy) { 90 var ifr = ed.getContentAreaContainer().firstChild; 91 92 DOM.setStyle(ifr, 'height', ifr.clientHeight + dy); // Resize iframe 93 ed.theme.deltaHeight += dy; // For resize cookie 94 }, 95 96 _handleMoreBreak : function(ed, url) { 97 var moreHTML = '<img src="' + url + '/img/trans.gif" alt="$1" class="mceWPmore mceItemNoResize" title="'+ed.getLang('wordpress.wp_more_alt')+'" />'; 98 var nextpageHTML = '<img src="' + url + '/img/trans.gif" class="mceWPnextpage mceItemNoResize" title="'+ed.getLang('wordpress.wp_page_alt')+'" />'; 99 100 // Load plugin specific CSS into editor 101 ed.onInit.add(function() { 102 ed.dom.loadCSS(url + '/css/content.css'); 103 }); 104 105 // Display morebreak instead if img in element path 106 ed.onPostRender.add(function() { 107 if (ed.theme.onResolveName) { 108 ed.theme.onResolveName.add(function(th, o) { 109 if (o.node.nodeName == 'IMG') { 110 if ( ed.dom.hasClass(o.node, 'mceWPmore') ) 111 o.name = 'wpmore'; 112 if ( ed.dom.hasClass(o.node, 'mceWPnextpage') ) 113 o.name = 'wppage'; 114 } 115 116 }); 240 117 } 118 }); 241 119 242 // Remove anonymous, empty paragraphs. 243 content = content.replace(new RegExp('<p>(\\s| )*</p>', 'mg'), ''); 120 // Replace morebreak with images 121 ed.onBeforeSetContent.add(function(ed, o) { 122 o.content = o.content.replace(/<!--more(.*?)-->/g, moreHTML); 123 o.content = o.content.replace(/<!--nextpage-->/g, nextpageHTML); 124 }); 244 125 245 // Handle table badness. 246 content = content.replace(new RegExp('<(table( [^>]*)?)>.*?<((tr|thead)( [^>]*)?)>', 'mg'), '<$1><$3>'); 247 content = content.replace(new RegExp('<((?:tr|thead|tfoot)(?: [^>]*)?)>.*?<((td|th)( [^>]*)?)>', 'mg'), '<$1><$2>'); 248 content = content.replace(new RegExp('</(td|th)>.*?<(td( [^>]*)?|th( [^>]*)?|/tr|/thead|/tfoot)>', 'mg'), '</$1><$2>'); 249 content = content.replace(new RegExp('</tr>.*?<(tr( [^>]*)?|/table)>', 'mg'), '</tr><$1>'); 250 content = content.replace(new RegExp('<(/?(table|tbody|tr|th|td)[^>]*)>(\\s*|(<br ?/?>)*)*', 'g'), '<$1>'); 126 // Replace images with morebreak 127 ed.onPostProcess.add(function(ed, o) { 128 if (o.get) 129 o.content = o.content.replace(/<img[^>]+>/g, function(im) { 130 if (im.indexOf('class="mceWPmore') !== -1) { 131 var m; 132 var moretext = (m = im.match(/alt="(.*?)"/)) ? m[1] : ''; 251 133 252 // Pretty it up for the source editor. 253 var blocklist = 'blockquote|ul|ol|li|table|thead|tr|th|td|div|h\\d|pre|p'; 254 content = content.replace(new RegExp('\\s*</('+blocklist+')>\\s*', 'mg'), '</$1>\n'); 255 content = content.replace(new RegExp('\\s*<(('+blocklist+')[^>]*)>', 'mg'), '\n<$1>'); 256 content = content.replace(new RegExp('<((li|/?tr|/?thead|/?tfoot)( [^>]*)?)>', 'g'), '\t<$1>'); 257 content = content.replace(new RegExp('<((td|th)( [^>]*)?)>', 'g'), '\t\t<$1>'); 258 content = content.replace(new RegExp('\\s*<br ?/?>\\s*', 'mg'), '<br />\n'); 259 content = content.replace(new RegExp('^\\s*', ''), ''); 260 content = content.replace(new RegExp('\\s*$', ''), ''); 134 im = '<!--more'+moretext+'-->'; 135 } 136 if (im.indexOf('class="mceWPnextpage') !== -1) 137 im = '<!--nextpage-->'; 138 139 return im; 140 }); 141 }); 261 142 262 break; 143 // Set active buttons if user selected pagebreak or more break 144 ed.onNodeChange.add(function(ed, cm, n) { 145 cm.setActive('wp_page', n.nodeName === 'IMG' && ed.dom.hasClass(n, 'mceWPnextpage')); 146 cm.setActive('wp_more', n.nodeName === 'IMG' && ed.dom.hasClass(n, 'mceWPmore')); 147 }); 263 148 } 149 }); 264 150 265 // Pass through to next handler in chain 266 return content; 267 }, 268 269 handleNodeChange : function(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) { 270 271 tinyMCE.switchClass(editor_id + '_wp_more', 'mceButtonNormal'); 272 tinyMCE.switchClass(editor_id + '_wp_page', 'mceButtonNormal'); 273 274 if (node == null) 275 return; 276 277 do { 278 if (node.nodeName.toLowerCase() == "img" && tinyMCE.getAttrib(node, 'class').indexOf('mce_plugin_wordpress_more') == 0) 279 tinyMCE.switchClass(editor_id + '_wp_more', 'mceButtonSelected'); 280 if (node.nodeName.toLowerCase() == "img" && tinyMCE.getAttrib(node, 'class').indexOf('mce_plugin_wordpress_page') == 0) 281 tinyMCE.switchClass(editor_id + '_wp_page', 'mceButtonSelected'); 282 } while ((node = node.parentNode)); 283 284 return true; 285 }, 286 287 saveCallback : function(el, content, body) { 288 // We have a TON of cleanup to do. 289 290 if ( tinyMCE.activeEditor.isHidden() ) { 291 // return content; 292 } 293 294 // Mark </p> if it has any attributes. 295 content = content.replace(new RegExp('(<p[^>]+>.*?)</p>', 'mg'), '$1</p#>'); 296 297 // Decode the ampersands of time. 298 // content = content.replace(new RegExp('&', 'g'), '&'); 299 300 // Get it ready for wpautop. 301 content = content.replace(new RegExp('\\s*<p>', 'mgi'), ''); 302 content = content.replace(new RegExp('\\s*</p>\\s*', 'mgi'), '\n\n'); 303 content = content.replace(new RegExp('\\n\\s*\\n', 'mgi'), '\n\n'); 304 content = content.replace(new RegExp('\\s*<br ?/?>\\s*', 'gi'), '\n'); 305 306 // Fix some block element newline issues 307 var blocklist = 'blockquote|ul|ol|li|table|thead|tr|th|td|div|h\\d|pre'; 308 content = content.replace(new RegExp('\\s*<(('+blocklist+') ?[^>]*)\\s*>', 'mg'), '\n<$1>'); 309 content = content.replace(new RegExp('\\s*</('+blocklist+')>\\s*', 'mg'), '</$1>\n'); 310 content = content.replace(new RegExp('<li>', 'g'), '\t<li>'); 311 312 if ( content.indexOf('<object') != -1 ) { 313 content = content.replace(new RegExp('\\s*<param([^>]*)>\\s*', 'g'), "<param$1>"); // no pee inside object/embed 314 content = content.replace(new RegExp('\\s*</embed>\\s*', 'g'), '</embed>'); 315 } 316 317 // Unmark special paragraph closing tags 318 content = content.replace(new RegExp('</p#>', 'g'), '</p>\n'); 319 content = content.replace(new RegExp('\\s*(<p[^>]+>.*</p>)', 'mg'), '\n$1'); 320 321 // Trim trailing whitespace 322 content = content.replace(new RegExp('\\s*$', ''), ''); 323 324 // Hope. 325 return content; 326 327 }, 328 329 _parseAttributes : function(attribute_string) { 330 var attributeName = ""; 331 var attributeValue = ""; 332 var withInName; 333 var withInValue; 334 var attributes = new Array(); 335 var whiteSpaceRegExp = new RegExp('^[ \n\r\t]+', 'g'); 336 var titleText = tinyMCE.getLang('lang_wordpress_more'); 337 var titleTextPage = tinyMCE.getLang('lang_wordpress_page'); 338 339 if (attribute_string == null || attribute_string.length < 2) 340 return null; 341 342 withInName = withInValue = false; 343 344 for (var i=0; i<attribute_string.length; i++) { 345 var chr = attribute_string.charAt(i); 346 347 if ((chr == '"' || chr == "'") && !withInValue) 348 withInValue = true; 349 else if ((chr == '"' || chr == "'") && withInValue) { 350 withInValue = false; 351 352 var pos = attributeName.lastIndexOf(' '); 353 if (pos != -1) 354 attributeName = attributeName.substring(pos+1); 355 356 attributes[attributeName.toLowerCase()] = attributeValue.substring(1); 357 358 attributeName = ""; 359 attributeValue = ""; 360 } else if (!whiteSpaceRegExp.test(chr) && !withInName && !withInValue) 361 withInName = true; 362 363 if (chr == '=' && withInName) 364 withInName = false; 365 366 if (withInName) 367 attributeName += chr; 368 369 if (withInValue) 370 attributeValue += chr; 371 } 372 373 return attributes; 374 } 375 }; 376 377 //tinyMCE.addPlugin("wordpress", TinyMCE_wordpressPlugin); 378 379 /* This little hack protects our More and Page placeholders from the removeformat command */ 380 tinyMCE.orgExecCommand = tinyMCE.execCommand; 381 tinyMCE.execCommand = function (command, user_interface, value) { 382 re = this.orgExecCommand(command, user_interface, value); 383 384 if ( command == 'removeformat' ) { 385 var inst = tinyMCE.getInstanceById('mce_editor_0'); 386 doc = inst.getDoc(); 387 var imgs = doc.getElementsByTagName('img'); 388 for (i=0;img=imgs[i];i++) 389 img.className = img.name; 390 } 391 return re; 392 }; 393 wpInstTriggerSave = function (skip_cleanup, skip_callback) { 394 var e, nl = new Array(), i, s; 395 396 this.switchSettings(); 397 s = tinyMCE.settings; 398 399 // Force hidden tabs visible while serializing 400 if (tinyMCE.isMSIE && !tinyMCE.isOpera) { 401 e = this.iframeElement; 402 403 do { 404 if (e.style && e.style.display == 'none') { 405 e.style.display = 'block'; 406 nl[nl.length] = {elm : e, type : 'style'}; 407 } 408 409 if (e.style && s.hidden_tab_class.length > 0 && e.className.indexOf(s.hidden_tab_class) != -1) { 410 e.className = s.display_tab_class; 411 nl[nl.length] = {elm : e, type : 'class'}; 412 } 413 } while ((e = e.parentNode) != null) 414 } 415 416 tinyMCE.settings['preformatted'] = false; 417 418 // Default to false 419 if (typeof(skip_cleanup) == "undefined") 420 skip_cleanup = false; 421 422 // Default to false 423 if (typeof(skip_callback) == "undefined") 424 skip_callback = false; 425 426 // tinyMCE._setHTML(this.getDoc(), this.getBody().innerHTML); 427 428 // Remove visual aids when cleanup is disabled 429 if (this.settings['cleanup'] == false) { 430 tinyMCE.handleVisualAid(this.getBody(), true, false, this); 431 tinyMCE._setEventsEnabled(this.getBody(), true); 432 } 433 434 tinyMCE._customCleanup(this, "submit_content_dom", this.contentWindow.document.body); 435 tinyMCE.selectedInstance.getWin().oldfocus=tinyMCE.selectedInstance.getWin().focus; 436 tinyMCE.selectedInstance.getWin().focus=function() {}; 437 var htm = tinyMCE._cleanupHTML(this, this.getDoc(), this.settings, this.getBody(), tinyMCE.visualAid, true, true); 438 tinyMCE.selectedInstance.getWin().focus=tinyMCE.selectedInstance.getWin().oldfocus; 439 htm = tinyMCE._customCleanup(this, "submit_content", htm); 440 441 if (!skip_callback && tinyMCE.settings['save_callback'] != "") 442 var content = eval(tinyMCE.settings['save_callback'] + "(this.formTargetElementId,htm,this.getBody());"); 443 444 // Use callback content if available 445 if ((typeof(content) != "undefined") && content != null) 446 htm = content; 447 448 // Replace some weird entities (Bug: #1056343) 449 htm = tinyMCE.regexpReplace(htm, "(", "(", "gi"); 450 htm = tinyMCE.regexpReplace(htm, ")", ")", "gi"); 451 htm = tinyMCE.regexpReplace(htm, ";", ";", "gi"); 452 htm = tinyMCE.regexpReplace(htm, """, """, "gi"); 453 htm = tinyMCE.regexpReplace(htm, "^", "^", "gi"); 454 455 if (this.formElement) 456 this.formElement.value = htm; 457 458 if (tinyMCE.isSafari && this.formElement) 459 this.formElement.innerText = htm; 460 461 // Hide them again (tabs in MSIE) 462 for (i=0; i<nl.length; i++) { 463 if (nl[i].type == 'style') 464 nl[i].elm.style.display = 'none'; 465 else 466 nl[i].elm.className = s.hidden_tab_class; 467 } 468 } 469 tinyMCE.wpTriggerSave = function () { 470 var inst, n; 471 for (n in tinyMCE.instances) { 472 inst = tinyMCE.instances[n]; 473 if (!tinyMCE.isInstance(inst)) 474 continue; 475 inst.wpTriggerSave = wpInstTriggerSave; 476 inst.wpTriggerSave(false, false); 477 } 478 } 479 480 function switchEditors(id) { 481 var inst = tinyMCE.getInstanceById(id); 482 var qt = document.getElementById('quicktags'); 483 var H = document.getElementById('edButtonHTML'); 484 var P = document.getElementById('edButtonPreview'); 485 var ta = document.getElementById(id); 486 var pdr = ta.parentNode; 487 488 if ( ! inst.isHidden(id) ) { 489 edToggle(H, P); 490 491 if ( tinyMCE.isMSIE && !tinyMCE.isOpera ) { 492 // IE rejects the later overflow assignment so we skip this step. 493 // Alternate code might be nice. Until then, IE reflows. 494 } else { 495 // Lock the fieldset's height to prevent reflow/flicker 496 pdr.style.height = pdr.clientHeight + 'px'; 497 pdr.style.overflow = 'hidden'; 498 } 499 500 // Save the coords of the bottom right corner of the rich editor 501 var table = document.getElementById(inst.editorId + '_parent').getElementsByTagName('table')[0]; 502 var y1 = table.offsetTop + table.offsetHeight; 503 504 if ( tinymce.util.Cookie.get("TinyMCE_" + inst.editorId + "_height") == null ) { 505 var expires = new Date(); 506 expires.setTime(expires.getTime() + 3600000 * 24 * 30); 507 var offset = tinyMCE.isMSIE ? 1 : 2; 508 tinymce.util.Cookie.set("TinyMCE_" + inst.editorId + "_height", "" + (table.offsetHeight - offset), expires); 509 } 510 511 // Unload the rich editor 512 // inst.triggerSave(false, false); 513 // inst.formElement.value; 514 inst.hide(); // tinyMCE.removeMCEControl(id); 515 // document.getElementById(id).value = htm; 516 // --tinyMCE.idCounter; 517 518 // Reveal Quicktags and textarea 519 qt.style.display = 'block'; 520 ta.style.display = 'inline'; 521 522 // Set the textarea height to match the rich editor 523 y2 = ta.offsetTop + ta.offsetHeight; 524 ta.style.height = (ta.clientHeight + y1 - y2) + 'px'; 525 526 // Tweak the widths 527 ta.parentNode.style.paddingRight = '12px'; 528 529 if ( tinyMCE.isMSIE && !tinyMCE.isOpera ) { 530 } else { 531 // Unlock the fieldset's height 532 pdr.style.height = 'auto'; 533 pdr.style.overflow = 'display'; 534 } 535 wpSetDefaultEditor( 'html' ); 536 } else { 537 edToggle(P, H); 538 edCloseAllTags(); // :-( 539 540 if ( tinyMCE.isMSIE && !tinyMCE.isOpera ) { 541 } else { 542 // Lock the fieldset's height 543 pdr.style.height = pdr.clientHeight + 'px'; 544 pdr.style.overflow = 'hidden'; 545 } 546 547 // Hide Quicktags and textarea 548 qt.style.display = 'none'; 549 ta.style.display = 'none'; 550 551 // Tweak the widths 552 ta.parentNode.style.paddingRight = '0px'; 553 554 // Load the rich editor with formatted html 555 //if ( tinyMCE.isMSIE ) { 556 // ta.value = wpautop(ta.value); 557 // tinyMCE.addMCEControl(ta, id); 558 //} else { 559 ta.value = wpautop(ta.value); 560 inst.show() // tinyMCE.addMCEControl(ta, id); 561 //tinyMCE.getInstanceById(id).execCommand('mceSetContent', null, htm); 562 //} 563 564 if ( tinyMCE.isMSIE && !tinyMCE.isOpera ) { 565 } else { 566 // Unlock the fieldset's height 567 pdr.style.height = 'auto'; 568 pdr.style.overflow = 'display'; 569 } 570 wpSetDefaultEditor( 'tinymce' ); 571 } 572 } 573 574 function edToggle(A, B) { 575 A.className = 'active'; 576 B.className = ''; 577 578 B.onclick = A.onclick; 579 A.onclick = null; 580 } 581 582 function wpSetDefaultEditor( editor ) { 583 try { 584 editor = escape( editor.toString() ); 585 } catch(err) { 586 editor = 'tinymce'; 587 } 588 589 var userID = document.getElementById('user-id'); 590 var date = new Date(); 591 date.setTime(date.getTime()+(10*365*24*60*60*1000)); 592 document.cookie = "wordpress_editor_" + userID.value + "=" + editor + "; expires=" + date.toGMTString(); 593 } 594 595 function wpautop(pee) { 596 pee = pee + "\n\n"; 597 pee = pee.replace(new RegExp('<br />\\s*<br />', 'gi'), "\n\n"); 598 pee = pee.replace(new RegExp('(<(?:table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|address|math|p|h[1-6])[^>]*>)', 'gi'), "\n$1"); 599 pee = pee.replace(new RegExp('(</(?:table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|address|math|p|h[1-6])>)', 'gi'), "$1\n\n"); 600 pee = pee.replace(new RegExp("\\r\\n|\\r", 'g'), "\n"); 601 pee = pee.replace(new RegExp("\\n\\s*\\n+", 'g'), "\n\n"); 602 pee = pee.replace(new RegExp('([\\s\\S]+?)\\n\\n', 'mg'), "<p>$1</p>\n"); 603 pee = pee.replace(new RegExp('<p>\\s*?</p>', 'gi'), ''); 604 pee = pee.replace(new RegExp('<p>\\s*(</?(?:table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|hr|pre|select|form|blockquote|address|math|p|h[1-6])[^>]*>)\\s*</p>', 'gi'), "$1"); 605 pee = pee.replace(new RegExp("<p>(<li.+?)</p>", 'gi'), "$1"); 606 pee = pee.replace(new RegExp('<p><blockquote([^>]*)>', 'gi'), "<blockquote$1><p>"); 607 pee = pee.replace(new RegExp('</blockquote></p>', 'gi'), '</p></blockquote>'); 608 pee = pee.replace(new RegExp('<p>\\s*(</?(?:table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|hr|pre|select|form|blockquote|address|math|p|h[1-6])[^>]*>)', 'gi'), "$1"); 609 pee = pee.replace(new RegExp('(</?(?:table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|address|math|p|h[1-6])[^>]*>)\\s*</p>', 'gi'), "$1"); 610 pee = pee.replace(new RegExp('\\s*\\n', 'gi'), "<br />\n"); 611 pee = pee.replace(new RegExp('(</?(?:table|thead|tfoot|caption|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|address|math|p|h[1-6])[^>]*>)\\s*<br />', 'gi'), "$1"); 612 pee = pee.replace(new RegExp('<br />(\\s*</?(?:p|li|div|dl|dd|dt|th|pre|td|ul|ol)>)', 'gi'), '$1'); 613 pee = pee.replace(new RegExp('^((?: )*)\\s', 'mg'), '$1 '); 614 //pee = pee.replace(new RegExp('(<pre.*?>)(.*?)</pre>!ise', " stripslashes('$1') . stripslashes(clean_pre('$2')) . '</pre>' "); // Hmm... 615 return pee; 616 } 151 // Register plugin 152 tinymce.PluginManager.add('wordpress', tinymce.plugins.WordPress); 153 })(); -
trunk/wp-includes/js/tinymce/plugins/wordpress/langs/en.js
r6641 r6694 1 // EN lang variables 2 3 if (navigator.userAgent.indexOf('Mac OS') != -1) { 4 // Mac OS browsers use Ctrl to hit accesskeys 5 var metaKey = 'Ctrl'; 6 } 7 else if (navigator.userAgent.indexOf('Firefox/2') != -1) { 8 // Firefox 2.x uses Alt+Shift to hit accesskeys 9 var metaKey = 'Alt+Shift'; 10 } 11 else { 12 var metaKey = 'Alt'; 13 } 14 15 tinyMCE.addI18n('',{ 16 wordpress_more_button : 'Split post with More tag (' + metaKey + '+t)', 17 wordpress_page_button : 'Split post with Page tag', 18 wordpress_adv_button : 'Show/Hide Advanced Toolbar (' + metaKey + '+v)', 19 wordpress_more_alt : 'More...', 20 wordpress_page_alt : '...page...', 21 help_button_title : 'Help (' + metaKey + '+h)', 22 bold_desc : 'Bold (Ctrl+B)', 23 italic_desc : 'Italic (Ctrl+I)', 24 underline_desc : 'Underline (Ctrl+U)', 25 link_desc : 'Insert/edit link (' + metaKey + '+a)', 26 unlink_desc : 'Unlink (' + metaKey + '+s)', 27 image_desc : 'Insert/edit image (' + metaKey + '+m)', 28 striketrough_desc : 'Strikethrough (' + metaKey + '+k)', 29 justifyleft_desc : 'Align left (' + metaKey + '+f)', 30 justifycenter_desc : 'Align center (' + metaKey + '+c)', 31 justifyright_desc : 'Align right (' + metaKey + '+r)', 32 justifyfull_desc : 'Align full (' + metaKey + '+j)', 33 bullist_desc : 'Unordered list (' + metaKey + '+l)', 34 numlist_desc : 'Ordered list (' + metaKey + '+o)', 35 outdent_desc : 'Outdent (' + metaKey + '+w)', 36 indent_desc : 'Indent list/blockquote (' + metaKey + '+q)' 1 tinyMCE.addI18n('en.wordpress',{ 2 wp_adv_desc : 'Show/Hide Advanced Toolbar', 3 wp_more_desc : 'Split post with More tag', 4 wp_page_desc : 'Split post with Page tag', 5 wp_help_desc : 'Help', 6 wp_more_alt : 'More...', 7 wp_page_alt : 'Next page...' 37 8 }); -
trunk/wp-includes/js/tinymce/themes/advanced/anchor.htm
r6632 r6694 3 3 <head> 4 4 <title>{#advanced_dlg.anchor_title}</title> 5 5 <script type="text/javascript" src="../../tiny_mce_popup.js"></script> 6 6 <script type="text/javascript" src="js/anchor.js"></script> 7 <base target="_self" /> 7 <script type="text/javascript">tinyMCEPopup.onInit.add(function(){window.setTimeout(function(){document.getElementById('anchorName').focus();},500);});</script> 8 <base target="_self" /> 8 9 </head> 9 10 <body style="display: none"> … … 21 22 <div class="mceActionPanel"> 22 23 <div style="float: left"> 23 <input type="button" id=" insert" name="insert" value="{#update}" onclick="AnchorDialog.update();" />24 <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" /> 24 25 </div> 25 26 26 27 <div style="float: right"> 27 <input type=" button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />28 <input type="submit" id="insert" name="insert" value="{#update}" onclick="AnchorDialog.update();" /> 28 29 </div> 29 30 </div> -
trunk/wp-includes/js/tinymce/themes/advanced/charmap.htm
r6632 r6694 8 8 </head> 9 9 <body style="display: none"> 10 <table align="center" border="0" cellspacing="0" cellpadding="2">10 <table style="background:#fff;" align="center" border="0" cellspacing="0" cellpadding="2"> 11 11 <tr> 12 12 <td colspan="2" class="title">{#advanced_dlg.charmap_title}</td> -
trunk/wp-includes/js/tinymce/themes/advanced/editor_template.js
r6632 r6694 1 /** 2 * $Id: editor_template_src.js 520 2008-01-07 16:30:32Z spocke $ 3 * 4 * @author Moxiecode 5 * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved. 6 */ 7 8 (function() { 9 var DOM = tinymce.DOM, Event = tinymce.dom.Event, extend = tinymce.extend, each = tinymce.each, Cookie = tinymce.util.Cookie, lastExtID; 10 11 // Tell it to load theme specific language pack(s) 12 tinymce.ThemeManager.requireLangPack('advanced'); 13 14 tinymce.create('tinymce.themes.AdvancedTheme', { 15 // Control name lookup, format: title, command 16 controls : { 17 bold : ['bold_desc', 'Bold'], 18 italic : ['italic_desc', 'Italic'], 19 underline : ['underline_desc', 'Underline'], 20 strikethrough : ['striketrough_desc', 'Strikethrough'], 21 justifyleft : ['justifyleft_desc', 'JustifyLeft'], 22 justifycenter : ['justifycenter_desc', 'JustifyCenter'], 23 justifyright : ['justifyright_desc', 'JustifyRight'], 24 justifyfull : ['justifyfull_desc', 'JustifyFull'], 25 bullist : ['bullist_desc', 'InsertUnorderedList'], 26 numlist : ['numlist_desc', 'InsertOrderedList'], 27 outdent : ['outdent_desc', 'Outdent'], 28 indent : ['indent_desc', 'Indent'], 29 cut : ['cut_desc', 'Cut'], 30 copy : ['copy_desc', 'Copy'], 31 paste : ['paste_desc', 'Paste'], 32 undo : ['undo_desc', 'Undo'], 33 redo : ['redo_desc', 'Redo'], 34 link : ['link_desc', 'mceLink'], 35 unlink : ['unlink_desc', 'unlink'], 36 image : ['image_desc', 'mceImage'], 37 cleanup : ['cleanup_desc', 'mceCleanup'], 38 help : ['help_desc', 'mceHelp'], 39 code : ['code_desc', 'mceCodeEditor'], 40 hr : ['hr_desc', 'InsertHorizontalRule'], 41 removeformat : ['removeformat_desc', 'RemoveFormat'], 42 sub : ['sub_desc', 'subscript'], 43 sup : ['sup_desc', 'superscript'], 44 forecolor : ['forecolor_desc', 'ForeColor'], 45 forecolorpicker : ['forecolor_desc', 'mceForeColor'], 46 backcolor : ['backcolor_desc', 'HiliteColor'], 47 backcolorpicker : ['backcolor_desc', 'mceBackColor'], 48 charmap : ['charmap_desc', 'mceCharMap'], 49 visualaid : ['visualaid_desc', 'mceToggleVisualAid'], 50 anchor : ['anchor_desc', 'mceInsertAnchor'], 51 newdocument : ['newdocument_desc', 'mceNewDocument'], 52 blockquote : ['blockquote_desc', 'mceBlockQuote'] 53 }, 54 55 stateControls : ['bold', 'italic', 'underline', 'strikethrough', 'bullist', 'numlist', 'justifyleft', 'justifycenter', 'justifyright', 'justifyfull', 'sub', 'sup', 'blockquote'], 56 57 init : function(ed, url) { 58 var t = this, s; 59 60 t.editor = ed; 61 t.url = url; 62 t.onResolveName = new tinymce.util.Dispatcher(this); 63 64 // Default settings 65 t.settings = s = extend({ 66 theme_advanced_path : true, 67 theme_advanced_toolbar_location : 'bottom', 68 theme_advanced_buttons1 : "bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,styleselect,formatselect", 69 theme_advanced_buttons2 : "bullist,numlist,|,outdent,indent,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code", 70 theme_advanced_buttons3 : "hr,removeformat,visualaid,|,sub,sup,|,charmap", 71 theme_advanced_blockformats : "p,address,pre,h1,h2,h3,h4,h5,h6", 72 theme_advanced_toolbar_align : "center", 73 theme_advanced_fonts : "Andale Mono=andale mono,times;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier;Georgia=georgia,palatino;Helvetica=helvetica;Impact=impact,chicago;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco;Times New Roman=times new roman,times;Trebuchet MS=trebuchet ms,geneva;Verdana=verdana,geneva;Webdings=webdings;Wingdings=wingdings,zapf dingbats", 74 theme_advanced_font_sizes : "1,2,3,4,5,6,7", 75 theme_advanced_more_colors : 1, 76 theme_advanced_row_height : 23, 77 theme_advanced_resize_horizontal : 1, 78 theme_advanced_resizing_use_cookie : 1 79 }, ed.settings); 80 81 if (s.theme_advanced_statusbar_location == 'none') 82 s.theme_advanced_statusbar_location = 0; 83 84 // Init editor 85 ed.onInit.add(function() { 86 ed.onNodeChange.add(t._nodeChanged, t); 87 ed.dom.loadCSS(ed.baseURI.toAbsolute("themes/advanced/skins/" + ed.settings.skin + "/content.css")); 88 }); 89 90 ed.onSetProgressState.add(function(ed, b, ti) { 91 var co, id = ed.id, tb; 92 93 if (b) { 94 t.progressTimer = setTimeout(function() { 95 co = ed.getContainer(); 96 co = co.insertBefore(DOM.create('DIV', {style : 'position:relative'}), co.firstChild); 97 tb = DOM.get(ed.id + '_tbl'); 98 99 DOM.add(co, 'div', {id : id + '_blocker', 'class' : 'mceBlocker', style : {width : tb.clientWidth + 2, height : tb.clientHeight + 2}}); 100 DOM.add(co, 'div', {id : id + '_progress', 'class' : 'mceProgress', style : {left : tb.clientWidth / 2, top : tb.clientHeight / 2}}); 101 }, ti || 0); 102 } else { 103 DOM.remove(id + '_blocker'); 104 DOM.remove(id + '_progress'); 105 clearTimeout(t.progressTimer); 106 } 107 }); 108 109 DOM.loadCSS(ed.baseURI.toAbsolute(s.editor_css || "themes/advanced/skins/" + ed.settings.skin + "/ui.css")); 110 }, 111 112 createControl : function(n, cf) { 113 var cd, c; 114 115 if (c = cf.createControl(n)) 116 return c; 117 118 switch (n) { 119 case "styleselect": 120 return this._createStyleSelect(); 121 122 case "formatselect": 123 return this._createBlockFormats(); 124 125 case "fontselect": 126 return this._createFontSelect(); 127 128 case "fontsizeselect": 129 return this._createFontSizeSelect(); 130 131 case "forecolor": 132 return this._createForeColorMenu(); 133 134 case "backcolor": 135 return this._createBackColorMenu(); 136 } 137 138 if ((cd = this.controls[n])) 139 return cf.createButton(n, {title : "advanced." + cd[0], cmd : cd[1], ui : cd[2], value : cd[3]}); 140 }, 141 142 execCommand : function(cmd, ui, val) { 143 var f = this['_' + cmd]; 144 145 if (f) { 146 f.call(this, ui, val); 147 return true; 148 } 149 150 return false; 151 }, 152 153 _importClasses : function() { 154 var ed = this.editor, c = ed.controlManager.get('styleselect'); 155 156 if (c.getLength() == 0) { 157 each(ed.dom.getClasses(), function(o) { 158 c.add(o['class'], o['class']); 159 }); 160 } 161 }, 162 163 _createStyleSelect : function(n) { 164 var t = this, ed = t.editor, cf = ed.controlManager, c = cf.createListBox('styleselect', { 165 title : 'advanced.style_select', 166 onselect : function(v) { 167 if (c.selectedValue === v) { 168 ed.execCommand('mceSetStyleInfo', 0, {command : 'removeformat'}); 169 c.select(); 170 return false; 171 } else 172 ed.execCommand('mceSetCSSClass', 0, v); 173 } 174 }); 175 176 each((t.settings.theme_advanced_styles || '').split(';'), function(v) { 177 var p = v.split('='); 178 179 if (v) 180 c.add(t.editor.translate(p[0]), p[1]); 181 }); 182 183 c.onPostRender.add(function(ed, n) { 184 Event.add(n, 'focus', t._importClasses, t); 185 Event.add(n, 'mousedown', t._importClasses, t); 186 }); 187 188 return c; 189 }, 190 191 _createFontSelect : function() { 192 var c, t = this; 193 194 c = t.editor.controlManager.createListBox('fontselect', {title : 'advanced.fontdefault', cmd : 'FontName'}); 195 196 each(t.settings.theme_advanced_fonts.split(';'), function(v) { 197 var p = v.split('='), st; 198 199 if (p[1].indexOf('dings') == -1) 200 st = 'font-family:' + p[1]; 201 202 c.add(t.editor.translate(p[0]), p[1], {style : st}); 203 }); 204 205 return c; 206 }, 207 208 _createFontSizeSelect : function() { 209 var c, t = this, lo = [ 210 "1 (8 pt)", 211 "2 (10 pt)", 212 "3 (12 pt)", 213 "4 (14 pt)", 214 "5 (18 pt)", 215 "6 (24 pt)", 216 "7 (36 pt)" 217 ], fz = [8, 10, 12, 14, 18, 24, 36]; 218 219 c = t.editor.controlManager.createListBox('fontsizeselect', {title : 'advanced.font_size', cmd : 'FontSize'}); 220 221 each(t.settings.theme_advanced_font_sizes.split(','), function(v) { 222 c.add(lo[parseInt(v) - 1], v, {'style' : 'font-size:' + fz[v - 1] + 'pt', 'class' : 'fontSize' + v}); 223 }); 224 225 return c; 226 }, 227 228 _createBlockFormats : function() { 229 var c, fmts = { 230 p : 'advanced.paragraph', 231 address : 'advanced.address', 232 pre : 'advanced.pre', 233 h1 : 'advanced.h1', 234 h2 : 'advanced.h2', 235 h3 : 'advanced.h3', 236 h4 : 'advanced.h4', 237 h5 : 'advanced.h5', 238 h6 : 'advanced.h6', 239 div : 'advanced.div', 240 blockquote : 'advanced.blockquote', 241 code : 'advanced.code', 242 dt : 'advanced.dt', 243 dd : 'advanced.dd', 244 samp : 'advanced.samp' 245 }, t = this; 246 247 c = t.editor.controlManager.createListBox('formatselect', {title : 'advanced.block', cmd : 'FormatBlock'}); 248 249 each(t.settings.theme_advanced_blockformats.split(','), function(v) { 250 c.add(t.editor.translate(fmts[v]), v, {element : v, 'class' : v.indexOf('h') == 0 ? '' : 'preview'}); 251 }); 252 253 return c; 254 }, 255 256 _createForeColorMenu : function() { 257 var c, t = this, s = t.settings, o = {}, v; 258 259 if (s.theme_advanced_more_colors) { 260 o.more_colors_func = function() { 261 t._mceColorPicker(0, { 262 color : c.value, 263 func : function(co) { 264 c.setColor(co); 265 } 266 }); 267 }; 268 } 269 270 if (v = s.theme_advanced_text_colors) 271 o.colors = v; 272 273 o.title = 'advanced.forecolor_desc'; 274 o.cmd = 'ForeColor'; 275 o.scope = this; 276 277 c = t.editor.controlManager.createColorSplitButton('forecolor', o); 278 279 return c; 280 }, 281 282 _createBackColorMenu : function() { 283 var c, t = this, s = t.settings, o = {}, v; 284 285 if (s.theme_advanced_more_colors) { 286 o.more_colors_func = function() { 287 t._mceColorPicker(0, { 288 color : c.value, 289 func : function(co) { 290 c.setColor(co); 291 } 292 }); 293 }; 294 } 295 296 if (v = s.theme_advanced_background_colors) 297 o.colors = v; 298 299 o.title = 'advanced.backcolor_desc'; 300 o.cmd = 'HiliteColor'; 301 o.scope = this; 302 303 c = t.editor.controlManager.createColorSplitButton('backcolor', o); 304 305 return c; 306 }, 307 308 renderUI : function(o) { 309 var n, ic, tb, t = this, ed = t.editor, s = t.settings, sc, p, nl; 310 311 n = p = DOM.create('div', {id : ed.id + '_parent', 'class' : 'mceEditor ' + ed.settings.skin + 'Skin'}); 312 313 if (!DOM.boxModel) 314 n = DOM.add(n, 'div', {'class' : 'mceOldBoxModel'}); 315 316 n = sc = DOM.add(n, 'table', {id : ed.id + '_tbl', 'class' : 'mceLayout', cellSpacing : 0, cellPadding : 0}); 317 n = tb = DOM.add(n, 'tbody'); 318 319 switch ((s.theme_advanced_layout_manager || '').toLowerCase()) { 320 case "rowlayout": 321 ic = t._rowLayout(s, tb, o); 322 break; 323 324 case "customlayout": 325 ic = ed.execCallback("theme_advanced_custom_layout", s, tb, o, p); 326 break; 327 328 default: 329 ic = t._simpleLayout(s, tb, o, p); 330 } 331 332 n = o.targetNode; 333 334 // Add classes to first and last TRs 335 nl = sc.rows; 336 DOM.addClass(nl[0], 'first'); 337 DOM.addClass(nl[nl.length - 1], 'last'); 338 339 // Add classes to first and last TDs 340 each(DOM.select('tr', tb), function(n) { 341 DOM.addClass(n.firstChild, 'first'); 342 DOM.addClass(n.childNodes[n.childNodes.length - 1], 'last'); 343 }); 344 345 if (DOM.get(s.theme_advanced_toolbar_container)) 346 DOM.get(s.theme_advanced_toolbar_container).appendChild(p); 347 else 348 DOM.insertAfter(p, n); 349 350 Event.add(ed.id + '_path_row', 'click', function(e) { 351 e = e.target; 352 353 if (e.nodeName == 'A') { 354 t._sel(e.href.replace(/^[^#]*#/, '')); 355 356 return Event.cancel(e); 357 } 358 }); 359 /* 360 if (DOM.get(ed.id + '_path_row')) { 361 Event.add(ed.id + '_tbl', 'mouseover', function(e) { 362 var re; 363 364 e = e.target; 365 366 if (e.nodeName == 'SPAN' && DOM.hasClass(e.parentNode, 'mceButton')) { 367 re = DOM.get(ed.id + '_path_row'); 368 t.lastPath = re.innerHTML; 369 DOM.setHTML(re, e.parentNode.title); 370 } 371 }); 372 373 Event.add(ed.id + '_tbl', 'mouseout', function(e) { 374 if (t.lastPath) { 375 DOM.setHTML(ed.id + '_path_row', t.lastPath); 376 t.lastPath = 0; 377 } 378 }); 379 } 380 */ 381 if (s.theme_advanced_toolbar_location == 'external') 382 o.deltaHeight = 0; 383 384 t.deltaHeight = o.deltaHeight; 385 o.targetNode = null; 386 387 return { 388 iframeContainer : ic, 389 editorContainer : ed.id + '_parent', 390 sizeContainer : sc, 391 deltaHeight : o.deltaHeight 392 }; 393 }, 394 395 getInfo : function() { 396 return { 397 longname : 'Simple theme', 398 author : 'Moxiecode Systems AB', 399 authorurl : 'http://tinymce.moxiecode.com', 400 version : tinymce.majorVersion + "." + tinymce.minorVersion 401 } 402 }, 403 404 _simpleLayout : function(s, tb, o, p) { 405 var t = this, ed = t.editor, lo = s.theme_advanced_toolbar_location, sl = s.theme_advanced_statusbar_location, n, ic, etb, c; 406 407 // Create toolbar container at top 408 if (lo == 'top') 409 t._addToolbars(tb, o); 410 411 // Create external toolbar 412 if (lo == 'external') { 413 n = c = DOM.create('div', {style : 'position:relative'}); 414 n = DOM.add(n, 'div', {id : ed.id + '_external', 'class' : 'mceExternalToolbar'}); 415 DOM.add(n, 'a', {id : ed.id + '_external_close', href : 'javascript:;', 'class' : 'mceExternalClose'}); 416 n = DOM.add(n, 'table', {id : ed.id + '_tblext', cellSpacing : 0, cellPadding : 0}); 417 etb = DOM.add(n, 'tbody'); 418 419 if (p.firstChild.className == 'mceOldBoxModel') 420 p.firstChild.appendChild(c); 421 else 422 p.insertBefore(c, p.firstChild); 423 424 t._addToolbars(etb, o); 425 426 ed.onMouseUp.add(function() { 427 var e = DOM.get(ed.id + '_external'); 428 DOM.show(e); 429 430 DOM.hide(lastExtID); 431 432 var f = Event.add(ed.id + '_external_close', 'click', function() { 433 DOM.hide(ed.id + '_external'); 434 Event.remove(ed.id + '_external_close', 'click', f); 435 }); 436 437 DOM.show(e); 438 DOM.setStyle(e, 'top', 0 - DOM.getRect(ed.id + '_tblext').h - 1); 439 440 // Fixes IE rendering bug 441 DOM.hide(e); 442 DOM.show(e); 443 e.style.filter = ''; 444 445 lastExtID = ed.id + '_external'; 446 447 e = null; 448 }); 449 } 450 451 if (sl == 'top') 452 t._addStatusBar(tb, o); 453 454 // Create iframe container 455 if (!s.theme_advanced_toolbar_container) { 456 n = DOM.add(tb, 'tr'); 457 n = ic = DOM.add(n, 'td', {'class' : 'mceIframeContainer'}); 458 } 459 460 // Create toolbar container at bottom 461 if (lo == 'bottom') 462 t._addToolbars(tb, o); 463 464 if (sl == 'bottom') 465 t._addStatusBar(tb, o); 466 467 return ic; 468 }, 469 470 _rowLayout : function(s, tb, o) { 471 var t = this, ed = t.editor, dc, da, cf = ed.controlManager, n, ic, to; 472 473 dc = s.theme_advanced_containers_default_class || ''; 474 da = s.theme_advanced_containers_default_align || 'center'; 475 476 each((s.theme_advanced_containers || '').split(','), function(c, i) { 477 var v = s['theme_advanced_container_' + c].toLowerCase(); 478 479 switch (v) { 480 case 'mceeditor': 481 n = DOM.add(tb, 'tr'); 482 n = ic = DOM.add(n, 'td', {'class' : 'mceIframeContainer'}); 483 break; 484 485 case 'mceelementpath': 486 t._addStatusBar(tb, o); 487 break; 488 489 default: 490 n = DOM.add(DOM.add(tb, 'tr'), 'td', { 491 'class' : 'mceToolbar ' + (s['theme_advanced_container_' + c + '_class'] || dc), 492 align : s['theme_advanced_container_' + c + '_align'] || da 493 }); 494 495 to = cf.createToolbar("toolbar" + i); 496 t._addControls(v, to); 497 DOM.setHTML(n, to.renderHTML()); 498 o.deltaHeight -= s.theme_advanced_row_height; 499 } 500 }); 501 502 return ic; 503 }, 504 505 _addControls : function(v, tb) { 506 var t = this, s = t.settings, di, cf = t.editor.controlManager; 507 508 if (s.theme_advanced_disable && !t._disabled) { 509 di = {}; 510 511 each(s.theme_advanced_disable.split(','), function(v) { 512 di[v] = 1; 513 }); 514 515 t._disabled = di; 516 } else 517 di = t._disabled; 518 519 each(v.split(','), function(n) { 520 var c; 521 522 if (di && di[n]) 523 return; 524 525 // Compatiblity with 2.x 526 if (n == 'tablecontrols') { 527 each(["table","|","row_props","cell_props","|","row_before","row_after","delete_row","|","col_before","col_after","delete_col","|","split_cells","merge_cells"], function(n) { 528 n = t.createControl(n, cf); 529 530 if (n) 531 tb.add(n); 532 }); 533 534 return; 535 } 536 537 c = t.createControl(n, cf); 538 539 if (c) 540 tb.add(c); 541 }); 542 }, 543 544 _addToolbars : function(c, o) { 545 var t = this, i, tb, ed = t.editor, s = t.settings, v, cf = ed.controlManager, di, n, h = []; 546 547 n = DOM.add(DOM.add(c, 'tr'), 'td', {'class' : 'mceToolbar', align : s.theme_advanced_toolbar_align}); 548 549 if (!ed.getParam('accessibility_focus') || ed.getParam('tab_focus')) 550 h.push(DOM.createHTML('a', {href : '#', onfocus : 'tinyMCE.get(\'' + ed.id + '\').focus();'}, '<!-- IE -->')); 551 552 h.push(DOM.createHTML('a', {href : '#', accesskey : 'q', title : ed.getLang("advanced.toolbar_focus")}, '<!-- IE -->')); 553 554 // Create toolbar and add the controls 555 for (i=1; (v = s['theme_advanced_buttons' + i]); i++) { 556 tb = cf.createToolbar("toolbar" + i, {'class' : 'mceToolbarRow' + i}); 557 558 if (s['theme_advanced_buttons' + i + '_add']) 559 v += ',' + s['theme_advanced_buttons' + i + '_add']; 560 561 if (s['theme_advanced_buttons' + i + '_add_before']) 562 v = s['theme_advanced_buttons' + i + '_add_before'] + ',' + v; 563 564 t._addControls(v, tb, di); 565 566 //n.appendChild(n = tb.render()); 567 h.push(tb.renderHTML()); 568 569 o.deltaHeight -= s.theme_advanced_row_height; 570 } 571 572 h.push(DOM.createHTML('a', {href : '#', accesskey : 'z', title : ed.getLang("advanced.toolbar_focus"), onfocus : 'tinyMCE.getInstanceById(\'' + ed.id + '\').focus();'}, '<!-- IE -->')); 573 DOM.setHTML(n, h.join('')); 574 }, 575 576 _addStatusBar : function(tb, o) { 577 var n, t = this, ed = t.editor, s = t.settings, r, mf, me, td; 578 579 n = DOM.add(tb, 'tr'); 580 n = td = DOM.add(n, 'td', {'class' : 'mceStatusbar'}); 581 n = DOM.add(n, 'div', {id : ed.id + '_path_row'}, s.theme_advanced_path ? ed.translate('advanced.path') + ': ' : ' '); 582 DOM.add(n, 'a', {href : '#', accesskey : 'x'}); 583 584 if (s.theme_advanced_resizing && !tinymce.isOldWebKit) { 585 DOM.add(td, 'a', {id : ed.id + '_resize', href : 'javascript:;', onclick : "return false;", 'class' : 'resize'}); 586 587 if (s.theme_advanced_resizing_use_cookie) { 588 ed.onPostRender.add(function() { 589 var o = Cookie.getHash("TinyMCE_" + ed.id + "_size"), c = DOM.get(ed.id + '_tbl'); 590 591 if (!o) 592 return; 593 594 if (s.theme_advanced_resize_horizontal) 595 c.style.width = o.cw + 'px'; 596 597 c.style.height = o.ch + 'px'; 598 DOM.get(ed.id + '_ifr').style.height = (parseInt(o.ch) + t.deltaHeight) + 'px'; 599 }); 600 } 601 602 ed.onPostRender.add(function() { 603 Event.add(ed.id + '_resize', 'mousedown', function(e) { 604 var c, p, w, h, n, pa; 605 606 // Measure container 607 c = DOM.get(ed.id + '_tbl'); 608 w = c.clientWidth; 609 h = c.clientHeight; 610 611 miw = s.theme_advanced_resizing_min_width || 100; 612 mih = s.theme_advanced_resizing_min_height || 100; 613 maw = s.theme_advanced_resizing_max_width || 0xFFFF; 614 mah = s.theme_advanced_resizing_max_height || 0xFFFF; 615 616 // Setup placeholder 617 p = DOM.add(DOM.get(ed.id + '_parent'), 'div', {'class' : 'mcePlaceHolder'}); 618 DOM.setStyles(p, {width : w, height : h}); 619 620 // Replace with placeholder 621 DOM.hide(c); 622 DOM.show(p); 623 624 // Create internal resize obj 625 r = { 626 x : e.screenX, 627 y : e.screenY, 628 w : w, 629 h : h, 630 dx : null, 631 dy : null 632 }; 633 634 // Start listening 635 mf = Event.add(document, 'mousemove', function(e) { 636 var w, h; 637 638 // Calc delta values 639 r.dx = e.screenX - r.x; 640 r.dy = e.screenY - r.y; 641 642 // Boundery fix box 643 w = Math.max(miw, r.w + r.dx); 644 h = Math.max(mih, r.h + r.dy); 645 w = Math.min(maw, w); 646 h = Math.min(mah, h); 647 648 // Resize placeholder 649 if (s.theme_advanced_resize_horizontal) 650 p.style.width = w + 'px'; 651 652 p.style.height = h + 'px'; 653 654 return Event.cancel(e); 655 }); 656 657 me = Event.add(document, 'mouseup', function(e) { 658 var ifr; 659 660 // Stop listening 661 Event.remove(document, 'mousemove', mf); 662 Event.remove(document, 'mouseup', me); 663 664 c.style.display = ''; 665 DOM.remove(p); 666 667 if (r.dx === null) 668 return; 669 670 ifr = DOM.get(ed.id + '_ifr'); 671 672 if (s.theme_advanced_resize_horizontal) 673 c.style.width = (r.w + r.dx) + 'px'; 674 675 c.style.height = (r.h + r.dy) + 'px'; 676 ifr.style.height = (ifr.clientHeight + r.dy) + 'px'; 677 678 if (s.theme_advanced_resizing_use_cookie) { 679 Cookie.setHash("TinyMCE_" + ed.id + "_size", { 680 cw : r.w + r.dx, 681 ch : r.h + r.dy 682 }); 683 } 684 }); 685 686 return Event.cancel(e); 687 }); 688 }); 689 } 690 691 o.deltaHeight -= 21; 692 n = tb = null; 693 }, 694 695 _nodeChanged : function(ed, cm, n, co) { 696 var t = this, p, de = 0, v, c, s = t.settings; 697 698 tinymce.each(t.stateControls, function(c) { 699 cm.setActive(c, ed.queryCommandState(t.controls[c][1])); 700 }); 701 702 cm.setActive('visualaid', ed.hasVisual); 703 cm.setDisabled('undo', !ed.undoManager.hasUndo() && !ed.typing); 704 cm.setDisabled('redo', !ed.undoManager.hasRedo()); 705 cm.setDisabled('outdent', !ed.queryCommandState('Outdent')); 706 707 p = DOM.getParent(n, 'A'); 708 if (c = cm.get('link')) { 709 if (!p || !p.name) { 710 c.setDisabled(!p && co); 711 c.setActive(!!p); 712 } 713 } 714 715 if (c = cm.get('unlink')) { 716 c.setDisabled(!p && co); 717 c.setActive(!!p && !p.name); 718 } 719 720 if (c = cm.get('anchor')) { 721 c.setActive(!!p && p.name); 722 723 if (tinymce.isWebKit) { 724 p = DOM.getParent(n, 'IMG'); 725 c.setActive(!!p && DOM.getAttrib(p, 'mce_name') == 'a'); 726 } 727 } 728 729 p = DOM.getParent(n, 'IMG'); 730 if (c = cm.get('image')) 731 c.setActive(!!p && n.className.indexOf('mceItem') == -1); 732 733 if (c = cm.get('styleselect')) { 734 if (n.className) { 735 t._importClasses(); 736 c.select(n.className); 737 } else 738 c.select(); 739 } 740 741 if (c = cm.get('formatselect')) { 742 p = DOM.getParent(n, DOM.isBlock); 743 744 if (p) 745 c.select(p.nodeName.toLowerCase()); 746 } 747 748 if (c = cm.get('fontselect')) 749 c.select(ed.queryCommandValue('FontName')); 750 751 if (c = cm.get('fontsizeselect')) 752 c.select(ed.queryCommandValue('FontSize')); 753 754 if (s.theme_advanced_path && s.theme_advanced_statusbar_location) { 755 p = DOM.get(ed.id + '_path') || DOM.add(ed.id + '_path_row', 'span', {id : ed.id + '_path'}); 756 DOM.setHTML(p, ''); 757 758 ed.dom.getParent(n, function(n) { 759 var na = n.nodeName.toLowerCase(), u, pi, ti = ''; 760 761 // Ignore non element and hidden elements 762 if (n.nodeType != 1 || (DOM.hasClass(n, 'mceItemHidden') || DOM.hasClass(n, 'mceItemRemoved'))) 763 return; 764 765 // Fake name 766 if (v = DOM.getAttrib(n, 'mce_name')) 767 na = v; 768 769 // Handle prefix 770 if (tinymce.isIE && n.scopeName !== 'HTML') 771 na = n.scopeName + ':' + na; 772 773 // Remove internal prefix 774 na = na.replace(/mce\:/g, ''); 775 776 // Handle node name 777 switch (na) { 778 case 'b': 779 na = 'strong'; 780 break; 781 782 case 'i': 783 na = 'em'; 784 break; 785 786 case 'img': 787 if (v = DOM.getAttrib(n, 'src')) 788 ti += 'src: ' + v + ' '; 789 790 break; 791 792 case 'a': 793 if (v = DOM.getAttrib(n, 'name')) { 794 ti += 'name: ' + v + ' '; 795 na += '#' + v; 796 } 797 798 if (v = DOM.getAttrib(n, 'href')) 799 ti += 'href: ' + v + ' '; 800 801 break; 802 803 case 'font': 804 if (s.convert_fonts_to_spans) 805 na = 'span'; 806 807 if (v = DOM.getAttrib(n, 'face')) 808 ti += 'font: ' + v + ' '; 809 810 if (v = DOM.getAttrib(n, 'size')) 811 ti += 'size: ' + v + ' '; 812 813 if (v = DOM.getAttrib(n, 'color')) 814 ti += 'color: ' + v + ' '; 815 816 break; 817 818 case 'span': 819 if (v = DOM.getAttrib(n, 'style')) 820 ti += 'style: ' + v + ' '; 821 822 break; 823 } 824 825 if (v = DOM.getAttrib(n, 'id')) 826 ti += 'id: ' + v + ' '; 827 828 if (v = n.className) { 829 v = v.replace(/(webkit-[\w\-]+|Apple-[\w\-]+|mceItem\w+|mceVisualAid)/g, ''); 830 831 if (v && v.indexOf('mceItem') == -1) { 832 ti += 'class: ' + v + ' '; 833 834 if (DOM.isBlock(n) || na == 'img' || na == 'span') 835 na += '.' + v; 836 } 837 } 838 839 na = na.replace(/(html:)/g, ''); 840 na = {name : na, node : n, title : ti}; 841 t.onResolveName.dispatch(t, na); 842 ti = na.title; 843 na = na.name; 844 845 //u = "javascript:tinymce.EditorManager.get('" + ed.id + "').theme._sel('" + (de++) + "');"; 846 pi = DOM.create('a', {'href' : "#" + (de++) + "", onmousedown : "return false;", title : ti}, na); 847 848 if (p.hasChildNodes()) { 849 p.insertBefore(document.createTextNode(' \u00bb '), p.firstChild); 850 p.insertBefore(pi, p.firstChild); 851 } else 852 p.appendChild(pi); 853 }, ed.getBody()); 854 } 855 }, 856 857 // Commands gets called by execCommand 858 859 _sel : function(v) { 860 this.editor.execCommand('mceSelectNodeDepth', false, v); 861 }, 862 863 _mceInsertAnchor : function(ui, v) { 864 var ed = this.editor; 865 866 ed.windowManager.open({ 867 url : tinymce.baseURL + '/themes/advanced/anchor.htm', 868 width : 320 + parseInt(ed.getLang('advanced.anchor_delta_width', 0)), 869 height : 90 + parseInt(ed.getLang('advanced.anchor_delta_height', 0)), 870 inline : true 871 }, { 872 theme_url : this.url 873 }); 874 }, 875 876 _mceCharMap : function() { 877 var ed = this.editor; 878 879 ed.windowManager.open({ 880 url : tinymce.baseURL + '/themes/advanced/charmap.htm', 881 width : 550 + parseInt(ed.getLang('advanced.charmap_delta_width', 0)), 882 height : 250 + parseInt(ed.getLang('advanced.charmap_delta_height', 0)), 883 inline : true 884 }, { 885 theme_url : this.url 886 }); 887 }, 888 889 _mceHelp : function() { 890 var ed = this.editor; 891 892 ed.windowManager.open({ 893 url : tinymce.baseURL + '/themes/advanced/about.htm', 894 width : 480, 895 height : 380, 896 inline : true 897 }, { 898 theme_url : this.url 899 }); 900 }, 901 902 _mceColorPicker : function(u, v) { 903 var ed = this.editor; 904 905 v = v || {}; 906 907 ed.windowManager.open({ 908 url : tinymce.baseURL + '/themes/advanced/color_picker.htm', 909 width : 375 + parseInt(ed.getLang('advanced.colorpicker_delta_width', 0)), 910 height : 250 + parseInt(ed.getLang('advanced.colorpicker_delta_height', 0)), 911 close_previous : false, 912 inline : true 913 }, { 914 input_color : v.color, 915 func : v.func, 916 theme_url : this.url 917 }); 918 }, 919 920 _mceCodeEditor : function(ui, val) { 921 var ed = this.editor; 922 923 ed.windowManager.open({ 924 url : tinymce.baseURL + '/themes/advanced/source_editor.htm', 925 width : parseInt(ed.getParam("theme_advanced_source_editor_width", 720)), 926 height : parseInt(ed.getParam("theme_advanced_source_editor_height", 580)), 927 inline : true, 928 resizable : true, 929 maximizable : true 930 }, { 931 theme_url : this.url 932 }); 933 }, 934 935 _mceImage : function(ui, val) { 936 var ed = this.editor; 937 938 ed.windowManager.open({ 939 url : tinymce.baseURL + '/themes/advanced/image.htm', 940 width : 355 + parseInt(ed.getLang('advanced.image_delta_width', 0)), 941 height : 275 + parseInt(ed.getLang('advanced.image_delta_height', 0)), 942 inline : true 943 }, { 944 theme_url : this.url 945 }); 946 }, 947 948 _mceLink : function(ui, val) { 949 var ed = this.editor; 950 951 ed.windowManager.open({ 952 url : tinymce.baseURL + '/themes/advanced/link.htm', 953 width : 310 + parseInt(ed.getLang('advanced.link_delta_width', 0)), 954 height : 200 + parseInt(ed.getLang('advanced.link_delta_height', 0)), 955 inline : true 956 }, { 957 theme_url : this.url 958 }); 959 }, 960 961 _mceNewDocument : function() { 962 var ed = this.editor; 963 964 ed.windowManager.confirm('advanced.newdocument', function(s) { 965 if (s) 966 ed.execCommand('mceSetContent', false, ''); 967 }); 968 }, 969 970 _mceForeColor : function() { 971 var t = this; 972 973 this._mceColorPicker(0, { 974 func : function(co) { 975 t.editor.execCommand('ForeColor', false, co); 976 } 977 }); 978 }, 979 980 _mceBackColor : function() { 981 var t = this; 982 983 this._mceColorPicker(0, { 984 func : function(co) { 985 t.editor.execCommand('HiliteColor', false, co); 986 } 987 }); 988 } 989 }); 990 991 tinymce.ThemeManager.add('advanced', tinymce.themes.AdvancedTheme); 992 }()); 1 (function(){var DOM=tinymce.DOM,Event=tinymce.dom.Event,extend=tinymce.extend,each=tinymce.each,Cookie=tinymce.util.Cookie,lastExtID;tinymce.ThemeManager.requireLangPack('advanced');tinymce.create('tinymce.themes.AdvancedTheme',{controls:{bold:['bold_desc','Bold'],italic:['italic_desc','Italic'],underline:['underline_desc','Underline'],strikethrough:['striketrough_desc','Strikethrough'],justifyleft:['justifyleft_desc','JustifyLeft'],justifycenter:['justifycenter_desc','JustifyCenter'],justifyright:['justifyright_desc','JustifyRight'],justifyfull:['justifyfull_desc','JustifyFull'],bullist:['bullist_desc','InsertUnorderedList'],numlist:['numlist_desc','InsertOrderedList'],outdent:['outdent_desc','Outdent'],indent:['indent_desc','Indent'],cut:['cut_desc','Cut'],copy:['copy_desc','Copy'],paste:['paste_desc','Paste'],undo:['undo_desc','Undo'],redo:['redo_desc','Redo'],link:['link_desc','mceLink'],unlink:['unlink_desc','unlink'],image:['image_desc','mceImage'],cleanup:['cleanup_desc','mceCleanup'],help:['help_desc','mceHelp'],code:['code_desc','mceCodeEditor'],hr:['hr_desc','InsertHorizontalRule'],removeformat:['removeformat_desc','RemoveFormat'],sub:['sub_desc','subscript'],sup:['sup_desc','superscript'],forecolor:['forecolor_desc','ForeColor'],forecolorpicker:['forecolor_desc','mceForeColor'],backcolor:['backcolor_desc','HiliteColor'],backcolorpicker:['backcolor_desc','mceBackColor'],charmap:['charmap_desc','mceCharMap'],visualaid:['visualaid_desc','mceToggleVisualAid'],anchor:['anchor_desc','mceInsertAnchor'],newdocument:['newdocument_desc','mceNewDocument'],blockquote:['blockquote_desc','mceBlockQuote']},stateControls:['bold','italic','underline','strikethrough','bullist','numlist','justifyleft','justifycenter','justifyright','justifyfull','sub','sup','blockquote'],init:function(ed,url){var t=this,s;t.editor=ed;t.url=url;t.onResolveName=new tinymce.util.Dispatcher(this);t.settings=s=extend({theme_advanced_path:true,theme_advanced_toolbar_location:'bottom',theme_advanced_buttons1:"bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,styleselect,formatselect",theme_advanced_buttons2:"bullist,numlist,|,outdent,indent,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code",theme_advanced_buttons3:"hr,removeformat,visualaid,|,sub,sup,|,charmap",theme_advanced_blockformats:"p,address,pre,h1,h2,h3,h4,h5,h6",theme_advanced_toolbar_align:"center",theme_advanced_fonts:"Andale Mono=andale mono,times;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier;Georgia=georgia,palatino;Helvetica=helvetica;Impact=impact,chicago;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco;Times New Roman=times new roman,times;Trebuchet MS=trebuchet ms,geneva;Verdana=verdana,geneva;Webdings=webdings;Wingdings=wingdings,zapf dingbats",theme_advanced_font_sizes:"1,2,3,4,5,6,7",theme_advanced_more_colors:1,theme_advanced_row_height:23,theme_advanced_resize_horizontal:1,theme_advanced_resizing_use_cookie:1},ed.settings);if(s.theme_advanced_path_location)s.theme_advanced_statusbar_location=s.theme_advanced_path_location;if(s.theme_advanced_statusbar_location=='none')s.theme_advanced_statusbar_location=0;ed.onInit.add(function(){ed.onNodeChange.add(t._nodeChanged,t);ed.dom.loadCSS(ed.baseURI.toAbsolute("themes/advanced/skins/"+ed.settings.skin+"/content.css"));});ed.onSetProgressState.add(function(ed,b,ti){var co,id=ed.id,tb;if(b){t.progressTimer=setTimeout(function(){co=ed.getContainer();co=co.insertBefore(DOM.create('DIV',{style:'position:relative'}),co.firstChild);tb=DOM.get(ed.id+'_tbl');DOM.add(co,'div',{id:id+'_blocker','class':'mceBlocker',style:{width:tb.clientWidth+2,height:tb.clientHeight+2}});DOM.add(co,'div',{id:id+'_progress','class':'mceProgress',style:{left:tb.clientWidth/ 2, top : tb.clientHeight /2}});},ti||0);}else{DOM.remove(id+'_blocker');DOM.remove(id+'_progress');clearTimeout(t.progressTimer);}});DOM.loadCSS(ed.baseURI.toAbsolute(s.editor_css||"themes/advanced/skins/"+ed.settings.skin+"/ui.css"));},createControl:function(n,cf){var cd,c;if(c=cf.createControl(n))return c;switch(n){case"styleselect":return this._createStyleSelect();case"formatselect":return this._createBlockFormats();case"fontselect":return this._createFontSelect();case"fontsizeselect":return this._createFontSizeSelect();case"forecolor":return this._createForeColorMenu();case"backcolor":return this._createBackColorMenu();}if((cd=this.controls[n]))return cf.createButton(n,{title:"advanced."+cd[0],cmd:cd[1],ui:cd[2],value:cd[3]});},execCommand:function(cmd,ui,val){var f=this['_'+cmd];if(f){f.call(this,ui,val);return true;}return false;},_importClasses:function(){var ed=this.editor,c=ed.controlManager.get('styleselect');if(c.getLength()==0){each(ed.dom.getClasses(),function(o){c.add(o['class'],o['class']);});}},_createStyleSelect:function(n){var t=this,ed=t.editor,cf=ed.controlManager,c=cf.createListBox('styleselect',{title:'advanced.style_select',onselect:function(v){if(c.selectedValue===v){ed.execCommand('mceSetStyleInfo',0,{command:'removeformat'});c.select();return false;}else ed.execCommand('mceSetCSSClass',0,v);}});each((t.settings.theme_advanced_styles||'').split(';'),function(v){var p=v.split('=');if(v)c.add(t.editor.translate(p[0]),p[1]);});c.onPostRender.add(function(ed,n){Event.add(n,'focus',t._importClasses,t);Event.add(n,'mousedown',t._importClasses,t);});return c;},_createFontSelect:function(){var c,t=this;c=t.editor.controlManager.createListBox('fontselect',{title:'advanced.fontdefault',cmd:'FontName'});each(t.settings.theme_advanced_fonts.split(';'),function(v){var p=v.split('='),st;if(p[1].indexOf('dings')==-1)st='font-family:'+p[1];c.add(t.editor.translate(p[0]),p[1],{style:st});});return c;},_createFontSizeSelect:function(){var c,t=this,lo=["1 (8 pt)","2 (10 pt)","3 (12 pt)","4 (14 pt)","5 (18 pt)","6 (24 pt)","7 (36 pt)"],fz=[8,10,12,14,18,24,36];c=t.editor.controlManager.createListBox('fontsizeselect',{title:'advanced.font_size',cmd:'FontSize'});each(t.settings.theme_advanced_font_sizes.split(','),function(v){c.add(lo[parseInt(v)-1],v,{'style':'font-size:'+fz[v-1]+'pt','class':'fontSize'+v});});return c;},_createBlockFormats:function(){var c,fmts={p:'advanced.paragraph',address:'advanced.address',pre:'advanced.pre',h1:'advanced.h1',h2:'advanced.h2',h3:'advanced.h3',h4:'advanced.h4',h5:'advanced.h5',h6:'advanced.h6',div:'advanced.div',blockquote:'advanced.blockquote',code:'advanced.code',dt:'advanced.dt',dd:'advanced.dd',samp:'advanced.samp'},t=this;c=t.editor.controlManager.createListBox('formatselect',{title:'advanced.block',cmd:'FormatBlock'});each(t.settings.theme_advanced_blockformats.split(','),function(v){c.add(t.editor.translate(fmts[v]),v,{element:v,'class':v.indexOf('h')==0?'':'preview'});});return c;},_createForeColorMenu:function(){var c,t=this,s=t.settings,o={},v;if(s.theme_advanced_more_colors){o.more_colors_func=function(){t._mceColorPicker(0,{color:c.value,func:function(co){c.setColor(co);}});};}if(v=s.theme_advanced_text_colors)o.colors=v;o.title='advanced.forecolor_desc';o.cmd='ForeColor';o.scope=this;c=t.editor.controlManager.createColorSplitButton('forecolor',o);return c;},_createBackColorMenu:function(){var c,t=this,s=t.settings,o={},v;if(s.theme_advanced_more_colors){o.more_colors_func=function(){t._mceColorPicker(0,{color:c.value,func:function(co){c.setColor(co);}});};}if(v=s.theme_advanced_background_colors)o.colors=v;o.title='advanced.backcolor_desc';o.cmd='HiliteColor';o.scope=this;c=t.editor.controlManager.createColorSplitButton('backcolor',o);return c;},renderUI:function(o){var n,ic,tb,t=this,ed=t.editor,s=t.settings,sc,p,nl;n=p=DOM.create('div',{id:ed.id+'_parent','class':'mceEditor '+ed.settings.skin+'Skin'});if(!DOM.boxModel)n=DOM.add(n,'div',{'class':'mceOldBoxModel'});n=sc=DOM.add(n,'table',{id:ed.id+'_tbl','class':'mceLayout',cellSpacing:0,cellPadding:0});n=tb=DOM.add(n,'tbody');switch((s.theme_advanced_layout_manager||'').toLowerCase()){case"rowlayout":ic=t._rowLayout(s,tb,o);break;case"customlayout":ic=ed.execCallback("theme_advanced_custom_layout",s,tb,o,p);break;default:ic=t._simpleLayout(s,tb,o,p);}n=o.targetNode;nl=sc.rows;DOM.addClass(nl[0],'first');DOM.addClass(nl[nl.length-1],'last');each(DOM.select('tr',tb),function(n){DOM.addClass(n.firstChild,'first');DOM.addClass(n.childNodes[n.childNodes.length-1],'last');});if(DOM.get(s.theme_advanced_toolbar_container))DOM.get(s.theme_advanced_toolbar_container).appendChild(p);else DOM.insertAfter(p,n);Event.add(ed.id+'_path_row','click',function(e){e=e.target;if(e.nodeName=='A'){t._sel(e.href.replace(/^[^#]*#/,''));return Event.cancel(e);}});if(!ed.getParam('accessibility_focus')||ed.getParam('tab_focus'))Event.add(DOM.add(p,'a',{href:'#'},'<!-- IE -->'),'focus',function(){tinyMCE.get(ed.id).focus();});if(s.theme_advanced_toolbar_location=='external')o.deltaHeight=0;t.deltaHeight=o.deltaHeight;o.targetNode=null;return{iframeContainer:ic,editorContainer:ed.id+'_parent',sizeContainer:sc,deltaHeight:o.deltaHeight};},getInfo:function(){return{longname:'Simple theme',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',version:tinymce.majorVersion+"."+tinymce.minorVersion}},_simpleLayout:function(s,tb,o,p){var t=this,ed=t.editor,lo=s.theme_advanced_toolbar_location,sl=s.theme_advanced_statusbar_location,n,ic,etb,c;if(lo=='top')t._addToolbars(tb,o);if(lo=='external'){n=c=DOM.create('div',{style:'position:relative'});n=DOM.add(n,'div',{id:ed.id+'_external','class':'mceExternalToolbar'});DOM.add(n,'a',{id:ed.id+'_external_close',href:'javascript:;','class':'mceExternalClose'});n=DOM.add(n,'table',{id:ed.id+'_tblext',cellSpacing:0,cellPadding:0});etb=DOM.add(n,'tbody');if(p.firstChild.className=='mceOldBoxModel')p.firstChild.appendChild(c);else p.insertBefore(c,p.firstChild);t._addToolbars(etb,o);ed.onMouseUp.add(function(){var e=DOM.get(ed.id+'_external');DOM.show(e);DOM.hide(lastExtID);var f=Event.add(ed.id+'_external_close','click',function(){DOM.hide(ed.id+'_external');Event.remove(ed.id+'_external_close','click',f);});DOM.show(e);DOM.setStyle(e,'top',0-DOM.getRect(ed.id+'_tblext').h-1);DOM.hide(e);DOM.show(e);e.style.filter='';lastExtID=ed.id+'_external';e=null;});}if(sl=='top')t._addStatusBar(tb,o);if(!s.theme_advanced_toolbar_container){n=DOM.add(tb,'tr');n=ic=DOM.add(n,'td',{'class':'mceIframeContainer'});}if(lo=='bottom')t._addToolbars(tb,o);if(sl=='bottom')t._addStatusBar(tb,o);return ic;},_rowLayout:function(s,tb,o){var t=this,ed=t.editor,dc,da,cf=ed.controlManager,n,ic,to;dc=s.theme_advanced_containers_default_class||'';da=s.theme_advanced_containers_default_align||'center';each((s.theme_advanced_containers||'').split(','),function(c,i){var v=s['theme_advanced_container_'+c]||'';switch(c.toLowerCase()){case'mceeditor':n=DOM.add(tb,'tr');n=ic=DOM.add(n,'td',{'class':'mceIframeContainer'});break;case'mceelementpath':t._addStatusBar(tb,o);break;default:n=DOM.add(DOM.add(tb,'tr'),'td',{'class':'mceToolbar '+(s['theme_advanced_container_'+c+'_class']||dc),align:s['theme_advanced_container_'+c+'_align']||da});to=cf.createToolbar("toolbar"+i);t._addControls(v,to);DOM.setHTML(n,to.renderHTML());o.deltaHeight-=s.theme_advanced_row_height;}});return ic;},_addControls:function(v,tb){var t=this,s=t.settings,di,cf=t.editor.controlManager;if(s.theme_advanced_disable&&!t._disabled){di={};each(s.theme_advanced_disable.split(','),function(v){di[v]=1;});t._disabled=di;}else di=t._disabled;each(v.split(','),function(n){var c;if(di&&di[n])return;if(n=='tablecontrols'){each(["table","|","row_props","cell_props","|","row_before","row_after","delete_row","|","col_before","col_after","delete_col","|","split_cells","merge_cells"],function(n){n=t.createControl(n,cf);if(n)tb.add(n);});return;}c=t.createControl(n,cf);if(c)tb.add(c);});},_addToolbars:function(c,o){var t=this,i,tb,ed=t.editor,s=t.settings,v,cf=ed.controlManager,di,n,h=[];n=DOM.add(DOM.add(c,'tr'),'td',{'class':'mceToolbar',align:s.theme_advanced_toolbar_align});if(!ed.getParam('accessibility_focus')||ed.getParam('tab_focus'))h.push(DOM.createHTML('a',{href:'#',onfocus:'tinyMCE.get(\''+ed.id+'\').focus();'},'<!-- IE -->'));h.push(DOM.createHTML('a',{href:'#',accesskey:'q',title:ed.getLang("advanced.toolbar_focus")},'<!-- IE -->'));for(i=1;(v=s['theme_advanced_buttons'+i]);i++){tb=cf.createToolbar("toolbar"+i,{'class':'mceToolbarRow'+i});if(s['theme_advanced_buttons'+i+'_add'])v+=','+s['theme_advanced_buttons'+i+'_add'];if(s['theme_advanced_buttons'+i+'_add_before'])v=s['theme_advanced_buttons'+i+'_add_before']+','+v;t._addControls(v,tb);h.push(tb.renderHTML());o.deltaHeight-=s.theme_advanced_row_height;}h.push(DOM.createHTML('a',{href:'#',accesskey:'z',title:ed.getLang("advanced.toolbar_focus"),onfocus:'tinyMCE.getInstanceById(\''+ed.id+'\').focus();'},'<!-- IE -->'));DOM.setHTML(n,h.join(''));},_addStatusBar:function(tb,o){var n,t=this,ed=t.editor,s=t.settings,r,mf,me,td;n=DOM.add(tb,'tr');n=td=DOM.add(n,'td',{'class':'mceStatusbar'});n=DOM.add(n,'div',{id:ed.id+'_path_row'},s.theme_advanced_path?ed.translate('advanced.path')+': ':' ');DOM.add(n,'a',{href:'#',accesskey:'x'});if(s.theme_advanced_resizing&&!tinymce.isOldWebKit){DOM.add(td,'a',{id:ed.id+'_resize',href:'javascript:;',onclick:"return false;",'class':'resize'});if(s.theme_advanced_resizing_use_cookie){ed.onPostRender.add(function(){var o=Cookie.getHash("TinyMCE_"+ed.id+"_size"),c=DOM.get(ed.id+'_tbl');if(!o)return;if(s.theme_advanced_resize_horizontal)c.style.width=o.cw+'px';c.style.height=o.ch+'px';DOM.get(ed.id+'_ifr').style.height=(parseInt(o.ch)+t.deltaHeight)+'px';});}ed.onPostRender.add(function(){Event.add(ed.id+'_resize','mousedown',function(e){var c,p,w,h,n,pa;c=DOM.get(ed.id+'_tbl');w=c.clientWidth;h=c.clientHeight;miw=s.theme_advanced_resizing_min_width||100;mih=s.theme_advanced_resizing_min_height||100;maw=s.theme_advanced_resizing_max_width||0xFFFF;mah=s.theme_advanced_resizing_max_height||0xFFFF;p=DOM.add(DOM.get(ed.id+'_parent'),'div',{'class':'mcePlaceHolder'});DOM.setStyles(p,{width:w,height:h});DOM.hide(c);DOM.show(p);r={x:e.screenX,y:e.screenY,w:w,h:h,dx:null,dy:null};mf=Event.add(document,'mousemove',function(e){var w,h;r.dx=e.screenX-r.x;r.dy=e.screenY-r.y;w=Math.max(miw,r.w+r.dx);h=Math.max(mih,r.h+r.dy);w=Math.min(maw,w);h=Math.min(mah,h);if(s.theme_advanced_resize_horizontal)p.style.width=w+'px';p.style.height=h+'px';return Event.cancel(e);});me=Event.add(document,'mouseup',function(e){var ifr;Event.remove(document,'mousemove',mf);Event.remove(document,'mouseup',me);c.style.display='';DOM.remove(p);if(r.dx===null)return;ifr=DOM.get(ed.id+'_ifr');if(s.theme_advanced_resize_horizontal)c.style.width=(r.w+r.dx)+'px';c.style.height=(r.h+r.dy)+'px';ifr.style.height=(ifr.clientHeight+r.dy)+'px';if(s.theme_advanced_resizing_use_cookie){Cookie.setHash("TinyMCE_"+ed.id+"_size",{cw:r.w+r.dx,ch:r.h+r.dy});}});return Event.cancel(e);});});}o.deltaHeight-=21;n=tb=null;},_nodeChanged:function(ed,cm,n,co){var t=this,p,de=0,v,c,s=t.settings;tinymce.each(t.stateControls,function(c){cm.setActive(c,ed.queryCommandState(t.controls[c][1]));});cm.setActive('visualaid',ed.hasVisual);cm.setDisabled('undo',!ed.undoManager.hasUndo()&&!ed.typing);cm.setDisabled('redo',!ed.undoManager.hasRedo());cm.setDisabled('outdent',!ed.queryCommandState('Outdent'));p=DOM.getParent(n,'A');if(c=cm.get('link')){if(!p||!p.name){c.setDisabled(!p&&co);c.setActive(!!p);}}if(c=cm.get('unlink')){c.setDisabled(!p&&co);c.setActive(!!p&&!p.name);}if(c=cm.get('anchor')){c.setActive(!!p&&p.name);if(tinymce.isWebKit){p=DOM.getParent(n,'IMG');c.setActive(!!p&&DOM.getAttrib(p,'mce_name')=='a');}}p=DOM.getParent(n,'IMG');if(c=cm.get('image'))c.setActive(!!p&&n.className.indexOf('mceItem')==-1);if(c=cm.get('styleselect')){if(n.className){t._importClasses();c.select(n.className);}else c.select();}if(c=cm.get('formatselect')){p=DOM.getParent(n,DOM.isBlock);if(p)c.select(p.nodeName.toLowerCase());}if(c=cm.get('fontselect'))c.select(ed.queryCommandValue('FontName'));if(c=cm.get('fontsizeselect'))c.select(ed.queryCommandValue('FontSize'));if(s.theme_advanced_path&&s.theme_advanced_statusbar_location){p=DOM.get(ed.id+'_path')||DOM.add(ed.id+'_path_row','span',{id:ed.id+'_path'});DOM.setHTML(p,'');ed.dom.getParent(n,function(n){var na=n.nodeName.toLowerCase(),u,pi,ti='';if(n.nodeType!=1||(DOM.hasClass(n,'mceItemHidden')||DOM.hasClass(n,'mceItemRemoved')))return;if(v=DOM.getAttrib(n,'mce_name'))na=v;if(tinymce.isIE&&n.scopeName!=='HTML')na=n.scopeName+':'+na;na=na.replace(/mce\:/g,'');switch(na){case'b':na='strong';break;case'i':na='em';break;case'img':if(v=DOM.getAttrib(n,'src'))ti+='src: '+v+' ';break;case'a':if(v=DOM.getAttrib(n,'name')){ti+='name: '+v+' ';na+='#'+v;}if(v=DOM.getAttrib(n,'href'))ti+='href: '+v+' ';break;case'font':if(s.convert_fonts_to_spans)na='span';if(v=DOM.getAttrib(n,'face'))ti+='font: '+v+' ';if(v=DOM.getAttrib(n,'size'))ti+='size: '+v+' ';if(v=DOM.getAttrib(n,'color'))ti+='color: '+v+' ';break;case'span':if(v=DOM.getAttrib(n,'style'))ti+='style: '+v+' ';break;}if(v=DOM.getAttrib(n,'id'))ti+='id: '+v+' ';if(v=n.className){v=v.replace(/(webkit-[\w\-]+|Apple-[\w\-]+|mceItem\w+|mceVisualAid)/g,'');if(v&&v.indexOf('mceItem')==-1){ti+='class: '+v+' ';if(DOM.isBlock(n)||na=='img'||na=='span')na+='.'+v;}}na=na.replace(/(html:)/g,'');na={name:na,node:n,title:ti};t.onResolveName.dispatch(t,na);ti=na.title;na=na.name;pi=DOM.create('a',{'href':"#"+(de++)+"",onmousedown:"return false;",title:ti},na);if(p.hasChildNodes()){p.insertBefore(document.createTextNode(' \u00bb '),p.firstChild);p.insertBefore(pi,p.firstChild);}else p.appendChild(pi);},ed.getBody());}},_sel:function(v){this.editor.execCommand('mceSelectNodeDepth',false,v);},_mceInsertAnchor:function(ui,v){var ed=this.editor;ed.windowManager.open({url:tinymce.baseURL+'/themes/advanced/anchor.htm',width:320+parseInt(ed.getLang('advanced.anchor_delta_width',0)),height:90+parseInt(ed.getLang('advanced.anchor_delta_height',0)),inline:true},{theme_url:this.url});},_mceCharMap:function(){var ed=this.editor;ed.windowManager.open({url:tinymce.baseURL+'/themes/advanced/charmap.htm',width:550+parseInt(ed.getLang('advanced.charmap_delta_width',0)),height:250+parseInt(ed.getLang('advanced.charmap_delta_height',0)),inline:true},{theme_url:this.url});},_mceHelp:function(){var ed=this.editor;ed.windowManager.open({url:tinymce.baseURL+'/themes/advanced/about.htm',width:480,height:380,inline:true},{theme_url:this.url});},_mceColorPicker:function(u,v){var ed=this.editor;v=v||{};ed.windowManager.open({url:tinymce.baseURL+'/themes/advanced/color_picker.htm',width:375+parseInt(ed.getLang('advanced.colorpicker_delta_width',0)),height:250+parseInt(ed.getLang('advanced.colorpicker_delta_height',0)),close_previous:false,inline:true},{input_color:v.color,func:v.func,theme_url:this.url});},_mceCodeEditor:function(ui,val){var ed=this.editor;ed.windowManager.open({url:tinymce.baseURL+'/themes/advanced/source_editor.htm',width:parseInt(ed.getParam("theme_advanced_source_editor_width",720)),height:parseInt(ed.getParam("theme_advanced_source_editor_height",580)),inline:true,resizable:true,maximizable:true},{theme_url:this.url});},_mceImage:function(ui,val){var ed=this.editor;ed.windowManager.open({url:tinymce.baseURL+'/themes/advanced/image.htm',width:355+parseInt(ed.getLang('advanced.image_delta_width',0)),height:275+parseInt(ed.getLang('advanced.image_delta_height',0)),inline:true},{theme_url:this.url});},_mceLink:function(ui,val){var ed=this.editor;ed.windowManager.open({url:tinymce.baseURL+'/themes/advanced/link.htm',width:310+parseInt(ed.getLang('advanced.link_delta_width',0)),height:200+parseInt(ed.getLang('advanced.link_delta_height',0)),inline:true},{theme_url:this.url});},_mceNewDocument:function(){var ed=this.editor;ed.windowManager.confirm('advanced.newdocument',function(s){if(s)ed.execCommand('mceSetContent',false,'');});},_mceForeColor:function(){var t=this;this._mceColorPicker(0,{func:function(co){t.editor.execCommand('ForeColor',false,co);}});},_mceBackColor:function(){var t=this;this._mceColorPicker(0,{func:function(co){t.editor.execCommand('HiliteColor',false,co);}});}});tinymce.ThemeManager.add('advanced',tinymce.themes.AdvancedTheme);}()); -
trunk/wp-includes/js/tinymce/themes/advanced/image.htm
r6632 r6694 3 3 <head> 4 4 <title>{#advanced_dlg.image_title}</title> 5 5 <script type="text/javascript" src="../../tiny_mce_popup.js"></script> 6 6 <script type="text/javascript" src="../../utils/mctabs.js"></script> 7 7 <script type="text/javascript" src="../../utils/form_utils.js"></script> 8 8 <script type="text/javascript" src="js/image.js"></script> 9 <base target="_self" /> 9 <script type="text/javascript">tinyMCEPopup.onInit.add(function(){window.setTimeout(function(){document.getElementById('src').focus();},500);});</script> 10 <base target="_self" /> 10 11 </head> 11 12 <body id="image" style="display: none"> … … 75 76 <div class="mceActionPanel"> 76 77 <div style="float: left"> 77 <input type="button" id=" insert" name="insert" value="{#insert}" onclick="ImageDialog.update();" />78 <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" /> 78 79 </div> 79 80 80 81 <div style="float: right"> 81 <input type=" button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />82 <input type="submit" id="insert" name="insert" value="{#insert}" onclick="ImageDialog.update();" /> 82 83 </div> 83 84 </div> -
trunk/wp-includes/js/tinymce/themes/advanced/js/charmap.js
r6632 r6694 307 307 window.focus(); 308 308 309 tinyMCEPopup.editor.focus(); 309 310 tinyMCEPopup.close(); 310 311 } -
trunk/wp-includes/js/tinymce/themes/advanced/link.htm
r6632 r6694 3 3 <head> 4 4 <title>{#advanced_dlg.link_title}</title> 5 5 <script type="text/javascript" src="../../tiny_mce_popup.js"></script> 6 6 <script type="text/javascript" src="../../utils/mctabs.js"></script> 7 7 <script type="text/javascript" src="../../utils/form_utils.js"></script> 8 8 <script type="text/javascript" src="../../utils/validate.js"></script> 9 9 <script type="text/javascript" src="js/link.js"></script> 10 <base target="_self" /> 10 <script type="text/javascript">tinyMCEPopup.onInit.add(function(){window.setTimeout(function(){document.getElementById('href').focus();},500);});</script> 11 <base target="_self" /> 11 12 </head> 12 13 <body id="link" style="display: none"> … … 53 54 <div class="mceActionPanel"> 54 55 <div style="float: left"> 55 <input type="button" id=" insert" name="insert" value="{#insert}" onclick="LinkDialog.update();" />56 <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" /> 56 57 </div> 57 58 58 59 <div style="float: right"> 59 <input type=" button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />60 <input type="submit" id="insert" name="insert" value="{#insert}" onclick="LinkDialog.update();" /> 60 61 </div> 61 62 </div> -
trunk/wp-includes/js/tinymce/themes/advanced/skins/default/content.css
r6632 r6694 1 body, td, pre {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px; }1 body, td, pre {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px; margin:8px; } 2 2 body {background:#FFF;} 3 3 .mceItemTable, .mceItemTable td, .mceItemTable th, .mceItemTable caption, .mceVisualAid {border: 1px dashed #BBB;} -
trunk/wp-includes/js/tinymce/themes/advanced/skins/default/ui.css
r6632 r6694 1 1 /* Reset */ 2 .defaultSkin table, .defaultSkin tbody, .defaultSkin a, .defaultSkin img, .defaultSkin tr, .defaultSkin div, .defaultSkin td, .defaultSkin iframe, .defaultSkin span, .defaultSkin * {border:0; margin:0; padding:0; background:transparent; white-space:nowrap; text-decoration:none; font-weight:normal; cursor:default; color:#000; vertical-align:baseline}2 .defaultSkin table, .defaultSkin tbody, .defaultSkin a, .defaultSkin img, .defaultSkin tr, .defaultSkin div, .defaultSkin td, .defaultSkin iframe, .defaultSkin span, .defaultSkin *, .defaultSkin .text {border:0; margin:0; padding:0; background:transparent; white-space:nowrap; text-decoration:none; font-weight:normal; cursor:default; color:#000; vertical-align:baseline; width:auto; border-collapse:separate} 3 3 .defaultSkin a:hover, .defaultSkin a:link, .defaultSkin a:visited, .defaultSkin a:active {text-decoration:none; font-weight:normal; cursor:default; color:#000} 4 4 .defaultSkin table td {vertical-align:middle} … … 24 24 .defaultSkin .mceIframeContainer {border-top:1px solid #CCC; border-bottom:1px solid #CCC} 25 25 .defaultSkin .mceStatusbar {position:relative; font-family:'MS Sans Serif',sans-serif,Verdana,Arial; font-size:9pt; line-height:16px; overflow:visible; padding:2px; color:#000; display:block} 26 .defaultSkin .mceStatusbar a.resize {display:block; position:absolute; top:0; right:0; background:url(../../img/icons.gif) -800px 0; width:20px; height:20px }26 .defaultSkin .mceStatusbar a.resize {display:block; position:absolute; top:0; right:0; background:url(../../img/icons.gif) -800px 0; width:20px; height:20px; cursor:se-resize} 27 27 .defaultSkin .mceStatusbar a:hover {text-decoration:underline} 28 28 .defaultSkin table.mceToolbar {margin-left:3px} -
trunk/wp-includes/js/tinymce/themes/advanced/skins/o2k7/content.css
r6632 r6694 1 body, td, pre {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px; }1 body, td, pre {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px; margin:8px;} 2 2 body {background:#FFF;} 3 3 .mceItemTable, .mceItemTable td, .mceItemTable th, .mceItemTable caption, .mceVisualAid {border: 1px dashed #BBB;} -
trunk/wp-includes/js/tinymce/themes/advanced/skins/o2k7/ui.css
r6632 r6694 1 1 /* Reset */ 2 .o2k7Skin table, .o2k7Skin tbody, .o2k7Skin a, .o2k7Skin img, .o2k7Skin tr, .o2k7Skin div, .o2k7Skin td, .o2k7Skin iframe, .o2k7Skin span, .o2k7Skin * {border:0; margin:0; padding:0; background:transparent; white-space:nowrap; text-decoration:none; font-weight:normal; cursor:default; color:#000; vertical-align:baseline}2 .o2k7Skin table, .o2k7Skin tbody, .o2k7Skin a, .o2k7Skin img, .o2k7Skin tr, .o2k7Skin div, .o2k7Skin td, .o2k7Skin iframe, .o2k7Skin span, .o2k7Skin *, .o2k7Skin .text {border:0; margin:0; padding:0; background:transparent; white-space:nowrap; text-decoration:none; font-weight:normal; cursor:default; color:#000; vertical-align:baseline; width:auto; border-collapse:separate} 3 3 .o2k7Skin a:hover, .o2k7Skin a:link, .o2k7Skin a:visited, .o2k7Skin a:active {text-decoration:none; font-weight:normal; cursor:default; color:#000} 4 4 .o2k7Skin table td {vertical-align:middle} … … 22 22 .o2k7Skin .mceStatusbar {display:block; font-family:'MS Sans Serif',sans-serif,Verdana,Arial; font-size:9pt; line-height:16px; overflow:visible; color:#000; height:20px;} 23 23 .o2k7Skin .mceStatusbar div {float:left; padding:2px;} 24 .o2k7Skin .mceStatusbar a.resize {display:block; float:right; background:url(../../img/icons.gif) -800px 0; width:20px; height:20px }24 .o2k7Skin .mceStatusbar a.resize {display:block; float:right; background:url(../../img/icons.gif) -800px 0; width:20px; height:20px; cursor:se-resize} 25 25 .o2k7Skin .mceStatusbar a:hover {text-decoration:underline} 26 26 .o2k7Skin table.mceToolbar {margin-left:3px} -
trunk/wp-includes/js/tinymce/themes/advanced/source_editor.htm
r6632 r6694 3 3 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> 4 4 <title>{#advanced_dlg.code_title}</title> 5 5 <script type="text/javascript" src="../../tiny_mce_popup.js"></script> 6 6 <script type="text/javascript" src="js/source_editor.js"></script> 7 <base target="_self" /> 7 <script type="text/javascript">tinyMCEPopup.onInit.add(function(){window.setTimeout(function(){document.getElementById('htmlSource').focus();},500);});</script> 8 <base target="_self" /> 8 9 </head> 9 10 <body onresize="resizeInputs();" style="display:none; overflow:hidden;"> … … 21 22 <div class="mceActionPanel"> 22 23 <div style="float: left"> 23 <input type="button" name=" insert" value="{#update}" onclick="saveContent();" id="insert" />24 <input type="button" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" id="cancel" /> 24 25 </div> 25 26 26 27 <div style="float: right"> 27 <input type=" button" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" id="cancel" />28 <input type="submit" name="insert" value="{#update}" onclick="saveContent();" id="insert" /> 28 29 </div> 29 30 </div> -
trunk/wp-includes/js/tinymce/tiny_mce.js
r6632 r6694 1 2 /* file:jscripts/tiny_mce/classes/tinymce.js */ 3 4 var tinymce = { 5 majorVersion : '3', 6 minorVersion : '0rc2', 7 releaseDate : '2008-01-xx', 8 9 _init : function() { 10 var t = this, ua = navigator.userAgent, i, nl, n, base; 11 12 // Browser checks 13 t.isOpera = window.opera && opera.buildNumber; 14 t.isWebKit = /WebKit/.test(ua); 15 t.isOldWebKit = t.isWebKit && !window.getSelection().getRangeAt; 16 t.isIE = !t.isWebKit && !t.isOpera && (/MSIE/gi).test(ua) && (/Explorer/gi).test(navigator.appName); 17 t.isIE6 = t.isIE && /MSIE [56]/.test(ua); 18 t.isGecko = !t.isWebKit && /Gecko/.test(ua); 19 // t.isGecko3 = t.isGecko && /(Firefox|Minefield)\/[3-9]/.test(ua); 20 t.isMac = ua.indexOf('Mac') != -1; 21 22 // TinyMCE .NET webcontrol might be setting the values for TinyMCE 23 if (window.tinyMCEPreInit) { 24 t.suffix = tinyMCEPreInit.suffix; 25 t.baseURL = tinyMCEPreInit.base; 26 return; 27 } 28 29 // Get suffix and base 30 t.suffix = ''; 31 32 // If base element found, add that infront of baseURL 33 nl = document.getElementsByTagName('base'); 34 for (i=0; i<nl.length; i++) { 35 if (nl[i].href) 36 base = nl[i].href; 37 } 38 39 function getBase(n) { 40 if (n.src && /tiny_mce(|_dev|_src|_gzip|_jquery|_prototype).js/.test(n.src)) { 41 if (/_(src|dev)\.js/g.test(n.src)) 42 t.suffix = '_src'; 43 44 t.baseURL = n.src.substring(0, n.src.lastIndexOf('/')); 45 46 // If path to script is relative and a base href was found add that one infront 47 if (base && t.baseURL.indexOf('://') == -1) 48 t.baseURL = base + t.baseURL; 49 50 return t.baseURL; 51 } 52 53 return null; 54 }; 55 56 // Check document 57 nl = document.getElementsByTagName('script'); 58 for (i=0; i<nl.length; i++) { 59 if (getBase(nl[i])) 60 return; 61 } 62 63 // Check head 64 n = document.getElementsByTagName('head')[0]; 65 if (n) { 66 nl = n.getElementsByTagName('script'); 67 for (i=0; i<nl.length; i++) { 68 if (getBase(nl[i])) 69 return; 70 } 71 } 72 73 return; 74 }, 75 76 is : function(o, t) { 77 var n = typeof(o); 78 79 if (!t) 80 return n != 'undefined'; 81 82 if (t == 'array' && (o instanceof Array)) 83 return true; 84 85 return n == t; 86 }, 87 88 // #if !jquery 89 90 each : function(o, cb, s) { 91 var n, l; 92 93 if (!o) 94 return 0; 95 96 s = s || o; 97 98 if (typeof(o.length) != 'undefined') { 99 // Indexed arrays, needed for Safari 100 for (n=0, l = o.length; n<l; n++) { 101 if (cb.call(s, o[n], n, o) === false) 102 return 0; 103 } 104 } else { 105 // Hashtables 106 for (n in o) { 107 if (o.hasOwnProperty(n)) { 108 if (cb.call(s, o[n], n, o) === false) 109 return 0; 110 } 111 } 112 } 113 114 return 1; 115 }, 116 117 map : function(a, f) { 118 var o = []; 119 120 tinymce.each(a, function(v) { 121 o.push(f(v)); 122 }); 123 124 return o; 125 }, 126 127 grep : function(a, f) { 128 var o = []; 129 130 tinymce.each(a, function(v) { 131 if (!f || f(v)) 132 o.push(v); 133 }); 134 135 return o; 136 }, 137 138 inArray : function(a, v) { 139 var i, l; 140 141 if (a) { 142 for (i = 0, l = a.length; i < l; i++) { 143 if (a[i] === v) 144 return i; 145 } 146 } 147 148 return -1; 149 }, 150 151 extend : function(o, e) { 152 var i, a = arguments; 153 154 for (i=1; i<a.length; i++) { 155 e = a[i]; 156 157 tinymce.each(e, function(v, n) { 158 if (typeof(v) !== 'undefined') 159 o[n] = v; 160 }); 161 } 162 163 return o; 164 }, 165 166 trim : function(s) { 167 return (s ? '' + s : '').replace(/^\s*|\s*$/g, ''); 168 }, 169 170 // #endif 171 172 create : function(s, p) { 173 var t = this, sp, ns, cn, scn, c, de = 0; 174 175 // Parse : <prefix> <class>:<super class> 176 s = /^((static) )?([\w.]+)(:([\w.]+))?/.exec(s); 177 cn = s[3].match(/(^|\.)(\w+)$/i)[2]; // Class name 178 179 // Create namespace for new class 180 ns = t.createNS(s[3].replace(/\.\w+$/, '')); 181 182 // Class already exists 183 if (ns[cn]) 184 return; 185 186 // Make pure static class 187 if (s[2] == 'static') { 188 ns[cn] = p; 189 190 if (this.onCreate) 191 this.onCreate(s[2], s[3], ns[cn]); 192 193 return; 194 } 195 196 // Create default constructor 197 if (!p[cn]) { 198 p[cn] = function() {}; 199 de = 1; 200 } 201 202 // Add constructor and methods 203 ns[cn] = p[cn]; 204 t.extend(ns[cn].prototype, p); 205 206 // Extend 207 if (s[5]) { 208 sp = t.resolve(s[5]).prototype; 209 scn = s[5].match(/\.(\w+)$/i)[1]; // Class name 210 211 // Extend constructor 212 c = ns[cn]; 213 if (de) { 214 // Add passthrough constructor 215 ns[cn] = function() { 216 return sp[scn].apply(this, arguments); 217 }; 218 } else { 219 // Add inherit constructor 220 ns[cn] = function() { 221 this.parent = sp[scn]; 222 return c.apply(this, arguments); 223 }; 224 } 225 ns[cn].prototype[cn] = ns[cn]; 226 227 // Add super methods 228 t.each(sp, function(f, n) { 229 if (n != scn) 230 ns[cn].prototype[n] = sp[n]; 231 }); 232 233 // Add overridden methods 234 t.each(p, function(f, n) { 235 // Extend methods if needed 236 if (sp[n]) { 237 ns[cn].prototype[n] = function() { 238 this.parent = sp[n]; 239 return f.apply(this, arguments); 240 }; 241 } else { 242 if (n != cn) 243 ns[cn].prototype[n] = f; 244 } 245 }); 246 } 247 248 // Add static methods 249 t.each(p['static'], function(f, n) { 250 ns[cn][n] = f; 251 }); 252 253 if (this.onCreate) 254 this.onCreate(s[2], s[3], ns[cn].prototype); 255 }, 256 257 walk : function(o, f, n, s) { 258 s = s || this; 259 260 if (o) { 261 if (n) 262 o = o[n]; 263 264 tinymce.each(o, function(o, i) { 265 if (f.call(s, o, i, n) === false) 266 return false; 267 268 tinymce.walk(o, f, n, s); 269 }); 270 } 271 }, 272 273 createNS : function(n, o) { 274 var i, v; 275 276 o = o || window; 277 278 n = n.split('.'); 279 for (i=0; i<n.length; i++) { 280 v = n[i]; 281 282 if (!o[v]) 283 o[v] = {}; 284 285 o = o[v]; 286 } 287 288 return o; 289 }, 290 291 resolve : function(n, o) { 292 var i, l; 293 294 o = o || window; 295 296 n = n.split('.'); 297 for (i=0, l = n.length; i<l; i++) { 298 o = o[n[i]]; 299 300 if (!o) 301 break; 302 } 303 304 return o; 305 }, 306 307 addUnload : function(f, s) { 308 var t = this, w = window, unload; 309 310 f = {func : f, scope : s || this}; 311 312 if (!t.unloads) { 313 unload = function() { 314 var li = t.unloads, o, n; 315 316 // Call unload handlers 317 for (n in li) { 318 o = li[n]; 319 320 if (o && o.func) 321 o.func.call(o.scope); 322 } 323 324 // Detach unload function 325 if (w.detachEvent) 326 w.detachEvent('onunload', unload); 327 else if (w.removeEventListener) 328 w.removeEventListener('unload', unload, false); 329 330 // Destroy references 331 o = li = w = unload = null; 332 333 // Run garbarge collector on IE 334 if (window.CollectGarbage) 335 window.CollectGarbage(); 336 }; 337 338 // Attach unload handler 339 if (w.attachEvent) 340 w.attachEvent('onunload', unload); 341 else if (w.addEventListener) 342 w.addEventListener('unload', unload, false); 343 344 // Setup initial unload handler array 345 t.unloads = [f]; 346 } else 347 t.unloads.push(f); 348 349 return f; 350 }, 351 352 removeUnload : function(f) { 353 var u = this.unloads, r = null; 354 355 tinymce.each(u, function(o, i) { 356 if (o && o.func == f) { 357 u.splice(i, 1); 358 r = f; 359 return false; 360 } 361 }); 362 363 return r; 364 } 365 366 }; 367 368 // Required for GZip AJAX loading 369 window.tinymce = tinymce; 370 371 // Initialize the API 372 tinymce._init(); 373 374 /* file:jscripts/tiny_mce/classes/adapter/jquery/adapter.js */ 375 376 377 /* file:jscripts/tiny_mce/classes/adapter/prototype/adapter.js */ 378 379 380 /* file:jscripts/tiny_mce/classes/util/Dispatcher.js */ 381 382 tinymce.create('tinymce.util.Dispatcher', { 383 scope : null, 384 listeners : null, 385 386 Dispatcher : function(s) { 387 this.scope = s || this; 388 this.listeners = []; 389 }, 390 391 add : function(cb, s) { 392 this.listeners.push({cb : cb, scope : s || this.scope}); 393 394 return cb; 395 }, 396 397 addToTop : function(cb, s) { 398 this.listeners.unshift({cb : cb, scope : s || this.scope}); 399 400 return cb; 401 }, 402 403 remove : function(cb) { 404 var l = this.listeners, o = null; 405 406 tinymce.each(l, function(c, i) { 407 if (cb == c.cb) { 408 o = cb; 409 l.splice(i, 1); 410 return false; 411 } 412 }); 413 414 return o; 415 }, 416 417 dispatch : function() { 418 var s, a = arguments; 419 420 tinymce.each(this.listeners, function(c) { 421 return s = c.cb.apply(c.scope, a); 422 }); 423 424 return s; 425 } 426 427 }); 428 429 /* file:jscripts/tiny_mce/classes/util/URI.js */ 430 431 (function() { 432 var each = tinymce.each; 433 434 tinymce.create('tinymce.util.URI', { 435 URI : function(u, s) { 436 var t = this, o, a, b; 437 438 // Default settings 439 s = t.settings = s || {}; 440 441 // Strange app protocol or local anchor 442 if (/^(mailto|news|javascript|about):/i.test(u) || /^\s*#/.test(u)) { 443 t.source = u; 444 return; 445 } 446 447 // Absolute path with no host, fake host and protocol 448 if (u.indexOf('/') === 0 && u.indexOf('//') !== 0) 449 u = (s.base_uri ? s.base_uri.protocol || 'http' : 'http') + '://mce_host' + u; 450 451 // Relative path 452 if (u.indexOf('://') === -1 && u.indexOf('//') !== 0) 453 u = (s.base_uri.protocol || 'http') + '://mce_host' + t.toAbsPath(s.base_uri.path, u); 454 455 // Parse URL (Credits goes to Steave, http://blog.stevenlevithan.com/archives/parseuri) 456 u = u.replace(/@@/g, '(mce_at)'); // Zope 3 workaround, they use @@something 457 u = /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/.exec(u); 458 each(["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"], function(v, i) { 459 var s = u[i]; 460 461 // Zope 3 workaround, they use @@something 462 if (s) 463 s = s.replace(/\(mce_at\)/g, '@@'); 464 465 t[v] = s; 466 }); 467 468 if (b = s.base_uri) { 469 if (!t.protocol) 470 t.protocol = b.protocol; 471 472 if (!t.userInfo) 473 t.userInfo = b.userInfo; 474 475 if (!t.port && t.host == 'mce_host') 476 t.port = b.port; 477 478 if (!t.host || t.host == 'mce_host') 479 t.host = b.host; 480 481 t.source = ''; 482 } 483 484 //t.path = t.path || '/'; 485 }, 486 487 setPath : function(p) { 488 var t = this; 489 490 p = /^(.*?)\/?(\w+)?$/.exec(p); 491 492 // Update path parts 493 t.path = p[0]; 494 t.directory = p[1]; 495 t.file = p[2]; 496 497 // Rebuild source 498 t.source = ''; 499 t.getURI(); 500 }, 501 502 toRelative : function(u) { 503 var t = this, o; 504 505 u = new tinymce.util.URI(u, {base_uri : t}); 506 507 // Not on same domain/port or protocol 508 if ((u.host != 'mce_host' && t.host != u.host && u.host) || t.port != u.port || t.protocol != u.protocol) 509 return u.getURI(); 510 511 o = t.toRelPath(t.path, u.path); 512 513 // Add query 514 if (u.query) 515 o += '?' + u.query; 516 517 // Add anchor 518 if (u.anchor) 519 o += '#' + u.anchor; 520 521 return o; 522 }, 523 524 toAbsolute : function(u, nh) { 525 var u = new tinymce.util.URI(u, {base_uri : this}); 526 527 return u.getURI(this.host == u.host ? nh : 0); 528 }, 529 530 toRelPath : function(base, path) { 531 var items, bp = 0, out = '', i; 532 533 // Split the paths 534 base = base.substring(0, base.lastIndexOf('/')); 535 base = base.split('/'); 536 items = path.split('/'); 537 538 if (base.length >= items.length) { 539 for (i = 0; i < base.length; i++) { 540 if (i >= items.length || base[i] != items[i]) { 541 bp = i + 1; 542 break; 543 } 544 } 545 } 546 547 if (base.length < items.length) { 548 for (i = 0; i < items.length; i++) { 549 if (i >= base.length || base[i] != items[i]) { 550 bp = i + 1; 551 break; 552 } 553 } 554 } 555 556 if (bp == 1) 557 return path; 558 559 for (i = 0; i < base.length - (bp - 1); i++) 560 out += "../"; 561 562 for (i = bp - 1; i < items.length; i++) { 563 if (i != bp - 1) 564 out += "/" + items[i]; 565 else 566 out += items[i]; 567 } 568 569 return out; 570 }, 571 572 toAbsPath : function(base, path) { 573 var i, nb = 0, o = []; 574 575 // Split paths 576 base = base.split('/'); 577 path = path.split('/'); 578 579 // Remove empty chunks 580 each(base, function(k) { 581 if (k) 582 o.push(k); 583 }); 584 585 base = o; 586 587 // Merge relURLParts chunks 588 for (i = path.length - 1, o = []; i >= 0; i--) { 589 // Ignore empty or . 590 if (path[i].length == 0 || path[i] == ".") 591 continue; 592 593 // Is parent 594 if (path[i] == '..') { 595 nb++; 596 continue; 597 } 598 599 // Move up 600 if (nb > 0) { 601 nb--; 602 continue; 603 } 604 605 o.push(path[i]); 606 } 607 608 i = base.length - nb; 609 610 // If /a/b/c or / 611 if (i <= 0) 612 return '/' + o.reverse().join('/'); 613 614 return '/' + base.slice(0, i).join('/') + '/' + o.reverse().join('/'); 615 }, 616 617 getURI : function(nh) { 618 var s, t = this; 619 620 // Rebuild source 621 if (!t.source || nh) { 622 s = ''; 623 624 if (!nh) { 625 if (t.protocol) 626 s += t.protocol + '://'; 627 628 if (t.userInfo) 629 s += t.userInfo + '@'; 630 631 if (t.host) 632 s += t.host; 633 634 if (t.port) 635 s += ':' + t.port; 636 } 637 638 if (t.path) 639 s += t.path; 640 641 if (t.query) 642 s += '?' + t.query; 643 644 if (t.anchor) 645 s += '#' + t.anchor; 646 647 t.source = s; 648 } 649 650 return t.source; 651 } 652 653 }); 654 })(); 655 656 /* file:jscripts/tiny_mce/classes/util/Cookie.js */ 657 658 (function() { 659 var each = tinymce.each; 660 661 tinymce.create('static tinymce.util.Cookie', { 662 getHash : function(n) { 663 var v = this.get(n), h; 664 665 if (v) { 666 each(v.split('&'), function(v) { 667 v = v.split('='); 668 h = h || {}; 669 h[unescape(v[0])] = unescape(v[1]); 670 }); 671 } 672 673 return h; 674 }, 675 676 setHash : function(n, v, e, p, d, s) { 677 var o = ''; 678 679 each(v, function(v, k) { 680 o += (!o ? '' : '&') + escape(k) + '=' + escape(v); 681 }); 682 683 this.set(n, o, e, p, d, s); 684 }, 685 686 get : function(n) { 687 var c = document.cookie, e, p = n + "=", b; 688 689 // Strict mode 690 if (!c) 691 return; 692 693 b = c.indexOf("; " + p); 694 695 if (b == -1) { 696 b = c.indexOf(p); 697 698 if (b != 0) 699 return null; 700 } else 701 b += 2; 702 703 e = c.indexOf(";", b); 704 705 if (e == -1) 706 e = c.length; 707 708 return unescape(c.substring(b + p.length, e)); 709 }, 710 711 set : function(n, v, e, p, d, s) { 712 document.cookie = n + "=" + escape(v) + 713 ((e) ? "; expires=" + e.toGMTString() : "") + 714 ((p) ? "; path=" + escape(p) : "") + 715 ((d) ? "; domain=" + d : "") + 716 ((s) ? "; secure" : ""); 717 }, 718 719 remove : function(n, p) { 720 var d = new Date(); 721 722 d.setTime(d.getTime() - 1000); 723 724 this.set(n, '', d, p, d); 725 } 726 727 }); 728 })(); 729 730 /* file:jscripts/tiny_mce/classes/util/JSON.js */ 731 732 tinymce.create('static tinymce.util.JSON', { 733 serialize : function(o) { 734 var i, v, s = tinymce.util.JSON.serialize, t; 735 736 if (o == null) 737 return 'null'; 738 739 t = typeof o; 740 741 if (t == 'string') { 742 v = '\bb\tt\nn\ff\rr\""\'\'\\\\'; 743 744 return '"' + o.replace(/([\u0080-\uFFFF\x00-\x1f\"\'])/g, function(a, b) { 745 i = v.indexOf(b); 746 747 if (i + 1) 748 return '\\' + v.charAt(i + 1); 749 750 a = b.charCodeAt().toString(16); 751 752 return '\\u' + '0000'.substring(a.length) + a; 753 }) + '"'; 754 } 755 756 if (t == 'object') { 757 if (o instanceof Array) { 758 for (i=0, v = '['; i<o.length; i++) 759 v += (i > 0 ? ',' : '') + s(o[i]); 760 761 return v + ']'; 762 } 763 764 v = '{'; 765 766 for (i in o) 767 v += typeof o[i] != 'function' ? (v.length > 1 ? ',"' : '"') + i + '":' + s(o[i]) : ''; 768 769 return v + '}'; 770 } 771 772 return '' + o; 773 }, 774 775 parse : function(s) { 776 try { 777 return eval('(' + s + ')'); 778 } catch (ex) { 779 // Ignore 780 } 781 } 782 783 }); 784 785 /* file:jscripts/tiny_mce/classes/util/XHR.js */ 786 787 tinymce.create('static tinymce.util.XHR', { 788 send : function(o) { 789 var x, t, w = window, c = 0; 790 791 // Default settings 792 o.scope = o.scope || this; 793 o.success_scope = o.success_scope || o.scope; 794 o.error_scope = o.error_scope || o.scope; 795 o.async = o.async === false ? false : true; 796 o.data = o.data || ''; 797 798 function get(s) { 799 x = 0; 800 801 try { 802 x = new ActiveXObject(s); 803 } catch (ex) { 804 } 805 806 return x; 807 }; 808 809 x = w.XMLHttpRequest ? new XMLHttpRequest() : get('Microsoft.XMLHTTP') || get('Msxml2.XMLHTTP'); 810 811 if (x) { 812 if (x.overrideMimeType) 813 x.overrideMimeType(o.content_type); 814 815 x.open(o.type || (o.data ? 'POST' : 'GET'), o.url, o.async); 816 817 if (o.content_type) 818 x.setRequestHeader('Content-Type', o.content_type); 819 820 x.send(o.data); 821 822 // Wait for response, onReadyStateChange can not be used since it leaks memory in IE 823 t = w.setInterval(function() { 824 if (x.readyState == 4 || c++ > 10000) { 825 w.clearInterval(t); 826 827 if (o.success && c < 10000 && x.status == 200) 828 o.success.call(o.success_scope, '' + x.responseText, x, o); 829 else if (o.error) 830 o.error.call(o.error_scope, c > 10000 ? 'TIMED_OUT' : 'GENERAL', x, o); 831 832 x = null; 833 } 834 }, 10); 835 } 836 837 } 838 }); 839 840 /* file:jscripts/tiny_mce/classes/util/JSONRequest.js */ 841 842 (function() { 843 var extend = tinymce.extend, JSON = tinymce.util.JSON, XHR = tinymce.util.XHR; 844 845 tinymce.create('tinymce.util.JSONRequest', { 846 JSONRequest : function(s) { 847 this.settings = extend({ 848 }, s); 849 this.count = 0; 850 }, 851 852 send : function(o) { 853 var ecb = o.error, scb = o.success; 854 855 o = extend(this.settings, o); 856 857 o.success = function(c, x) { 858 c = JSON.parse(c); 859 860 if (typeof(c) == 'undefined') { 861 c = { 862 error : 'JSON Parse error.' 863 }; 864 } 865 866 if (c.error) 867 ecb.call(o.error_scope || o.scope, c.error, x); 868 else 869 scb.call(o.success_scope || o.scope, c.result); 870 }; 871 872 o.error = function(ty, x) { 873 ecb.call(o.error_scope || o.scope, ty, x); 874 }; 875 876 o.data = JSON.serialize({ 877 id : o.id || 'c' + (this.count++), 878 method : o.method, 879 params : o.params 880 }); 881 882 XHR.send(o); 883 }, 884 885 'static' : { 886 sendRPC : function(o) { 887 return new tinymce.util.JSONRequest().send(o); 888 } 889 } 890 891 }); 892 }()); 893 /* file:jscripts/tiny_mce/classes/dom/DOMUtils.js */ 894 895 (function() { 896 // Shorten names 897 var each = tinymce.each, is = tinymce.is; 898 var isWebKit = tinymce.isWebKit, isIE = tinymce.isIE; 899 900 tinymce.create('tinymce.dom.DOMUtils', { 901 doc : null, 902 root : null, 903 files : null, 904 listeners : {}, 905 pixelStyles : /^(top|left|bottom|right|width|height|borderWidth)$/, 906 cache : {}, 907 idPattern : /^#[\w]+$/, 908 elmPattern : /^[\w_*]+$/, 909 elmClassPattern : /^([\w_]*)\.([\w_]+)$/, 910 911 DOMUtils : function(d, s) { 912 var t = this; 913 914 t.doc = d; 915 t.files = {}; 916 t.cssFlicker = false; 917 t.counter = 0; 918 t.boxModel = !tinymce.isIE || d.compatMode == "CSS1Compat"; 919 920 this.settings = s = tinymce.extend({ 921 keep_values : false, 922 hex_colors : 1 923 }, s); 924 925 // Fix IE6SP2 flicker and check it failed for pre SP2 926 if (tinymce.isIE6) { 927 try { 928 d.execCommand('BackgroundImageCache', false, true); 929 } catch (e) { 930 t.cssFlicker = true; 931 } 932 } 933 934 tinymce.addUnload(function() { 935 t.doc = t.root = null; 936 }); 937 }, 938 939 getRoot : function() { 940 var t = this, s = t.settings; 941 942 return (s && t.get(s.root_element)) || t.doc.body; 943 }, 944 945 getViewPort : function(w) { 946 var d, b; 947 948 w = !w ? window : w; 949 d = w.document; 950 b = this.boxModel ? d.documentElement : d.body; 951 952 // Returns viewport size excluding scrollbars 953 return { 954 x : w.pageXOffset || b.scrollLeft, 955 y : w.pageYOffset || b.scrollTop, 956 w : w.innerWidth || b.clientWidth, 957 h : w.innerHeight || b.clientHeight 958 }; 959 }, 960 961 getRect : function(e) { 962 var p, t = this, w, h; 963 964 e = t.get(e); 965 p = t.getPos(e); 966 w = t.getStyle(e, 'width'); 967 h = t.getStyle(e, 'height'); 968 969 // Non pixel value, then force offset/clientWidth 970 if (w.indexOf('px') === -1) 971 w = 0; 972 973 // Non pixel value, then force offset/clientWidth 974 if (h.indexOf('px') === -1) 975 h = 0; 976 977 return { 978 x : p.x, 979 y : p.y, 980 w : parseInt(w) || e.offsetWidth || e.clientWidth, 981 h : parseInt(h) || e.offsetHeight || e.clientHeight 982 }; 983 }, 984 985 getParent : function(n, f, r) { 986 var na, se = this.settings; 987 988 n = this.get(n); 989 990 if (se.strict_root) 991 r = r || this.getRoot(); 992 993 // Wrap node name as func 994 if (is(f, 'string')) { 995 na = f.toUpperCase(); 996 997 f = function(n) { 998 var s = false; 999 1000 // Any element 1001 if (n.nodeType == 1 && na === '*') { 1002 s = true; 1003 return false; 1004 } 1005 1006 each(na.split(','), function(v) { 1007 if (n.nodeType == 1 && ((se.strict && n.nodeName.toUpperCase() == v) || n.nodeName == v)) { 1008 s = true; 1009 return false; // Break loop 1010 } 1011 }); 1012 1013 return s; 1014 }; 1015 } 1016 1017 while (n) { 1018 if (n == r) 1019 return null; 1020 1021 if (f(n)) 1022 return n; 1023 1024 n = n.parentNode; 1025 } 1026 1027 return null; 1028 }, 1029 1030 get : function(e) { 1031 if (typeof(e) == 'string') 1032 return this.doc.getElementById(e); 1033 1034 return e; 1035 }, 1036 1037 // #if !jquery 1038 1039 select : function(pa, s) { 1040 var t = this, cs, c, pl, o = [], x, i, l, n; 1041 1042 s = t.get(s) || t.doc; 1043 1044 if (t.settings.strict) { 1045 function get(s, n) { 1046 return s.getElementsByTagName(n.toLowerCase()); 1047 }; 1048 } else { 1049 function get(s, n) { 1050 return s.getElementsByTagName(n); 1051 }; 1052 } 1053 1054 // Simple element pattern. For example: "p" or "*" 1055 if (t.elmPattern.test(pa)) { 1056 x = get(s, pa); 1057 1058 for (i = 0, l = x.length; i<l; i++) 1059 o.push(x[i]); 1060 1061 return o; 1062 } 1063 1064 // Simple class pattern. For example: "p.class" or ".class" 1065 if (t.elmClassPattern.test(pa)) { 1066 pl = t.elmClassPattern.exec(pa); 1067 x = get(s, pl[1] || '*'); 1068 c = ' ' + pl[2] + ' '; 1069 1070 for (i = 0, l = x.length; i<l; i++) { 1071 n = x[i]; 1072 1073 if (n.className && (' ' + n.className + ' ').indexOf(c) !== -1) 1074 o.push(n); 1075 } 1076 1077 return o; 1078 } 1079 1080 function collect(n) { 1081 if (!n.mce_save) { 1082 n.mce_save = 1; 1083 o.push(n); 1084 } 1085 }; 1086 1087 function collectIE(n) { 1088 if (!n.getAttribute('mce_save')) { 1089 n.setAttribute('mce_save', '1'); 1090 o.push(n); 1091 } 1092 }; 1093 1094 function find(n, f, r) { 1095 var i, l, nl = get(r, n); 1096 1097 for (i = 0, l = nl.length; i < l; i++) 1098 f(nl[i]); 1099 }; 1100 1101 each(pa.split(','), function(v, i) { 1102 v = tinymce.trim(v); 1103 1104 // Simple element pattern, most common in TinyMCE 1105 if (t.elmPattern.test(v)) { 1106 each(get(s, v), function(n) { 1107 collect(n); 1108 }); 1109 1110 return; 1111 } 1112 1113 // Simple element pattern with class, fairly common in TinyMCE 1114 if (t.elmClassPattern.test(v)) { 1115 x = t.elmClassPattern.exec(v); 1116 1117 each(get(s, x[1]), function(n) { 1118 if (t.hasClass(n, x[2])) 1119 collect(n); 1120 }); 1121 1122 return; 1123 } 1124 1125 if (!(cs = t.cache[pa])) { 1126 cs = 'x=(function(cf, s) {'; 1127 pl = v.split(' '); 1128 1129 each(pl, function(v) { 1130 var p = /^([\w\\*]+)?(?:#([\w\\]+))?(?:\.([\w\\\.]+))?(?:\[\@([\w\\]+)([\^\$\*!]?=)([\w\\]+)\])?(?:\:([\w\\]+))?/i.exec(v); 1131 1132 // Find elements 1133 p[1] = p[1] || '*'; 1134 cs += 'find("' + p[1] + '", function(n) {'; 1135 1136 // Check id 1137 if (p[2]) 1138 cs += 'if (n.id !== "' + p[2] + '") return;'; 1139 1140 // Check classes 1141 if (p[3]) { 1142 cs += 'var c = " " + n.className + " ";'; 1143 cs += 'if ('; 1144 c = ''; 1145 each(p[3].split('.'), function(v) { 1146 if (v) 1147 c += (c ? '||' : '') + 'c.indexOf(" ' + v + ' ") === -1'; 1148 }); 1149 cs += c + ') return;'; 1150 } 1151 }); 1152 1153 cs += 'cf(n);'; 1154 1155 for (i = pl.length - 1; i >= 0; i--) 1156 cs += '}, ' + (i ? 'n' : 's') + ');'; 1157 1158 cs += '})'; 1159 1160 // Compile CSS pattern function 1161 t.cache[pa] = cs = eval(cs); 1162 } 1163 1164 // Run selector function 1165 cs(isIE ? collectIE : collect, s); 1166 }); 1167 1168 // Cleanup 1169 each(o, function(n) { 1170 if (isIE) 1171 n.removeAttribute('mce_save'); 1172 else 1173 delete n.mce_save; 1174 }); 1175 1176 return o; 1177 }, 1178 1179 // #endif 1180 1181 add : function(p, n, a, h, c) { 1182 var t = this; 1183 1184 return this.run(p, function(p) { 1185 var e, k; 1186 1187 e = is(n, 'string') ? t.doc.createElement(n) : n; 1188 1189 if (a) { 1190 for (k in a) { 1191 if (a.hasOwnProperty(k) && !is(a[k], 'object')) 1192 t.setAttrib(e, k, '' + a[k]); 1193 } 1194 1195 if (a.style && !is(a.style, 'string')) { 1196 each(a.style, function(v, n) { 1197 t.setStyle(e, n, v); 1198 }); 1199 } 1200 } 1201 1202 if (h) { 1203 if (h.nodeType) 1204 e.appendChild(h); 1205 else 1206 e.innerHTML = h; 1207 } 1208 1209 return !c ? p.appendChild(e) : e; 1210 }); 1211 }, 1212 1213 create : function(n, a, h) { 1214 return this.add(this.doc.createElement(n), n, a, h, 1); 1215 }, 1216 1217 createHTML : function(n, a, h) { 1218 var o = '', t = this, k; 1219 1220 o += '<' + n; 1221 1222 for (k in a) { 1223 if (a.hasOwnProperty(k)) 1224 o += ' ' + k + '="' + t.encode(a[k]) + '"'; 1225 } 1226 1227 if (tinymce.is(h)) 1228 return o + '>' + h + '</' + n + '>'; 1229 1230 return o + ' />'; 1231 }, 1232 1233 remove : function(n, k) { 1234 return this.run(n, function(n) { 1235 var p; 1236 1237 p = n.parentNode; 1238 1239 if (!p) 1240 return null; 1241 1242 if (k) { 1243 each (n.childNodes, function(c) { 1244 p.insertBefore(c.cloneNode(true), n); 1245 }); 1246 } 1247 1248 return p.removeChild(n); 1249 }); 1250 }, 1251 1252 // #if !jquery 1253 1254 setStyle : function(n, na, v) { 1255 var t = this; 1256 1257 return t.run(n, function(e) { 1258 var s, i; 1259 1260 s = e.style; 1261 1262 // Camelcase it, if needed 1263 na = na.replace(/-(\D)/g, function(a, b){ 1264 return b.toUpperCase(); 1265 }); 1266 1267 // Default px suffix on these 1268 if (t.pixelStyles.test(na) && (tinymce.is(v, 'number') || /^[\-0-9\.]+$/.test(v))) 1269 v += 'px'; 1270 1271 switch (na) { 1272 case 'opacity': 1273 // IE specific opacity 1274 if (isIE) { 1275 s.filter = v === '' ? '' : "alpha(opacity=" + (v * 100) + ")"; 1276 1277 if (!n.currentStyle || !n.currentStyle.hasLayout) 1278 s.display = 'inline-block'; 1279 } 1280 1281 // Fix for older browsers 1282 s['-moz-opacity'] = s['-khtml-opacity'] = v; 1283 break; 1284 1285 case 'float': 1286 isIE ? s.styleFloat = v : s.cssFloat = v; 1287 break; 1288 } 1289 1290 s[na] = v || ''; 1291 1292 // Force update of the style data 1293 if (t.settings.update_styles) 1294 t.setAttrib(e, 'mce_style'); 1295 }); 1296 }, 1297 1298 getStyle : function(n, na, c) { 1299 n = this.get(n); 1300 1301 if (!n) 1302 return false; 1303 1304 // Gecko 1305 if (this.doc.defaultView && c) { 1306 // Remove camelcase 1307 na = na.replace(/[A-Z]/g, function(a){ 1308 return '-' + a; 1309 }); 1310 1311 try { 1312 return this.doc.defaultView.getComputedStyle(n, null).getPropertyValue(na); 1313 } catch (ex) { 1314 // Old safari might fail 1315 return null; 1316 } 1317 } 1318 1319 // Camelcase it, if needed 1320 na = na.replace(/-(\D)/g, function(a, b){ 1321 return b.toUpperCase(); 1322 }); 1323 1324 if (na == 'float') 1325 na = isIE ? 'styleFloat' : 'cssFloat'; 1326 1327 // IE & Opera 1328 if (n.currentStyle && c) 1329 return n.currentStyle[na]; 1330 1331 return n.style[na]; 1332 }, 1333 1334 setStyles : function(e, o) { 1335 var t = this, s = t.settings, ol; 1336 1337 ol = s.update_styles; 1338 s.update_styles = 0; 1339 1340 each(o, function(v, n) { 1341 t.setStyle(e, n, v); 1342 }); 1343 1344 // Update style info 1345 s.update_styles = ol; 1346 if (s.update_styles) 1347 t.setAttrib(e, s.cssText); 1348 }, 1349 1350 setAttrib : function(e, n, v) { 1351 var t = this; 1352 1353 // Strict XML mode 1354 if (t.settings.strict) 1355 n = n.toLowerCase(); 1356 1357 return this.run(e, function(e) { 1358 var s = t.settings; 1359 1360 switch (n) { 1361 case "style": 1362 if (s.keep_values) { 1363 if (v) 1364 e.setAttribute('mce_style', v, 2); 1365 else 1366 e.removeAttribute('mce_style', 2); 1367 } 1368 1369 e.style.cssText = v; 1370 break; 1371 1372 case "class": 1373 e.className = v; 1374 break; 1375 1376 case "src": 1377 case "href": 1378 if (s.keep_values) { 1379 if (s.url_converter) 1380 v = s.url_converter.call(s.url_converter_scope || t, v, n, e); 1381 1382 t.setAttrib(e, 'mce_' + n, v, 2); 1383 } 1384 1385 break; 1386 } 1387 1388 if (is(v) && v !== null && v.length !== 0) 1389 e.setAttribute(n, '' + v, 2); 1390 else 1391 e.removeAttribute(n, 2); 1392 }); 1393 }, 1394 1395 setAttribs : function(e, o) { 1396 var t = this; 1397 1398 return this.run(e, function(e) { 1399 each(o, function(v, n) { 1400 t.setAttrib(e, n, v); 1401 }); 1402 }); 1403 }, 1404 1405 // #endif 1406 1407 getAttrib : function(e, n, dv) { 1408 var v, t = this; 1409 1410 e = t.get(e); 1411 1412 if (!e) 1413 return false; 1414 1415 if (!is(dv)) 1416 dv = ""; 1417 1418 // Try the mce variant for these 1419 if (/^(src|href|style)$/.test(n)) { 1420 v = e.getAttribute("mce_" + n); 1421 1422 if (v) 1423 return v; 1424 } 1425 1426 v = e.getAttribute(n, 2); 1427 1428 if (!v) { 1429 switch (n) { 1430 case 'class': 1431 v = e.className; 1432 break; 1433 1434 default: 1435 v = e.attributes[n]; 1436 v = v && is(v.nodeValue) ? v.nodeValue : v; 1437 } 1438 } 1439 1440 switch (n) { 1441 case 'style': 1442 v = v || e.style.cssText; 1443 1444 if (v) { 1445 v = t.serializeStyle(t.parseStyle(v)); 1446 1447 if (t.settings.keep_values) 1448 e.setAttribute('mce_style', v); 1449 } 1450 1451 break; 1452 } 1453 1454 // Remove Apple and WebKit stuff 1455 if (isWebKit && n === "class" && v) 1456 v = v.replace(/(apple|webkit)\-[a-z\-]+/gi, ''); 1457 1458 // Handle IE issues 1459 if (isIE) { 1460 switch (n) { 1461 case 'rowspan': 1462 case 'colspan': 1463 // IE returns 1 as default value 1464 if (v === 1) 1465 v = ''; 1466 1467 break; 1468 1469 case 'size': 1470 // IE returns +0 as default value for size 1471 if (v === '+0') 1472 v = ''; 1473 1474 break; 1475 1476 case 'hspace': 1477 // IE returns -1 as default value 1478 if (v === -1) 1479 v = ''; 1480 1481 break; 1482 1483 case 'tabindex': 1484 // IE returns 32768 as default value 1485 if (v === 32768) 1486 v = ''; 1487 1488 break; 1489 1490 default: 1491 // IE has odd anonymous function for event attributes 1492 if (n.indexOf('on') === 0 && v) 1493 v = ('' + v).replace(/^function\s+anonymous\(\)\s+\{\s+(.*)\s+\}$/, '$1'); 1494 } 1495 } 1496 1497 return (v && v != '') ? '' + v : dv; 1498 }, 1499 1500 getPos : function(n) { 1501 var t = this, x = 0, y = 0, e, d = t.doc; 1502 1503 n = t.get(n); 1504 1505 // Use getBoundingClientRect on IE, Opera has it but it's not perfect 1506 if (n && isIE) { 1507 n = n.getBoundingClientRect(); 1508 e = t.boxModel ? d.documentElement : d.body; 1509 x = t.getStyle(t.select('html')[0], 'borderWidth'); // Remove border 1510 x = (x == 'medium' || t.boxModel && !t.isIE6) && 2 || x; 1511 n.top += window.self != window.top ? 2 : 0; // IE adds some strange extra cord if used in a frameset 1512 1513 return {x : n.left + e.scrollLeft - x, y : n.top + e.scrollTop - x}; 1514 } 1515 1516 while (n) { 1517 x += n.offsetLeft || 0; 1518 y += n.offsetTop || 0; 1519 x -= n.scrollLeft || 0; 1520 y -= n.scrollTop || 0; 1521 n = n.offsetParent; 1522 } 1523 1524 return {x : x, y : y}; 1525 }, 1526 1527 parseStyle : function(st) { 1528 var t = this, s = t.settings, o = {}; 1529 1530 if (!st) 1531 return o; 1532 1533 function compress(p, s, ot) { 1534 var t, r, b, l; 1535 1536 // Get values and check it it needs compressing 1537 t = o[p + '-top' + s]; 1538 if (!t) 1539 return; 1540 1541 r = o[p + '-right' + s]; 1542 if (t != r) 1543 return; 1544 1545 b = o[p + '-bottom' + s]; 1546 if (r != b) 1547 return; 1548 1549 l = o[p + '-left' + s]; 1550 if (b != l) 1551 return; 1552 1553 // Compress 1554 o[ot] = l; 1555 delete o[p + '-top' + s]; 1556 delete o[p + '-right' + s]; 1557 delete o[p + '-bottom' + s]; 1558 delete o[p + '-left' + s]; 1559 }; 1560 1561 function compress2(ta, a, b, c) { 1562 var t; 1563 1564 t = o[a]; 1565 if (!t) 1566 return; 1567 1568 t = o[b]; 1569 if (!t) 1570 return; 1571 1572 t = o[c]; 1573 if (!t) 1574 return; 1575 1576 // Compress 1577 o[ta] = o[a] + ' ' + o[b] + ' ' + o[c]; 1578 delete o[a]; 1579 delete o[b]; 1580 delete o[c]; 1581 }; 1582 1583 each(st.split(';'), function(v) { 1584 var sv, ur = []; 1585 1586 if (v) { 1587 v = v.replace(/url\([^\)]+\)/g, function(v) {ur.push(v);return 'url(' + ur.length + ')';}); 1588 v = v.split(':'); 1589 sv = tinymce.trim(v[1]); 1590 sv = sv.replace(/url\(([^\)]+)\)/g, function(a, b) {return ur[parseInt(b) - 1];}); 1591 1592 sv = sv.replace(/rgb\([^\)]+\)/g, function(v) { 1593 return t.toHex(v); 1594 }); 1595 1596 if (s.url_converter) { 1597 sv = sv.replace(/url\([\'\"]?([^\)\'\"]+)[\'\"]?\)/g, function(x, c) { 1598 return 'url(' + t.encode(s.url_converter.call(s.url_converter_scope || t, t.decode(c), 'style', null)) + ')'; 1599 }); 1600 } 1601 1602 o[tinymce.trim(v[0]).toLowerCase()] = sv; 1603 } 1604 }); 1605 1606 compress("border", "", "border"); 1607 compress("border", "-width", "border-width"); 1608 compress("border", "-color", "border-color"); 1609 compress("border", "-style", "border-style"); 1610 compress("padding", "", "padding"); 1611 compress("margin", "", "margin"); 1612 compress2('border', 'border-width', 'border-style', 'border-color'); 1613 1614 return o; 1615 }, 1616 1617 serializeStyle : function(o) { 1618 var s = ''; 1619 1620 each(o, function(v, k) { 1621 if (k && v) { 1622 switch (k) { 1623 case 'color': 1624 case 'background-color': 1625 v = v.toLowerCase(); 1626 break; 1627 } 1628 1629 s += (s ? ' ' : '') + k + ': ' + v + ';'; 1630 } 1631 }); 1632 1633 return s; 1634 }, 1635 1636 loadCSS : function(u) { 1637 var t = this, d = this.doc; 1638 1639 if (!u) 1640 u = ''; 1641 1642 each(u.split(','), function(u) { 1643 if (t.files[u]) 1644 return; 1645 1646 t.files[u] = true; 1647 1648 if (!d.createStyleSheet) 1649 t.add(t.select('head')[0], 'link', {rel : 'stylesheet', href : u}); 1650 else 1651 d.createStyleSheet(u); 1652 }); 1653 }, 1654 1655 // #if !jquery 1656 1657 addClass : function(e, c) { 1658 return this.run(e, function(e) { 1659 var o; 1660 1661 if (!c) 1662 return 0; 1663 1664 if (this.hasClass(e, c)) 1665 return e.className; 1666 1667 o = this.removeClass(e, c); 1668 1669 return e.className = (o != '' ? (o + ' ') : '') + c; 1670 }); 1671 }, 1672 1673 removeClass : function(e, c) { 1674 var t = this, re; 1675 1676 return t.run(e, function(e) { 1677 var v; 1678 1679 if (t.hasClass(e, c)) { 1680 if (!re) 1681 re = new RegExp("(^|\\s+)" + c + "(\\s+|$)", "g"); 1682 1683 v = e.className.replace(re, ' '); 1684 1685 return e.className = tinymce.trim(v != ' ' ? v : ''); 1686 } 1687 1688 return e.className; 1689 }); 1690 }, 1691 1692 hasClass : function(n, c) { 1693 n = this.get(n); 1694 1695 if (!n || !c) 1696 return false; 1697 1698 return (' ' + n.className + ' ').indexOf(' ' + c + ' ') !== -1; 1699 }, 1700 1701 show : function(e) { 1702 return this.setStyle(e, 'display', 'block'); 1703 }, 1704 1705 hide : function(e) { 1706 return this.setStyle(e, 'display', 'none'); 1707 }, 1708 1709 isHidden : function(e) { 1710 e = this.get(e); 1711 1712 return e.style.display == 'none' || this.getStyle(e, 'display') == 'none'; 1713 }, 1714 1715 // #endif 1716 1717 uniqueId : function(p) { 1718 return (!p ? 'mce_' : p) + (this.counter++); 1719 }, 1720 1721 setHTML : function(e, h) { 1722 var t = this; 1723 1724 return this.run(e, function(e) { 1725 var r; 1726 1727 h = t.processHTML(h); 1728 1729 if (isIE) { 1730 e.innerHTML = '<br />' + h; 1731 e.removeChild(e.firstChild); 1732 } else 1733 e.innerHTML = h; 1734 1735 return h; 1736 }); 1737 }, 1738 1739 processHTML : function(h) { 1740 var t = this, s = t.settings; 1741 1742 // Convert strong and em to b and i in FF since it can't handle them 1743 if (tinymce.isGecko) { 1744 h = h.replace(/<(\/?)strong>|<strong( [^>]+)>/gi, '<$1b$2>'); 1745 h = h.replace(/<(\/?)em>|<em( [^>]+)>/gi, '<$1i$2>'); 1746 } 1747 1748 // Fix some issues 1749 h = h.replace(/<(a)([^>]*)\/>/gi, '<$1$2></$1>'); // Force open 1750 1751 // Store away src and href in mce_src and mce_href since browsers mess them up 1752 if (s.keep_values) { 1753 // Wrap scripts in comments for serialization purposes 1754 if (h.indexOf('<script') !== -1) { 1755 h = h.replace(/<script>/g, '<script type="text/javascript">'); 1756 h = h.replace(/<script(|[^>]+)>(\s*<!--|\/\/\s*<\[CDATA\[)?[\r\n]*/g, '<mce:script$1><!--\n'); 1757 h = h.replace(/\s*(\/\/\s*-->|\/\/\s*]]>)?<\/script>/g, '\n// --></mce:script>'); 1758 h = h.replace(/<mce:script(|[^>]+)><!--\n\/\/ --><\/mce:script>/g, '<mce:script$1></mce:script>'); 1759 } 1760 1761 // Process all tags with src, href or style 1762 h = h.replace(/<([\w:]+) [^>]*(src|href|style)[^>]*>/gi, function(a, n) { 1763 function handle(m, b, c) { 1764 var u = c; 1765 1766 // Tag already got a mce_ version 1767 if (a.indexOf('mce_' + b) != -1) 1768 return m; 1769 1770 if (b == 'style') { 1771 // Why did I need this one? 1772 //if (isIE) 1773 // u = t.serializeStyle(t.parseStyle(u)); 1774 1775 if (s.hex_colors) { 1776 u = u.replace(/rgb\([^\)]+\)/g, function(v) { 1777 return t.toHex(v); 1778 }); 1779 } 1780 1781 if (s.url_converter) { 1782 u = u.replace(/url\([\'\"]?([^\)\'\"]+)\)/g, function(x, c) { 1783 return 'url(' + t.encode(s.url_converter.call(s.url_converter_scope || t, t.decode(c), b, n)) + ')'; 1784 }); 1785 } 1786 } else { 1787 if (s.url_converter) 1788 u = t.encode(s.url_converter.call(s.url_converter_scope || t, t.decode(c), b, n)); 1789 } 1790 1791 return ' ' + b + '="' + c + '" mce_' + b + '="' + u + '"'; 1792 }; 1793 1794 a = a.replace(/ (src|href|style)=[\"]([^\"]+)[\"]/gi, handle); // W3C 1795 a = a.replace(/ (src|href|style)=[\']([^\']+)[\']/gi, handle); // W3C 1796 1797 return a.replace(/ (src|href|style)=([^\s\"\'>]+)/gi, handle); // IE 1798 }); 1799 } 1800 1801 return h; 1802 }, 1803 1804 getOuterHTML : function(e) { 1805 var d; 1806 1807 e = this.get(e); 1808 1809 if (!e) 1810 return null; 1811 1812 if (isIE) 1813 return e.outerHTML; 1814 1815 d = (e.ownerDocument || this.doc).createElement("body"); 1816 d.appendChild(e.cloneNode(true)); 1817 1818 return d.innerHTML; 1819 }, 1820 1821 setOuterHTML : function(e, h, d) { 1822 var t = this; 1823 1824 return this.run(e, function(e) { 1825 var n, tp; 1826 1827 e = t.get(e); 1828 d = d || e.ownerDocument || t.doc; 1829 1830 if (isIE && e.nodeType == 1) 1831 e.outerHTML = h; 1832 else { 1833 tp = d.createElement("body"); 1834 tp.innerHTML = h; 1835 1836 n = tp.lastChild; 1837 while (n) { 1838 t.insertAfter(n.cloneNode(true), e); 1839 n = n.previousSibling; 1840 } 1841 1842 t.remove(e); 1843 } 1844 }); 1845 }, 1846 1847 decode : function(s) { 1848 var e = document.createElement("div"); 1849 1850 e.innerHTML = s; 1851 1852 return !e.firstChild ? s : e.firstChild.nodeValue; 1853 }, 1854 1855 encode : function(s) { 1856 return s ? ('' + s).replace(/[<>&\"]/g, function (c, b) { 1857 switch (c) { 1858 case '&': 1859 return '&'; 1860 1861 case '"': 1862 return '"'; 1863 1864 case '<': 1865 return '<'; 1866 1867 case '>': 1868 return '>'; 1869 } 1870 1871 return c; 1872 }) : s; 1873 }, 1874 1875 // #if !jquery 1876 1877 insertAfter : function(n, r) { 1878 var t = this; 1879 1880 r = t.get(r); 1881 1882 return this.run(n, function(n) { 1883 var p, ns; 1884 1885 p = r.parentNode; 1886 ns = r.nextSibling; 1887 1888 if (ns) 1889 p.insertBefore(n, ns); 1890 else 1891 p.appendChild(n); 1892 1893 return n; 1894 }); 1895 }, 1896 1897 // #endif 1898 1899 isBlock : function(n) { 1900 if (n.nodeType && n.nodeType !== 1) 1901 return false; 1902 1903 n = n.nodeName || n; 1904 1905 return /^(H[1-6]|HR|P|DIV|ADDRESS|PRE|FORM|TABLE|LI|OL|UL|TD|CAPTION|BLOCKQUOTE|CENTER|DL|DT|DD|DIR|FIELDSET|FORM|NOSCRIPT|NOFRAMES|MENU|ISINDEX|SAMP)$/.test(n); 1906 }, 1907 1908 // #if !jquery 1909 1910 replace : function(n, o, k) { 1911 if (is(o, 'array')) 1912 n = n.cloneNode(true); 1913 1914 return this.run(o, function(o) { 1915 if (k) { 1916 each(o.childNodes, function(c) { 1917 n.appendChild(c.cloneNode(true)); 1918 }); 1919 } 1920 1921 return o.parentNode.replaceChild(n, o); 1922 }); 1923 }, 1924 1925 // #endif 1926 1927 toHex : function(s) { 1928 var c = /^\s*rgb\s*?\(\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?\)\s*$/i.exec(s); 1929 1930 function hex(s) { 1931 s = parseInt(s).toString(16); 1932 1933 return s.length > 1 ? s : '0' + s; // 0 -> 00 1934 }; 1935 1936 if (c) { 1937 s = '#' + hex(c[1]) + hex(c[2]) + hex(c[3]); 1938 1939 return s; 1940 } 1941 1942 return s; 1943 }, 1944 1945 getClasses : function() { 1946 var t = this, cl = [], i, lo = {}, f = t.settings.class_filter; 1947 1948 if (t.classes) 1949 return t.classes; 1950 1951 function addClasses(s) { 1952 // IE style imports 1953 each(s.imports, function(r) { 1954 addClasses(r); 1955 }); 1956 1957 each(s.cssRules || s.rules, function(r) { 1958 // Real type or fake it on IE 1959 switch (r.type || 1) { 1960 // Rule 1961 case 1: 1962 if (r.selectorText) { 1963 each(r.selectorText.split(','), function(v) { 1964 v = v.replace(/^\s*|\s*$|^\s\./g, ""); 1965 1966 if (f && !(v = f(v))) 1967 return; 1968 1969 if (/^\.mce/.test(v) || !/^\.[\w\-]+$/.test(v)) 1970 return; 1971 1972 v = v.substring(1); 1973 if (!lo[v]) { 1974 cl.push({'class' : v}); 1975 lo[v] = 1; 1976 } 1977 }); 1978 } 1979 break; 1980 1981 // Import 1982 case 3: 1983 addClasses(r.styleSheet); 1984 break; 1985 } 1986 }); 1987 }; 1988 1989 try { 1990 each(t.doc.styleSheets, addClasses); 1991 } catch (ex) { 1992 // Ignore 1993 } 1994 1995 if (cl.length > 0) 1996 t.classes = cl; 1997 1998 return cl; 1999 }, 2000 2001 run : function(e, f, s) { 2002 var t = this, o; 2003 2004 if (typeof(e) === 'string') 2005 e = t.doc.getElementById(e); 2006 2007 if (!e) 2008 return false; 2009 2010 s = s || this; 2011 if (!e.nodeType && (e.length || e.length === 0)) { 2012 o = []; 2013 2014 each(e, function(e, i) { 2015 if (e) { 2016 if (typeof(e) == 'string') 2017 e = t.doc.getElementById(e); 2018 2019 o.push(f.call(s, e, i)); 2020 } 2021 }); 2022 2023 return o; 2024 } 2025 2026 return f.call(s, e); 2027 } 2028 2029 /* 2030 walk : function(n, f, s) { 2031 var d = this.doc, w; 2032 2033 if (d.createTreeWalker) { 2034 w = d.createTreeWalker(n, NodeFilter.SHOW_TEXT, null, false); 2035 2036 while ((n = w.nextNode()) != null) 2037 f.call(s || this, n); 2038 } else 2039 tinymce.walk(n, f, 'childNodes', s); 2040 } 2041 */ 2042 2043 /* 2044 toRGB : function(s) { 2045 var c = /^\s*?#([0-9A-F]{2})([0-9A-F]{1,2})([0-9A-F]{2})?\s*?$/.exec(s); 2046 2047 if (c) { 2048 // #FFF -> #FFFFFF 2049 if (!is(c[3])) 2050 c[3] = c[2] = c[1]; 2051 2052 return "rgb(" + parseInt(c[1], 16) + "," + parseInt(c[2], 16) + "," + parseInt(c[3], 16) + ")"; 2053 } 2054 2055 return s; 2056 } 2057 */ 2058 2059 }); 2060 2061 // Setup page DOM 2062 tinymce.DOM = new tinymce.dom.DOMUtils(document); 2063 })(); 2064 2065 /* file:jscripts/tiny_mce/classes/dom/Event.js */ 2066 2067 (function() { 2068 // Shorten names 2069 var each = tinymce.each, DOM = tinymce.DOM, isIE = tinymce.isIE, isWebKit = tinymce.isWebKit, Event; 2070 2071 tinymce.create('static tinymce.dom.Event', { 2072 inits : [], 2073 events : [], 2074 2075 // #if !jquery 2076 2077 add : function(o, n, f, s) { 2078 var cb, t = this, el = t.events, r; 2079 2080 // Handle array 2081 if (o && o instanceof Array) { 2082 r = []; 2083 2084 each(o, function(o) { 2085 o = DOM.get(o); 2086 r.push(t.add(o, n, f, s)); 2087 }); 2088 2089 return r; 2090 } 2091 2092 o = DOM.get(o); 2093 2094 if (!o) 2095 return; 2096 2097 // Setup event callback 2098 cb = function(e) { 2099 e = e || window.event; 2100 2101 // Patch in target in IE it's W3C valid 2102 if (e && !e.target && isIE) 2103 e.target = e.srcElement; 2104 2105 if (!s) 2106 return f(e); 2107 2108 return f.call(s, e); 2109 }; 2110 2111 if (n == 'unload') { 2112 tinymce.unloads.unshift({func : cb}); 2113 return cb; 2114 } 2115 2116 if (n == 'init') { 2117 if (t.domLoaded) 2118 cb(); 2119 else 2120 t.inits.push(cb); 2121 2122 return cb; 2123 } 2124 2125 // Store away listener reference 2126 el.push({ 2127 obj : o, 2128 name : n, 2129 func : f, 2130 cfunc : cb, 2131 scope : s 2132 }); 2133 2134 t._add(o, n, cb); 2135 2136 return f; 2137 }, 2138 2139 remove : function(o, n, f) { 2140 var t = this, a = t.events, s = false, r; 2141 2142 // Handle array 2143 if (o && o instanceof Array) { 2144 r = []; 2145 2146 each(o, function(o) { 2147 o = DOM.get(o); 2148 r.push(t.remove(o, n, f)); 2149 }); 2150 2151 return r; 2152 } 2153 2154 o = DOM.get(o); 2155 2156 each(a, function(e, i) { 2157 if (e.obj == o && e.name == n && (!f || (e.func == f || e.cfunc == f))) { 2158 a.splice(i, 1); 2159 t._remove(o, n, e.cfunc); 2160 s = true; 2161 return false; 2162 } 2163 }); 2164 2165 return s; 2166 }, 2167 2168 // #endif 2169 2170 cancel : function(e) { 2171 if (!e) 2172 return false; 2173 2174 this.stop(e); 2175 return this.prevent(e); 2176 }, 2177 2178 stop : function(e) { 2179 if (e.stopPropagation) 2180 e.stopPropagation(); 2181 else 2182 e.cancelBubble = true; 2183 2184 return false; 2185 }, 2186 2187 prevent : function(e) { 2188 if (e.preventDefault) 2189 e.preventDefault(); 2190 else 2191 e.returnValue = false; 2192 2193 return false; 2194 }, 2195 2196 _unload : function() { 2197 var t = Event; 2198 2199 each(t.events, function(e, i) { 2200 t._remove(e.obj, e.name, e.cfunc); 2201 e.obj = e.cfunc = null; 2202 }); 2203 2204 t.events = []; 2205 t = null; 2206 }, 2207 2208 _add : function(o, n, f) { 2209 if (o.attachEvent) 2210 o.attachEvent('on' + n, f); 2211 else if (o.addEventListener) 2212 o.addEventListener(n, f, false); 2213 else 2214 o['on' + n] = f; 2215 }, 2216 2217 _remove : function(o, n, f) { 2218 if (o.detachEvent) 2219 o.detachEvent('on' + n, f); 2220 else if (o.removeEventListener) 2221 o.removeEventListener(n, f, false); 2222 else 2223 o['on' + n] = null; 2224 }, 2225 2226 _pageInit : function() { 2227 var e = Event; 2228 2229 e._remove(window, 'DOMContentLoaded', e._pageInit); 2230 e.domLoaded = true; 2231 2232 each(e.inits, function(c) { 2233 c(); 2234 }); 2235 2236 e.inits = []; 2237 }, 2238 2239 _wait : function() { 2240 var t; 2241 2242 // No need since the document is already loaded 2243 if (window.tinyMCE_GZ && tinyMCE_GZ.loaded) 2244 return; 2245 2246 if (isIE && document.location.protocol != 'https:') { 2247 // Fake DOMContentLoaded on IE 2248 document.write('<script id=__ie_onload defer src=\'javascript:""\';><\/script>'); 2249 DOM.get("__ie_onload").onreadystatechange = function() { 2250 if (this.readyState == "complete") { 2251 Event._pageInit(); 2252 DOM.get("__ie_onload").onreadystatechange = null; // Prevent leak 2253 } 2254 }; 2255 } else { 2256 Event._add(window, 'DOMContentLoaded', Event._pageInit, Event); 2257 2258 if (isIE || isWebKit) { 2259 t = setInterval(function() { 2260 if (/loaded|complete/.test(document.readyState)) { 2261 clearInterval(t); 2262 Event._pageInit(); 2263 } 2264 }, 10); 2265 } 2266 } 2267 } 2268 2269 }); 2270 2271 // Shorten name 2272 Event = tinymce.dom.Event; 2273 2274 // Dispatch DOM content loaded event for IE and Safari 2275 Event._wait(); 2276 tinymce.addUnload(Event._unload); 2277 })(); 2278 2279 /* file:jscripts/tiny_mce/classes/dom/Element.js */ 2280 2281 (function() { 2282 var each = tinymce.each; 2283 2284 tinymce.create('tinymce.dom.Element', { 2285 Element : function(id, s) { 2286 var t = this, dom, el; 2287 2288 s = s || {}; 2289 t.id = id; 2290 t.dom = dom = s.dom || tinymce.DOM; 2291 t.settings = s; 2292 2293 // Only IE leaks DOM references, this is a lot faster 2294 if (!tinymce.isIE) 2295 el = t.dom.get(t.id); 2296 2297 each([ 2298 'getPos', 2299 'getRect', 2300 'getParent', 2301 'add', 2302 'setStyle', 2303 'getStyle', 2304 'setStyles', 2305 'setAttrib', 2306 'setAttribs', 2307 'getAttrib', 2308 'addClass', 2309 'removeClass', 2310 'hasClass', 2311 'getOuterHTML', 2312 'setOuterHTML', 2313 'remove', 2314 'show', 2315 'hide', 2316 'isHidden', 2317 'setHTML', 2318 'get' 2319 ], function(k) { 2320 t[k] = function() { 2321 var a = arguments, o; 2322 2323 // Opera fails 2324 if (tinymce.isOpera) { 2325 a = [id]; 2326 2327 each(arguments, function(v) { 2328 a.push(v); 2329 }); 2330 } else 2331 Array.prototype.unshift.call(a, el || id); 2332 2333 o = dom[k].apply(dom, a); 2334 t.update(k); 2335 2336 return o; 2337 }; 2338 }); 2339 }, 2340 2341 on : function(n, f, s) { 2342 return tinymce.dom.Event.add(this.id, n, f, s); 2343 }, 2344 2345 getXY : function() { 2346 return { 2347 x : parseInt(this.getStyle('left')), 2348 y : parseInt(this.getStyle('top')) 2349 }; 2350 }, 2351 2352 getSize : function() { 2353 var n = this.dom.get(this.id); 2354 2355 return { 2356 w : parseInt(this.getStyle('width') || n.clientWidth), 2357 h : parseInt(this.getStyle('height') || n.clientHeight) 2358 }; 2359 }, 2360 2361 moveTo : function(x, y) { 2362 this.setStyles({left : x, top : y}); 2363 }, 2364 2365 moveBy : function(x, y) { 2366 var p = this.getXY(); 2367 2368 this.moveTo(p.x + x, p.y + y); 2369 }, 2370 2371 resizeTo : function(w, h) { 2372 this.setStyles({width : w, height : h}); 2373 }, 2374 2375 resizeBy : function(w, h) { 2376 var s = this.getSize(); 2377 2378 this.resizeTo(s.w + w, s.h + h); 2379 }, 2380 2381 update : function(k) { 2382 var t = this, b, dom = t.dom; 2383 2384 if (tinymce.isIE6 && t.settings.blocker) { 2385 k = k || ''; 2386 2387 // Ignore getters 2388 if (k.indexOf('get') === 0 || k.indexOf('has') === 0 || k.indexOf('is') === 0) 2389 return; 2390 2391 // Remove blocker on remove 2392 if (k == 'remove') { 2393 dom.remove(t.blocker); 2394 return; 2395 } 2396 2397 if (!t.blocker) { 2398 t.blocker = dom.uniqueId(); 2399 b = dom.add(t.settings.container || dom.getRoot(), 'iframe', {id : t.blocker, style : 'position:absolute;', frameBorder : 0, src : 'javascript:""'}); 2400 dom.setStyle(b, 'opacity', 0); 2401 } else 2402 b = dom.get(t.blocker); 2403 2404 dom.setStyle(b, 'left', t.getStyle('left', 1)); 2405 dom.setStyle(b, 'top', t.getStyle('top', 1)); 2406 dom.setStyle(b, 'width', t.getStyle('width', 1)); 2407 dom.setStyle(b, 'height', t.getStyle('height', 1)); 2408 dom.setStyle(b, 'display', t.getStyle('display', 1)); 2409 dom.setStyle(b, 'zIndex', parseInt(t.getStyle('zIndex', 1) || 0) - 1); 2410 } 2411 } 2412 2413 }); 2414 })(); 2415 2416 /* file:jscripts/tiny_mce/classes/dom/Selection.js */ 2417 2418 (function() { 2419 // Shorten names 2420 var is = tinymce.is, isIE = tinymce.isIE, each = tinymce.each; 2421 2422 tinymce.create('tinymce.dom.Selection', { 2423 Selection : function(dom, win, serializer) { 2424 var t = this; 2425 2426 t.dom = dom; 2427 t.win = win; 2428 t.serializer = serializer; 2429 2430 // Prevent leaks 2431 tinymce.addUnload(function() { 2432 t.win = null; 2433 }); 2434 }, 2435 2436 getContent : function(s) { 2437 var t = this, r = t.getRng(), e = t.dom.create("body"), se = t.getSel(), wb, wa, n; 2438 2439 s = s || {}; 2440 wb = wa = ''; 2441 s.get = true; 2442 s.format = s.format || 'html'; 2443 2444 if (s.format == 'text') 2445 return t.isCollapsed() ? '' : (r.text || (se.toString ? se.toString() : '')); 2446 2447 if (r.cloneContents) { 2448 n = r.cloneContents(); 2449 2450 if (n) 2451 e.appendChild(n); 2452 } else if (is(r.item) || is(r.htmlText)) 2453 e.innerHTML = r.item ? r.item(0).outerHTML : r.htmlText; 2454 else 2455 e.innerHTML = r.toString(); 2456 2457 // Keep whitespace before and after 2458 if (/^\s/.test(e.innerHTML)) 2459 wb = ' '; 2460 2461 if (/\s+$/.test(e.innerHTML)) 2462 wa = ' '; 2463 2464 return t.isCollapsed() ? '' : wb + t.serializer.serialize(e, s) + wa; 2465 }, 2466 2467 setContent : function(h, s) { 2468 var t = this, r = t.getRng(), d; 2469 2470 s = s || {format : 'html'}; 2471 s.set = true; 2472 h = t.dom.processHTML(h); 2473 2474 if (r.insertNode) { 2475 d = t.win.document; 2476 2477 // Use insert HTML if it exists (places cursor after content) 2478 if (d.queryCommandEnabled('InsertHTML')) 2479 return d.execCommand('InsertHTML', false, h); 2480 2481 r.deleteContents(); 2482 r.insertNode(t.getRng().createContextualFragment(h)); 2483 } else { 2484 if (r.item) 2485 r.item(0).outerHTML = h; 2486 else 2487 r.pasteHTML(h); 2488 } 2489 }, 2490 2491 getStart : function() { 2492 var t = this, r = t.getRng(), e; 2493 2494 if (isIE) { 2495 if (r.item) 2496 return r.item(0); 2497 2498 r = r.duplicate(); 2499 r.collapse(1); 2500 e = r.parentElement(); 2501 2502 if (e.nodeName == 'BODY') 2503 return e.firstChild; 2504 2505 return e; 2506 } else { 2507 e = r.startContainer; 2508 2509 if (e.nodeName == 'BODY') 2510 return e.firstChild; 2511 2512 return t.dom.getParent(e, function(n) {return n.nodeType == 1;}); 2513 } 2514 }, 2515 2516 getEnd : function() { 2517 var t = this, r = t.getRng(), e; 2518 2519 if (isIE) { 2520 if (r.item) 2521 return r.item(0); 2522 2523 r = r.duplicate(); 2524 r.collapse(0); 2525 e = r.parentElement(); 2526 2527 if (e.nodeName == 'BODY') 2528 return e.lastChild; 2529 2530 return e; 2531 } else { 2532 e = r.endContainer; 2533 2534 if (e.nodeName == 'BODY') 2535 return e.lastChild; 2536 2537 return t.dom.getParent(e, function(n) {return n.nodeType == 1;}); 2538 } 2539 }, 2540 2541 getBookmark : function(si) { 2542 var t = this, r = t.getRng(), tr, sx, sy, vp = t.dom.getViewPort(t.win), e, sp, bp, le, c = -0xFFFFFF, s, ro = t.dom.getRoot(); 2543 2544 sx = vp.x; 2545 sy = vp.y; 2546 2547 // Simple bookmark fast but not as persistent 2548 if (si == 'simple') 2549 return {rng : r, scrollX : sx, scrollY : sy}; 2550 2551 // Handle IE 2552 if (isIE) { 2553 // Control selection 2554 if (r.item) { 2555 e = r.item(0); 2556 2557 each(t.dom.select(e.nodeName), function(n, i) { 2558 if (e == n) { 2559 sp = i; 2560 return false; 2561 } 2562 }); 2563 2564 return { 2565 tag : e.nodeName, 2566 index : sp, 2567 scrollX : sx, 2568 scrollY : sy 2569 }; 2570 } 2571 2572 // Text selection 2573 tr = t.dom.doc.body.createTextRange(); 2574 tr.moveToElementText(ro); 2575 tr.collapse(true); 2576 bp = Math.abs(tr.move('character', c)); 2577 2578 tr = r.duplicate(); 2579 tr.collapse(true); 2580 sp = Math.abs(tr.move('character', c)); 2581 2582 tr = r.duplicate(); 2583 tr.collapse(false); 2584 le = Math.abs(tr.move('character', c)) - sp; 2585 2586 return { 2587 start : sp - bp, 2588 length : le, 2589 scrollX : sx, 2590 scrollY : sy 2591 }; 2592 } 2593 2594 // Handle W3C 2595 e = t.getNode(); 2596 s = t.getSel(); 2597 2598 if (!s) 2599 return null; 2600 2601 // Image selection 2602 if (e && e.nodeName == 'IMG') { 2603 return { 2604 scrollX : sx, 2605 scrollY : sy 2606 }; 2607 } 2608 2609 // Text selection 2610 2611 function getPos(r, sn, en) { 2612 var w = document.createTreeWalker(r, NodeFilter.SHOW_TEXT, null, false), n, p = 0, d = {}; 2613 2614 while ((n = w.nextNode()) != null) { 2615 if (n == sn) 2616 d.start = p; 2617 2618 if (n == en) { 2619 d.end = p; 2620 return d; 2621 } 2622 2623 p += n.nodeValue ? n.nodeValue.length : 0; 2624 } 2625 2626 return null; 2627 }; 2628 2629 // Caret or selection 2630 if (s.anchorNode == s.focusNode && s.anchorOffset == s.focusOffset) { 2631 e = getPos(ro, s.anchorNode, s.focusNode); 2632 2633 if (!e) 2634 return {scrollX : sx, scrollY : sy}; 2635 2636 return { 2637 start : e.start + s.anchorOffset, 2638 end : e.end + s.focusOffset, 2639 scrollX : sx, 2640 scrollY : sy 2641 }; 2642 } else { 2643 e = getPos(ro, r.startContainer, r.endContainer); 2644 2645 if (!e) 2646 return {scrollX : sx, scrollY : sy}; 2647 2648 return { 2649 start : e.start + r.startOffset, 2650 end : e.end + r.endOffset, 2651 scrollX : sx, 2652 scrollY : sy 2653 }; 2654 } 2655 }, 2656 2657 moveToBookmark : function(b) { 2658 var t = this, r = t.getRng(), s = t.getSel(), ro = t.dom.getRoot(), sd; 2659 2660 function getPos(r, sp, ep) { 2661 var w = document.createTreeWalker(r, NodeFilter.SHOW_TEXT, null, false), n, p = 0, d = {}; 2662 2663 while ((n = w.nextNode()) != null) { 2664 p += n.nodeValue ? n.nodeValue.length : 0; 2665 2666 if (p >= sp && !d.startNode) { 2667 d.startNode = n; 2668 d.startOffset = sp - (p - n.nodeValue.length); 2669 } 2670 2671 if (p >= ep) { 2672 d.endNode = n; 2673 d.endOffset = ep - (p - n.nodeValue.length); 2674 2675 return d; 2676 } 2677 } 2678 2679 return null; 2680 }; 2681 2682 if (!b) 2683 return false; 2684 2685 t.win.scrollTo(b.scrollX, b.scrollY); 2686 2687 // Handle explorer 2688 if (isIE) { 2689 // Handle simple 2690 if (r = b.rng) { 2691 try { 2692 r.select(); 2693 } catch (ex) { 2694 // Ignore 2695 } 2696 2697 return true; 2698 } 2699 2700 t.win.focus(); 2701 2702 // Handle control bookmark 2703 if (b.tag) { 2704 r = ro.createControlRange(); 2705 2706 each(t.dom.select(b.tag), function(n, i) { 2707 if (i == b.index) 2708 r.addElement(n); 2709 }); 2710 } else { 2711 // Try/catch needed since this operation breaks when TinyMCE is placed in hidden divs/tabs 2712 try { 2713 // Incorrect bookmark 2714 if (b.start < 0) 2715 return true; 2716 2717 r = s.createRange(); 2718 r.moveToElementText(ro); 2719 r.collapse(true); 2720 r.moveStart('character', b.start); 2721 r.moveEnd('character', b.length); 2722 } catch (ex2) { 2723 return true; 2724 } 2725 } 2726 2727 r.select(); 2728 2729 return true; 2730 } 2731 2732 // Handle W3C 2733 if (!s) 2734 return false; 2735 2736 // Handle simple 2737 if (b.rng) { 2738 s.removeAllRanges(); 2739 s.addRange(b.rng); 2740 } else { 2741 if (is(b.start) && is(b.end)) { 2742 try { 2743 sd = getPos(ro, b.start, b.end); 2744 if (sd) { 2745 r = t.dom.doc.createRange(); 2746 r.setStart(sd.startNode, sd.startOffset); 2747 r.setEnd(sd.endNode, sd.endOffset); 2748 s.removeAllRanges(); 2749 s.addRange(r); 2750 } 2751 2752 if (!tinymce.isOpera) 2753 t.win.focus(); 2754 } catch (ex) { 2755 // Ignore 2756 } 2757 } 2758 } 2759 }, 2760 2761 select : function(n, c) { 2762 var t = this, r = t.getRng(), s = t.getSel(), b, fn, ln, d = t.win.document; 2763 2764 function first(n) { 2765 return n ? d.createTreeWalker(n, NodeFilter.SHOW_TEXT, null, false).nextNode() : null; 2766 }; 2767 2768 function last(n) { 2769 var c, o, w; 2770 2771 if (!n) 2772 return null; 2773 2774 w = d.createTreeWalker(n, NodeFilter.SHOW_TEXT, null, false); 2775 while (c = w.nextNode()) 2776 o = c; 2777 2778 return o; 2779 }; 2780 2781 if (isIE) { 2782 try { 2783 b = d.body; 2784 2785 if (/^(IMG|TABLE)$/.test(n.nodeName)) { 2786 r = b.createControlRange(); 2787 r.addElement(n); 2788 } else { 2789 r = b.createTextRange(); 2790 r.moveToElementText(n); 2791 } 2792 2793 r.select(); 2794 } catch (ex) { 2795 // Throws illigal agrument in IE some times 2796 } 2797 } else { 2798 if (c) { 2799 fn = first(n); 2800 ln = last(n); 2801 2802 if (fn && ln) { 2803 //console.debug(fn, ln); 2804 r = d.createRange(); 2805 r.setStart(fn, 0); 2806 r.setEnd(ln, ln.nodeValue.length); 2807 } else 2808 r.selectNode(n); 2809 } else 2810 r.selectNode(n); 2811 2812 t.setRng(r); 2813 } 2814 2815 return n; 2816 }, 2817 2818 isCollapsed : function() { 2819 var t = this, r = t.getRng(), s = t.getSel(); 2820 2821 if (!r || r.item) 2822 return false; 2823 2824 return !s || r.boundingWidth == 0 || s.isCollapsed; 2825 }, 2826 2827 collapse : function(b) { 2828 var t = this, r = t.getRng(), n; 2829 2830 // Control range on IE 2831 if (r.item) { 2832 n = r.item(0); 2833 r = this.win.document.body.createTextRange(); 2834 r.moveToElementText(n); 2835 } 2836 2837 r.collapse(!!b); 2838 t.setRng(r); 2839 }, 2840 2841 getSel : function() { 2842 var t = this, w = this.win; 2843 2844 return w.getSelection ? w.getSelection() : w.document.selection; 2845 }, 2846 2847 getRng : function() { 2848 var t = this, s = t.getSel(), r; 2849 2850 try { 2851 if (s) 2852 r = s.rangeCount > 0 ? s.getRangeAt(0) : (s.createRange ? s.createRange() : t.win.document.createRange()); 2853 } catch (ex) { 2854 // IE throws unspecified error here if TinyMCE is placed in a frame/iframe 2855 } 2856 2857 // No range found then create an empty one 2858 // This can occur when the editor is placed in a hidden container element on Gecko 2859 // Or on IE when there was an exception 2860 if (!r) 2861 r = isIE ? t.win.document.body.createTextRange() : t.win.document.createRange(); 2862 2863 return r; 2864 }, 2865 2866 setRng : function(r) { 2867 var s; 2868 2869 if (!isIE) { 2870 s = this.getSel(); 2871 2872 if (s) { 2873 s.removeAllRanges(); 2874 s.addRange(r); 2875 } 2876 } else 2877 r.select(); 2878 }, 2879 2880 setNode : function(n) { 2881 var t = this; 2882 2883 t.setContent(t.dom.getOuterHTML(n)); 2884 2885 return n; 2886 }, 2887 2888 getNode : function() { 2889 var t = this, r = t.getRng(), s = t.getSel(), e; 2890 2891 if (!isIE) { 2892 // Range maybe lost after the editor is made visible again 2893 if (!r) 2894 return t.dom.getRoot(); 2895 2896 e = r.commonAncestorContainer; 2897 2898 // Handle selection a image or other control like element such as anchors 2899 if (!r.collapsed) { 2900 if (r.startContainer == r.endContainer || (tinymce.isWebKit && r.startContainer == r.endContainer.parentNode)) { 2901 if (r.startOffset - r.endOffset < 2 || tinymce.isWebKit) { 2902 if (r.startContainer.hasChildNodes()) 2903 e = r.startContainer.childNodes[r.startOffset]; 2904 } 2905 } 2906 } 2907 2908 return t.dom.getParent(e, function(n) { 2909 return n.nodeType == 1; 2910 }); 2911 } 2912 2913 return r.item ? r.item(0) : r.parentElement(); 2914 } 2915 2916 }); 2917 })(); 2918 2919 /* file:jscripts/tiny_mce/classes/dom/XMLWriter.js */ 2920 2921 (function() { 2922 tinymce.create('tinymce.dom.XMLWriter', { 2923 node : null, 2924 2925 XMLWriter : function(s) { 2926 // Get XML document 2927 function getXML() { 2928 var i = document.implementation; 2929 2930 if (!i || !i.createDocument) { 2931 // Try IE objects 2932 try {return new ActiveXObject('MSXML2.DOMDocument');} catch (ex) {} 2933 try {return new ActiveXObject('Microsoft.XmlDom');} catch (ex) {} 2934 } else 2935 return i.createDocument('', '', null); 2936 }; 2937 2938 this.doc = getXML(); 2939 this.reset(); 2940 }, 2941 2942 reset : function() { 2943 var t = this, d = t.doc; 2944 2945 if (d.firstChild) 2946 d.removeChild(d.firstChild); 2947 2948 t.node = d.appendChild(d.createElement("html")); 2949 }, 2950 2951 writeStartElement : function(n) { 2952 var t = this; 2953 2954 t.node = t.node.appendChild(t.doc.createElement(n)); 2955 }, 2956 2957 writeAttribute : function(n, v) { 2958 // Since Opera doesn't escape > into > we need to do it our self 2959 if (tinymce.isOpera) 2960 v = v.replace(/>/g, '|>'); 2961 2962 this.node.setAttribute(n, v); 2963 }, 2964 2965 writeEndElement : function() { 2966 this.node = this.node.parentNode; 2967 }, 2968 2969 writeFullEndElement : function() { 2970 var t = this, n = t.node; 2971 2972 n.appendChild(t.doc.createTextNode("")); 2973 t.node = n.parentNode; 2974 }, 2975 2976 writeText : function(v) { 2977 // Since Opera doesn't escape > into > we need to do it our self 2978 if (tinymce.isOpera) 2979 v = v.replace(/>/g, '|>'); 2980 2981 this.node.appendChild(this.doc.createTextNode(v)); 2982 }, 2983 2984 writeCDATA : function(v) { 2985 this.node.appendChild(this.doc.createCDATA(v)); 2986 }, 2987 2988 writeComment : function(v) { 2989 this.node.appendChild(this.doc.createComment(v)); 2990 }, 2991 2992 getContent : function() { 2993 var h; 2994 2995 h = this.doc.xml || new XMLSerializer().serializeToString(this.doc); 2996 h = h.replace(/<\?[^?]+\?>|<html>|<\/html>|<html\/>|<!DOCTYPE[^>]+>/g, ''); 2997 h = h.replace(/ ?\/>/g, ' />'); 2998 2999 // Since Opera doesn't escape > into > we need to do it our self to normalize the output for all browsers 3000 if (tinymce.isOpera) 3001 h = h.replace(/\|>/g, '>'); 3002 3003 return h; 3004 } 3005 3006 }); 3007 })(); 3008 3009 /* file:jscripts/tiny_mce/classes/dom/Serializer.js */ 3010 3011 (function() { 3012 // Shorten names 3013 var extend = tinymce.extend, each = tinymce.each, Dispatcher = tinymce.util.Dispatcher, isIE = tinymce.isIE; 3014 3015 // Returns only attribites that have values not all attributes in IE 3016 function getIEAtts(n) { 3017 var o = []; 3018 3019 // Object will throw exception in IE 3020 if (n.nodeName == 'OBJECT') 3021 return n.attributes; 3022 3023 n.cloneNode(false).outerHTML.replace(/([a-z0-9\-_]+)=/gi, function(a, b) { 3024 o.push({specified : 1, nodeName : b}); 3025 }); 3026 3027 return o; 3028 }; 3029 3030 function wildcardToRE(s) { 3031 return s.replace(/([?+*])/g, '.$1'); 3032 }; 3033 3034 tinymce.create('tinymce.dom.Serializer', { 3035 Serializer : function(s) { 3036 var t = this; 3037 3038 t.key = 0; 3039 t.onPreProcess = new Dispatcher(t); 3040 t.onPostProcess = new Dispatcher(t); 3041 t.writer = new tinymce.dom.XMLWriter(); 3042 3043 // Default settings 3044 t.settings = s = extend({ 3045 dom : tinymce.DOM, 3046 valid_nodes : 0, 3047 node_filter : 0, 3048 attr_filter : 0, 3049 invalid_attrs : /^(mce_|_moz_$)/, 3050 closed : /(br|hr|input|meta|img|link|param)/, 3051 entity_encoding : 'named', 3052 entities : '160,nbsp,161,iexcl,162,cent,163,pound,164,curren,165,yen,166,brvbar,167,sect,168,uml,169,copy,170,ordf,171,laquo,172,not,173,shy,174,reg,175,macr,176,deg,177,plusmn,178,sup2,179,sup3,180,acute,181,micro,182,para,183,middot,184,cedil,185,sup1,186,ordm,187,raquo,188,frac14,189,frac12,190,frac34,191,iquest,192,Agrave,193,Aacute,194,Acirc,195,Atilde,196,Auml,197,Aring,198,AElig,199,Ccedil,200,Egrave,201,Eacute,202,Ecirc,203,Euml,204,Igrave,205,Iacute,206,Icirc,207,Iuml,208,ETH,209,Ntilde,210,Ograve,211,Oacute,212,Ocirc,213,Otilde,214,Ouml,215,times,216,Oslash,217,Ugrave,218,Uacute,219,Ucirc,220,Uuml,221,Yacute,222,THORN,223,szlig,224,agrave,225,aacute,226,acirc,227,atilde,228,auml,229,aring,230,aelig,231,ccedil,232,egrave,233,eacute,234,ecirc,235,euml,236,igrave,237,iacute,238,icirc,239,iuml,240,eth,241,ntilde,242,ograve,243,oacute,244,ocirc,245,otilde,246,ouml,247,divide,248,oslash,249,ugrave,250,uacute,251,ucirc,252,uuml,253,yacute,254,thorn,255,yuml,402,fnof,913,Alpha,914,Beta,915,Gamma,916,Delta,917,Epsilon,918,Zeta,919,Eta,920,Theta,921,Iota,922,Kappa,923,Lambda,924,Mu,925,Nu,926,Xi,927,Omicron,928,Pi,929,Rho,931,Sigma,932,Tau,933,Upsilon,934,Phi,935,Chi,936,Psi,937,Omega,945,alpha,946,beta,947,gamma,948,delta,949,epsilon,950,zeta,951,eta,952,theta,953,iota,954,kappa,955,lambda,956,mu,957,nu,958,xi,959,omicron,960,pi,961,rho,962,sigmaf,963,sigma,964,tau,965,upsilon,966,phi,967,chi,968,psi,969,omega,977,thetasym,978,upsih,982,piv,8226,bull,8230,hellip,8242,prime,8243,Prime,8254,oline,8260,frasl,8472,weierp,8465,image,8476,real,8482,trade,8501,alefsym,8592,larr,8593,uarr,8594,rarr,8595,darr,8596,harr,8629,crarr,8656,lArr,8657,uArr,8658,rArr,8659,dArr,8660,hArr,8704,forall,8706,part,8707,exist,8709,empty,8711,nabla,8712,isin,8713,notin,8715,ni,8719,prod,8721,sum,8722,minus,8727,lowast,8730,radic,8733,prop,8734,infin,8736,ang,8743,and,8744,or,8745,cap,8746,cup,8747,int,8756,there4,8764,sim,8773,cong,8776,asymp,8800,ne,8801,equiv,8804,le,8805,ge,8834,sub,8835,sup,8836,nsub,8838,sube,8839,supe,8853,oplus,8855,otimes,8869,perp,8901,sdot,8968,lceil,8969,rceil,8970,lfloor,8971,rfloor,9001,lang,9002,rang,9674,loz,9824,spades,9827,clubs,9829,hearts,9830,diams,338,OElig,339,oelig,352,Scaron,353,scaron,376,Yuml,710,circ,732,tilde,8194,ensp,8195,emsp,8201,thinsp,8204,zwnj,8205,zwj,8206,lrm,8207,rlm,8211,ndash,8212,mdash,8216,lsquo,8217,rsquo,8218,sbquo,8220,ldquo,8221,rdquo,8222,bdquo,8224,dagger,8225,Dagger,8240,permil,8249,lsaquo,8250,rsaquo,8364,euro', 3053 valid_elements : '*[*]', 3054 extended_valid_elements : 0, 3055 valid_child_elements : 0, 3056 invalid_elements : 0, 3057 fix_table_elements : 0, 3058 fix_list_elements : true, 3059 fix_content_duplication : true, 3060 convert_fonts_to_spans : false, 3061 font_size_classes : 0, 3062 font_size_style_values : 0, 3063 apply_source_formatting : 0, 3064 indent_mode : 'simple', 3065 indent_char : '\t', 3066 indent_levels : 1, 3067 remove_linebreaks : 1 3068 }, s); 3069 3070 t.dom = s.dom; 3071 3072 if (s.fix_list_elements) { 3073 t.onPreProcess.add(function(se, o) { 3074 var nl, x, a = ['ol', 'ul'], i, n, p, r = /^(OL|UL)$/, np; 3075 3076 function prevNode(e, n) { 3077 var a = n.split(','), i; 3078 3079 while ((e = e.previousSibling) != null) { 3080 for (i=0; i<a.length; i++) { 3081 if (e.nodeName == a[i]) 3082 return e; 3083 } 3084 } 3085 3086 return null; 3087 }; 3088 3089 for (x=0; x<a.length; x++) { 3090 nl = t.dom.select(a[x], o.node); 3091 3092 for (i=0; i<nl.length; i++) { 3093 n = nl[i]; 3094 p = n.parentNode; 3095 3096 if (r.test(p.nodeName)) { 3097 np = prevNode(n, 'LI'); 3098 3099 if (!np) { 3100 np = t.dom.create('li'); 3101 np.innerHTML = ' '; 3102 np.appendChild(n); 3103 p.insertBefore(np, p.firstChild); 3104 } else 3105 np.appendChild(n); 3106 } 3107 } 3108 } 3109 }); 3110 } 3111 3112 if (s.fix_table_elements) { 3113 t.onPreProcess.add(function(se, o) { 3114 var ta = [], d = t.dom.doc; 3115 3116 // Build list of HTML chunks and replace tables with comment placeholders 3117 each(t.dom.select('table', o.node), function(e) { 3118 var pa = t.dom.getParent(e, 'H1,H2,H3,H4,H5,H6,P'), p = [], i, h; 3119 3120 if (pa) { 3121 t.dom.getParent(e, function(n) { 3122 if (n != e) 3123 p.push(n.nodeName); 3124 }); 3125 3126 h = ''; 3127 3128 for (i = 0; i < p.length; i++) 3129 h += '</' + p[i]+ '>'; 3130 3131 h += t.dom.getOuterHTML(e); 3132 3133 for (i = p.length - 1; i >= 0; i--) 3134 h += '<' + p[i]+ '>'; 3135 3136 ta.push(h); 3137 e.parentNode.replaceChild(d.createComment('mcetable:' + (ta.length - 1)), e); 3138 } 3139 }); 3140 3141 // Replace table placeholders with end parents + table + start parents HTML code 3142 t.dom.setHTML(o.node, o.node.innerHTML.replace(/<!--mcetable:([0-9]+)-->/g, function(a, b) { 3143 return ta[parseInt(b)]; 3144 })); 3145 }); 3146 } 3147 }, 3148 3149 setEntities : function(s) { 3150 var a, i, l = {}, re = '', v; 3151 3152 // No need to setup more than once 3153 if (this.entityLookup) 3154 return; 3155 3156 // Build regex and lookup array 3157 a = s.split(','); 3158 for (i = 0; i < a.length; i += 2) { 3159 v = a[i]; 3160 3161 // Don't add default & " etc. 3162 if (v == 34 || v == 38 || v == 60 || v == 62) 3163 continue; 3164 3165 l[String.fromCharCode(a[i])] = a[i + 1]; 3166 3167 v = parseInt(a[i]).toString(16); 3168 re += '\\u' + '0000'.substring(v.length) + v; 3169 } 3170 3171 this.entitiesRE = new RegExp('[' + re + ']', 'g'); 3172 this.entityLookup = l; 3173 }, 3174 3175 setValidChildRules : function(s) { 3176 this.childRules = null; 3177 this.addValidChildRules(s); 3178 }, 3179 3180 addValidChildRules : function(s) { 3181 var t = this, inst, intr, bloc; 3182 3183 if (!s) 3184 return; 3185 3186 inst = 'A|BR|SPAN|BDO|MAP|OBJECT|IMG|TT|I|B|BIG|SMALL|EM|STRONG|DFN|CODE|Q|SAMP|KBD|VAR|CITE|ABBR|ACRONYM|SUB|SUP|#text|#comment'; 3187 intr = 'A|BR|SPAN|BDO|OBJECT|APPLET|IMG|MAP|IFRAME|TT|I|B|U|S|STRIKE|BIG|SMALL|FONT|BASEFONT|EM|STRONG|DFN|CODE|Q|SAMP|KBD|VAR|CITE|ABBR|ACRONYM|SUB|SUP|INPUT|SELECT|TEXTAREA|LABEL|BUTTON|#text|#comment'; 3188 bloc = 'H[1-6]|P|DIV|ADDRESS|PRE|FORM|TABLE|LI|OL|UL|TD|CAPTION|BLOCKQUOTE|CENTER|DL|DT|DD|DIR|FIELDSET|FORM|NOSCRIPT|NOFRAMES|MENU|ISINDEX|SAMP'; 3189 3190 each(s.split(','), function(s) { 3191 var p = s.split(/\[|\]/), re; 3192 3193 s = ''; 3194 each(p[1].split('|'), function(v) { 3195 if (s) 3196 s += '|'; 3197 3198 switch (v) { 3199 case '%itrans': 3200 v = intr; 3201 break; 3202 3203 case '%itrans_na': 3204 v = intr.substring(2); 3205 break; 3206 3207 case '%istrict': 3208 v = inst; 3209 break; 3210 3211 case '%istrict_na': 3212 v = inst.substring(2); 3213 break; 3214 3215 case '%btrans': 3216 v = bloc; 3217 break; 3218 3219 case '%bstrict': 3220 v = bloc; 3221 break; 3222 } 3223 3224 s += v; 3225 }); 3226 re = new RegExp('^(' + s.toLowerCase() + ')$', 'i'); 3227 3228 each(p[0].split('/'), function(s) { 3229 t.childRules = t.childRules || {}; 3230 t.childRules[s] = re; 3231 }); 3232 }); 3233 3234 // Build regex 3235 s = ''; 3236 each(t.childRules, function(v, k) { 3237 if (s) 3238 s += '|'; 3239 3240 s += k; 3241 }); 3242 3243 t.parentElementsRE = new RegExp('^(' + s.toLowerCase() + ')$', 'i'); 3244 3245 /*console.debug(t.parentElementsRE.toString()); 3246 each(t.childRules, function(v) { 3247 console.debug(v.toString()); 3248 });*/ 3249 }, 3250 3251 setRules : function(s) { 3252 var t = this; 3253 3254 t._setup(); 3255 t.rules = {}; 3256 t.wildRules = []; 3257 t.validElements = {}; 3258 3259 return t.addRules(s); 3260 }, 3261 3262 addRules : function(s) { 3263 var t = this, dr; 3264 3265 if (!s) 3266 return; 3267 3268 t._setup(); 3269 3270 each(s.split(','), function(s) { 3271 var p = s.split(/\[|\]/), tn = p[0].split('/'), ra, at, wat, va = []; 3272 3273 // Extend with default rules 3274 if (dr) 3275 at = tinymce.extend([], dr.attribs); 3276 3277 // Parse attributes 3278 if (p.length > 1) { 3279 each(p[1].split('|'), function(s) { 3280 var ar = {}, i; 3281 3282 at = at || []; 3283 3284 // Parse attribute rule 3285 s = s.replace(/::/g, '~'); 3286 s = /^([!\-])?([\w*.?~]+|)([=:<])?(.+)?$/.exec(s); 3287 s[2] = s[2].replace(/~/g, ':'); 3288 3289 // Add required attributes 3290 if (s[1] == '!') { 3291 ra = ra || []; 3292 ra.push(s[2]); 3293 } 3294 3295 // Remove inherited attributes 3296 if (s[1] == '-') { 3297 for (i = 0; i <at.length; i++) { 3298 if (at[i].name == s[2]) { 3299 at.splice(i, 1); 3300 return; 3301 } 3302 } 3303 } 3304 3305 switch (s[3]) { 3306 // Add default attrib values 3307 case '=': 3308 ar.defaultVal = s[4] || ''; 3309 break; 3310 3311 // Add forced attrib values 3312 case ':': 3313 ar.forcedVal = s[4]; 3314 break; 3315 3316 // Add validation values 3317 case '<': 3318 ar.validVals = s[4].split('?'); 3319 break; 3320 } 3321 3322 if (/[*.?]/.test(s[2])) { 3323 wat = wat || []; 3324 ar.nameRE = new RegExp('^' + wildcardToRE(s[2]) + '$'); 3325 wat.push(ar); 3326 } else { 3327 ar.name = s[2]; 3328 at.push(ar); 3329 } 3330 3331 va.push(s[2]); 3332 }); 3333 } 3334 3335 // Handle element names 3336 each(tn, function(s, i) { 3337 var pr = s.charAt(0), x = 1, ru = {}; 3338 3339 // Extend with default rule data 3340 if (dr) { 3341 if (dr.noEmpty) 3342 ru.noEmpty = dr.noEmpty; 3343 3344 if (dr.fullEnd) 3345 ru.fullEnd = dr.fullEnd; 3346 3347 if (dr.padd) 3348 ru.padd = dr.padd; 3349 } 3350 3351 // Handle prefixes 3352 switch (pr) { 3353 case '-': 3354 ru.noEmpty = true; 3355 break; 3356 3357 case '+': 3358 ru.fullEnd = true; 3359 break; 3360 3361 case '#': 3362 ru.padd = true; 3363 break; 3364 3365 default: 3366 x = 0; 3367 } 3368 3369 tn[i] = s = s.substring(x); 3370 t.validElements[s] = 1; 3371 3372 // Add element name or element regex 3373 if (/[*.?]/.test(tn[0])) { 3374 ru.nameRE = new RegExp('^' + wildcardToRE(tn[0]) + '$'); 3375 t.wildRules = t.wildRules || {}; 3376 t.wildRules.push(ru); 3377 } else { 3378 ru.name = tn[0]; 3379 3380 // Store away default rule 3381 if (tn[0] == '@') 3382 dr = ru; 3383 3384 t.rules[s] = ru; 3385 } 3386 3387 ru.attribs = at; 3388 3389 if (ra) 3390 ru.requiredAttribs = ra; 3391 3392 if (wat) { 3393 // Build valid attributes regexp 3394 s = ''; 3395 each(va, function(v) { 3396 if (s) 3397 s += '|'; 3398 3399 s += '(' + wildcardToRE(v) + ')'; 3400 }); 3401 ru.validAttribsRE = new RegExp('^' + s.toLowerCase() + '$'); 3402 ru.wildAttribs = wat; 3403 } 3404 }); 3405 }); 3406 3407 // Build valid elements regexp 3408 s = ''; 3409 each(t.validElements, function(v, k) { 3410 if (s) 3411 s += '|'; 3412 3413 if (k != '@') 3414 s += k; 3415 }); 3416 t.validElementsRE = new RegExp('^(' + wildcardToRE(s.toLowerCase()) + ')$'); 3417 3418 //console.debug(t.validElementsRE.toString()); 3419 //console.dir(t.rules); 3420 //console.dir(t.wildRules); 3421 }, 3422 3423 findRule : function(n) { 3424 var t = this, rl = t.rules, i, r; 3425 3426 t._setup(); 3427 3428 // Exact match 3429 r = rl[n]; 3430 if (r) 3431 return r; 3432 3433 // Try wildcards 3434 rl = t.wildRules; 3435 for (i = 0; i < rl.length; i++) { 3436 if (rl[i].nameRE.test(n)) 3437 return rl[i]; 3438 } 3439 3440 return null; 3441 }, 3442 3443 findAttribRule : function(ru, n) { 3444 var i, wa = ru.wildAttribs; 3445 3446 for (i = 0; i < wa.length; i++) { 3447 if (wa[i].nameRE.test(n)) 3448 return wa[i]; 3449 } 3450 3451 return null; 3452 }, 3453 3454 serialize : function(n, o) { 3455 var h, t = this; 3456 3457 t._setup(); 3458 o = o || {}; 3459 o.format = o.format || 'html'; 3460 t.processObj = o; 3461 n = n.cloneNode(true); 3462 t.key = '' + (parseInt(t.key) + 1); 3463 3464 // Pre process 3465 if (!o.no_events) { 3466 o.node = n; 3467 t.onPreProcess.dispatch(t, o); 3468 } 3469 3470 // Serialize HTML DOM into a string 3471 t.writer.reset(); 3472 t._serializeNode(n, o.getInner); 3473 3474 // Post process 3475 o.content = t.writer.getContent(); 3476 3477 if (!o.no_events) 3478 t.onPostProcess.dispatch(t, o); 3479 3480 t._postProcess(o); 3481 o.node = null; 3482 3483 return tinymce.trim(o.content); 3484 }, 3485 3486 // Internal functions 3487 3488 _postProcess : function(o) { 3489 var t = this, s = t.settings, h = o.content, sc = [], p, l; 3490 3491 if (o.format == 'html') { 3492 // Protect some elements 3493 p = t._protect({ 3494 content : h, 3495 patterns : [ 3496 /(<script[^>]*>)(.*?)(<\/script>)/g, 3497 /(<style[^>]*>)(.*?)(<\/style>)/g, 3498 /(<pre[^>]*>)(.*?)(<\/pre>)/g 3499 ] 3500 }); 3501 3502 h = p.content; 3503 3504 // Entity encode 3505 if (s.entity_encoding !== 'raw') { 3506 if (s.entity_encoding.indexOf('named') != -1) { 3507 t.setEntities(s.entities); 3508 l = t.entityLookup; 3509 3510 h = h.replace(t.entitiesRE, function(a) { 3511 var v; 3512 3513 if (v = l[a]) 3514 a = '&' + v + ';'; 3515 3516 return a; 3517 }); 3518 } 3519 3520 if (s.entity_encoding.indexOf('numeric') != -1) { 3521 h = h.replace(/[\u007E-\uFFFF]/g, function(a) { 3522 return '&#' + a.charCodeAt(0) + ';'; 3523 }); 3524 } 3525 } 3526 3527 // Use BR instead of padded P elements inside editor and use <p> </p> outside editor 3528 if (o.set) 3529 h = h.replace(/<p>\s+( | |\u00a0|<br \/>)\s+<\/p>/g, '<p><br /></p>'); 3530 else 3531 h = h.replace(/<p>\s+( | |\u00a0|<br \/>)\s+<\/p>/g, '<p>$1</p>'); 3532 3533 // Since Gecko and Safari keeps whitespace in the DOM we need to 3534 // remove it inorder to match other browsers. But I think Gecko and Safari is right. 3535 // This process is only done when getting contents out from the editor. 3536 if (!o.set) { 3537 if (s.remove_linebreaks) { 3538 h = h.replace(/(<[^>]+>)\s+/g, '$1 '); 3539 h = h.replace(/\s+(<\/[^>]+>)/g, ' $1'); 3540 h = h.replace(/<(p|h[1-6]|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object) ([^>]+)>\s+/g, '<$1 $2>'); // Trim block start 3541 h = h.replace(/<(p|h[1-6]|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object)>\s+/g, '<$1>'); // Trim block start 3542 h = h.replace(/\s+<\/(p|h[1-6]|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object)>/g, '</$1>'); // Trim block end 3543 } 3544 3545 // Simple indentation 3546 if (s.apply_source_formatting && s.indent_mode == 'simple') { 3547 // Add line breaks before and after block elements 3548 h = h.replace(/<(\/?)(ul|hr|table|meta|link|tbody|tr|object|body|head|html)(|[^>]+)>\s*/g, '\n<$1$2$3>\n'); 3549 h = h.replace(/\s*<(p|h[1-6]|div|title|style|pre|script|td|li)(|[^>]+)>/g, '\n<$1$2>'); 3550 h = h.replace(/<\/(p|h[1-6]|div|title|style|pre|script|td|li)>\s*/g, '</$1>\n'); 3551 h = h.replace(/\n\n/g, '\n'); 3552 } 3553 } 3554 3555 h = t._unprotect(h, p); 3556 } 3557 3558 o.content = h; 3559 }, 3560 3561 _serializeNode : function(n, inn) { 3562 var t = this, s = t.settings, w = t.writer, hc, el, cn, i, l, a, at, no, v, nn, ru, ar, iv; 3563 3564 if (!s.node_filter || s.node_filter(n)) { 3565 switch (n.nodeType) { 3566 case 1: // Element 3567 if (n.hasAttribute ? n.hasAttribute('mce_bogus') : n.getAttribute('mce_bogus')) 3568 return; 3569 3570 iv = false; 3571 hc = n.hasChildNodes(); 3572 nn = n.getAttribute('mce_name') || n.nodeName.toLowerCase(); 3573 3574 // Add correct prefix on IE 3575 if (isIE) { 3576 if (n.scopeName !== 'HTML' && n.scopeName !== 'html') 3577 nn = n.scopeName + ':' + nn; 3578 } 3579 3580 // Remove mce prefix on IE needed for the abbr element 3581 if (nn.indexOf('mce:') === 0) 3582 nn = nn.substring(4); 3583 3584 // Check if valid 3585 if (!t.validElementsRE.test(nn) || (t.invalidElementsRE && t.invalidElementsRE.test(nn)) || inn) { 3586 iv = true; 3587 break; 3588 } 3589 3590 if (isIE) { 3591 // Fix IE content duplication (DOM can have multiple copies of the same node) 3592 if (s.fix_content_duplication) { 3593 if (n.mce_serialized == t.key) 3594 return; 3595 3596 n.mce_serialized = t.key; 3597 } 3598 3599 // IE sometimes adds a / infront of the node name 3600 if (nn.charAt(0) == '/') 3601 nn = nn.substring(1); 3602 } 3603 3604 // Check if valid child 3605 if (t.childRules) { 3606 if (t.parentElementsRE.test(t.elementName)) { 3607 if (!t.childRules[t.elementName].test(nn)) { 3608 iv = true; 3609 break; 3610 } 3611 } 3612 3613 t.elementName = nn; 3614 } 3615 3616 ru = t.findRule(nn); 3617 nn = ru.name || nn; 3618 3619 // Skip empty nodes or empty node name in IE 3620 if ((!hc && ru.noEmpty) || (isIE && !nn)) { 3621 iv = true; 3622 break; 3623 } 3624 3625 // Check required 3626 if (ru.requiredAttribs) { 3627 a = ru.requiredAttribs; 3628 3629 for (i = a.length - 1; i >= 0; i--) { 3630 if (this.dom.getAttrib(n, a[i]) !== '') 3631 break; 3632 } 3633 3634 // None of the required was there 3635 if (i == -1) { 3636 iv = true; 3637 break; 3638 } 3639 } 3640 3641 w.writeStartElement(nn); 3642 3643 // Add ordered attributes 3644 if (ru.attribs) { 3645 for (i=0, at = ru.attribs, l = at.length; i<l; i++) { 3646 a = at[i]; 3647 v = t._getAttrib(n, a); 3648 3649 if (v !== null) 3650 w.writeAttribute(a.name, v); 3651 } 3652 } 3653 3654 // Add wild attributes 3655 if (ru.validAttribsRE) { 3656 at = isIE ? getIEAtts(n) : n.attributes; 3657 for (i=at.length-1; i>-1; i--) { 3658 no = at[i]; 3659 3660 if (no.specified) { 3661 a = no.nodeName.toLowerCase(); 3662 3663 if (s.invalid_attrs.test(a) || !ru.validAttribsRE.test(a)) 3664 continue; 3665 3666 ar = t.findAttribRule(ru, a); 3667 v = t._getAttrib(n, ar, a); 3668 3669 if (v !== null) 3670 w.writeAttribute(a, v); 3671 } 3672 } 3673 } 3674 3675 // Padd empty nodes with a 3676 if (!hc && ru.padd) 3677 w.writeText('\u00a0'); 3678 3679 break; 3680 3681 case 3: // Text 3682 // Check if valid child 3683 if (t.childRules && t.parentElementsRE.test(t.elementName)) { 3684 if (!t.childRules[t.elementName].test(n.nodeName)) 3685 return; 3686 } 3687 3688 return w.writeText(n.nodeValue); 3689 3690 case 4: // CDATA 3691 return w.writeCDATA(n.nodeValue); 3692 3693 case 8: // Comment 3694 return w.writeComment(n.nodeValue); 3695 } 3696 } else if (n.nodeType == 1) 3697 hc = n.hasChildNodes(); 3698 3699 if (hc) { 3700 cn = n.firstChild; 3701 3702 while (cn) { 3703 t._serializeNode(cn); 3704 t.elementName = nn; 3705 cn = cn.nextSibling; 3706 } 3707 } 3708 3709 // Write element end 3710 if (!iv) { 3711 if (hc || !s.closed.test(nn)) 3712 w.writeFullEndElement(); 3713 else 3714 w.writeEndElement(); 3715 } 3716 }, 3717 3718 _protect : function(o) { 3719 o.items = o.items || []; 3720 3721 function enc(s) { 3722 return s.replace(/[\r\n]/g, function(c) { 3723 if (c === '\n') 3724 return '\\n'; 3725 3726 return '\\r'; 3727 }); 3728 }; 3729 3730 function dec(s) { 3731 return s.replace(/\\[rn]/g, function(c) { 3732 if (c === '\\n') 3733 return '\n'; 3734 3735 return '\r'; 3736 }); 3737 }; 3738 3739 each(o.patterns, function(p) { 3740 o.content = dec(enc(o.content).replace(p, function(x, a, b, c) { 3741 o.items.push(dec(b)); 3742 return a + '<!--mce:' + (o.items.length - 1) + '-->' + c; 3743 })); 3744 }); 3745 3746 return o; 3747 }, 3748 3749 _unprotect : function(h, o) { 3750 h = h.replace(/\<!--mce:([0-9]+)--\>/g, function(a, b) { 3751 return o.items[parseInt(b)]; 3752 }); 3753 3754 o.items = []; 3755 3756 return h; 3757 }, 3758 3759 _setup : function() { 3760 var t = this, s = this.settings; 3761 3762 if (t.done) 3763 return; 3764 3765 t.done = 1; 3766 3767 t.setRules(s.valid_elements); 3768 t.addRules(s.extended_valid_elements); 3769 t.addValidChildRules(s.valid_child_elements); 3770 3771 if (s.invalid_elements) 3772 t.invalidElementsRE = new RegExp('^(' + wildcardToRE(s.invalid_elements.replace(',', '|').toLowerCase()) + ')$'); 3773 3774 if (s.attrib_value_filter) 3775 t.attribValueFilter = s.attribValueFilter; 3776 }, 3777 3778 _getAttrib : function(n, a, na) { 3779 var i, v; 3780 3781 na = na || a.name; 3782 3783 if (a.forcedVal && (v = a.forcedVal)) { 3784 if (v === '{$uid}') 3785 return this.dom.uniqueId(); 3786 3787 return v; 3788 } 3789 3790 v = this.dom.getAttrib(n, na); 3791 3792 switch (na) { 3793 case 'rowspan': 3794 case 'colspan': 3795 // Whats the point? Remove usless attribute value 3796 if (v == '1') 3797 v = ''; 3798 3799 break; 3800 } 3801 3802 if (this.attribValueFilter) 3803 v = this.attribValueFilter(na, v, n); 3804 3805 if (a.validVals) { 3806 for (i = a.validVals.length - 1; i >= 0; i--) { 3807 if (v == a.validVals[i]) 3808 break; 3809 } 3810 3811 if (i == -1) 3812 return null; 3813 } 3814 3815 if (v === '' && typeof(a.defaultVal) != 'undefined') { 3816 v = a.defaultVal; 3817 3818 if (v === '{$uid}') 3819 return this.dom.uniqueId(); 3820 3821 return v; 3822 } else { 3823 // Remove internal mceItemXX classes when content is extracted from editor 3824 if (na == 'class' && this.processObj.get) 3825 v = v.replace(/\bmceItem\w+\b/g, ''); 3826 } 3827 3828 if (v === '') 3829 return null; 3830 3831 3832 return v; 3833 } 3834 3835 }); 3836 })(); 3837 3838 /* file:jscripts/tiny_mce/classes/dom/ScriptLoader.js */ 3839 3840 (function() { 3841 var each = tinymce.each; 3842 3843 tinymce.create('tinymce.dom.ScriptLoader', { 3844 ScriptLoader : function(s) { 3845 this.settings = s || {}; 3846 this.queue = []; 3847 this.lookup = {}; 3848 }, 3849 3850 markDone : function(u) { 3851 this.lookup[u] = {state : 2, url : u}; 3852 }, 3853 3854 add : function(u, cb, s, pr) { 3855 var t = this, lo = t.lookup, o; 3856 3857 if (o = lo[u]) { 3858 // Is loaded fire callback 3859 if (cb && o.state == 2) 3860 cb.call(s || this); 3861 3862 return o; 3863 } 3864 3865 o = {state : 0, url : u, func : cb, scope : s || this}; 3866 3867 if (pr) 3868 t.queue.unshift(o); 3869 else 3870 t.queue.push(o); 3871 3872 lo[u] = o; 3873 3874 return o; 3875 }, 3876 3877 load : function(u, cb, s) { 3878 var o; 3879 3880 if (!tinymce.is(u, 'string')) { 3881 o = []; 3882 3883 each(u, function(u) { 3884 o.push({state : 0, url : u}); 3885 }); 3886 3887 this.loadScripts(o, cb, s); 3888 } else 3889 this.loadScripts([{state : 0, url : u}], cb, s); 3890 }, 3891 3892 loadQueue : function(cb, s) { 3893 var t = this; 3894 3895 if (!t.queueLoading) { 3896 t.queueLoading = 1; 3897 t.queueCallbacks = []; 3898 3899 t.loadScripts(t.queue, function() { 3900 t.queueLoading = 0; 3901 3902 if (cb) 3903 cb.call(s || t); 3904 3905 each(t.queueCallbacks, function(o) { 3906 o.func.call(o.scope); 3907 }); 3908 }); 3909 } else if (cb) 3910 t.queueCallbacks.push({func : cb, scope : s || t}); 3911 }, 3912 3913 eval : function(co) { 3914 var w = window; 3915 3916 // Evaluate script 3917 if (!w.execScript) { 3918 try { 3919 eval.call(w, co); 3920 } catch (ex) { 3921 eval(co, w); // Firefox 3.0a8 3922 } 3923 } else 3924 w.execScript(co); // IE 3925 }, 3926 3927 loadScripts : function(sc, cb, s) { 3928 var t = this, lo = t.lookup; 3929 3930 function done(o) { 3931 o.state = 2; // Has been loaded 3932 3933 // Run callback 3934 if (o.func) 3935 o.func.call(o.scope || t); 3936 }; 3937 3938 function allDone() { 3939 var l; 3940 3941 // Check if all files are loaded 3942 l = sc.length; 3943 each(sc, function(o) { 3944 o = lo[o.url]; 3945 3946 if (o.state === 2) {// It has finished loading 3947 done(o); 3948 l--; 3949 } else 3950 load(o); 3951 }); 3952 3953 // They are all loaded 3954 if (l === 0 && cb) { 3955 cb.call(s || t); 3956 cb = 0; 3957 } 3958 }; 3959 3960 function load(o) { 3961 if (o.state > 0) 3962 return; 3963 3964 o.state = 1; // Is loading 3965 3966 tinymce.util.XHR.send({ 3967 url : o.url, 3968 error : t.settings.error, 3969 success : function(co) { 3970 t.eval(co); 3971 done(o); 3972 allDone(); 3973 } 3974 }); 3975 }; 3976 3977 each(sc, function(o) { 3978 var u = o.url; 3979 3980 // Add to queue if needed 3981 if (!lo[u]) { 3982 lo[u] = o; 3983 t.queue.push(o); 3984 } else 3985 o = lo[u]; 3986 3987 // Is already loading or has been loaded 3988 if (o.state > 0) 3989 return; 3990 3991 if (!tinymce.dom.Event.domLoaded && !t.settings.strict_mode) { 3992 var ix, ol = ''; 3993 3994 // Add onload events 3995 if (cb || o.func) { 3996 o.state = 1; // Is loading 3997 3998 ix = tinymce.dom.ScriptLoader._addOnLoad(function() { 3999 done(o); 4000 allDone(); 4001 }); 4002 4003 if (tinymce.isIE) 4004 ol = ' onreadystatechange="'; 4005 else 4006 ol = ' onload="'; 4007 4008 ol += 'tinymce.dom.ScriptLoader._onLoad(this,\'' + u + '\',' + ix + ');"'; 4009 } 4010 4011 document.write('<script type="text/javascript" src="' + u + '"' + ol + '></script>'); 4012 4013 if (!o.func) 4014 done(o); 4015 } else 4016 load(o); 4017 }); 4018 4019 allDone(); 4020 }, 4021 4022 // Static methods 4023 'static' : { 4024 _addOnLoad : function(f) { 4025 var t = this; 4026 4027 t._funcs = t._funcs || []; 4028 t._funcs.push(f); 4029 4030 return t._funcs.length - 1; 4031 }, 4032 4033 _onLoad : function(e, u, ix) { 4034 if (!tinymce.isIE || e.readyState == 'complete') 4035 this._funcs[ix].call(this); 4036 } 4037 } 4038 4039 }); 4040 4041 // Global script loader 4042 tinymce.ScriptLoader = new tinymce.dom.ScriptLoader(); 4043 })(); 4044 4045 /* file:jscripts/tiny_mce/classes/ui/Control.js */ 4046 4047 (function() { 4048 // Shorten class names 4049 var DOM = tinymce.DOM, is = tinymce.is; 4050 4051 tinymce.create('tinymce.ui.Control', { 4052 Control : function(id, s) { 4053 this.id = id; 4054 this.settings = s = s || {}; 4055 this.rendered = false; 4056 this.onRender = new tinymce.util.Dispatcher(this); 4057 this.classPrefix = ''; 4058 this.scope = s.scope || this; 4059 this.disabled = 0; 4060 this.active = 0; 4061 }, 4062 4063 setDisabled : function(s) { 4064 var e; 4065 4066 if (s != this.disabled) { 4067 e = DOM.get(this.id); 4068 4069 // Add accessibility title for unavailable actions 4070 if (e && this.settings.unavailable_prefix) { 4071 if (s) { 4072 this.prevTitle = e.title; 4073 e.title = this.settings.unavailable_prefix + ": " + e.title; 4074 } else 4075 e.title = this.prevTitle; 4076 } 4077 4078 this.setState('Disabled', s); 4079 this.setState('Enabled', !s); 4080 this.disabled = s; 4081 } 4082 }, 4083 4084 isDisabled : function() { 4085 return this.disabled; 4086 }, 4087 4088 setActive : function(s) { 4089 if (s != this.active) { 4090 this.setState('Active', s); 4091 this.active = s; 4092 } 4093 }, 4094 4095 isActive : function() { 4096 return this.active; 4097 }, 4098 4099 setState : function(c, s) { 4100 var n = DOM.get(this.id); 4101 4102 c = this.classPrefix + c; 4103 4104 if (s) 4105 DOM.addClass(n, c); 4106 else 4107 DOM.removeClass(n, c); 4108 }, 4109 4110 isRendered : function() { 4111 return this.rendered; 4112 }, 4113 4114 renderHTML : function() { 4115 }, 4116 4117 renderTo : function(n) { 4118 n.innerHTML = this.renderHTML(); 4119 }, 4120 4121 postRender : function() { 4122 var t = this, b; 4123 4124 // Set pending states 4125 if (is(t.disabled)) { 4126 b = t.disabled; 4127 t.disabled = -1; 4128 t.setDisabled(b); 4129 } 4130 4131 if (is(t.active)) { 4132 b = t.active; 4133 t.active = -1; 4134 t.setActive(b); 4135 } 4136 }, 4137 4138 destroy : function() { 4139 DOM.remove(this.id); 4140 } 4141 4142 }); 4143 })(); 4144 /* file:jscripts/tiny_mce/classes/ui/Container.js */ 4145 4146 tinymce.create('tinymce.ui.Container:tinymce.ui.Control', { 4147 Container : function(id, s) { 4148 this.parent(id, s); 4149 this.controls = []; 4150 this.lookup = {}; 4151 }, 4152 4153 add : function(c) { 4154 this.lookup[c.id] = c; 4155 this.controls.push(c); 4156 4157 return c; 4158 }, 4159 4160 get : function(n) { 4161 return this.lookup[n]; 4162 } 4163 4164 }); 4165 4166 4167 /* file:jscripts/tiny_mce/classes/ui/Separator.js */ 4168 4169 tinymce.create('tinymce.ui.Separator:tinymce.ui.Control', { 4170 renderHTML : function() { 4171 return tinymce.DOM.createHTML('span', {'class' : 'mceSeparator'}); 4172 } 4173 4174 }); 4175 4176 /* file:jscripts/tiny_mce/classes/ui/MenuItem.js */ 4177 4178 (function() { 4179 var is = tinymce.is, DOM = tinymce.DOM, each = tinymce.each, walk = tinymce.walk; 4180 4181 tinymce.create('tinymce.ui.MenuItem:tinymce.ui.Control', { 4182 MenuItem : function(id, s) { 4183 this.parent(id, s); 4184 this.classPrefix = 'mceMenuItem'; 4185 }, 4186 4187 setSelected : function(s) { 4188 this.setState('Selected', s); 4189 this.selected = s; 4190 }, 4191 4192 isSelected : function() { 4193 return this.selected; 4194 }, 4195 4196 postRender : function() { 4197 var t = this; 4198 4199 t.parent(); 4200 4201 // Set pending state 4202 if (is(t.selected)) 4203 t.setSelected(t.selected); 4204 } 4205 4206 }); 4207 })(); 4208 4209 /* file:jscripts/tiny_mce/classes/ui/Menu.js */ 4210 4211 (function() { 4212 var is = tinymce.is, DOM = tinymce.DOM, each = tinymce.each, walk = tinymce.walk; 4213 4214 tinymce.create('tinymce.ui.Menu:tinymce.ui.MenuItem', { 4215 Menu : function(id, s) { 4216 var t = this; 4217 4218 t.parent(id, s); 4219 t.items = {}; 4220 t.collapsed = false; 4221 t.menuCount = 0; 4222 t.onAddItem = new tinymce.util.Dispatcher(this); 4223 }, 4224 4225 expand : function(d) { 4226 var t = this; 4227 4228 if (d) { 4229 walk(t, function(o) { 4230 if (o.expand) 4231 o.expand(); 4232 }, 'items', t); 4233 } 4234 4235 t.collapsed = false; 4236 }, 4237 4238 collapse : function(d) { 4239 var t = this; 4240 4241 if (d) { 4242 walk(t, function(o) { 4243 if (o.collapse) 4244 o.collapse(); 4245 }, 'items', t); 4246 } 4247 4248 t.collapsed = true; 4249 }, 4250 4251 isCollapsed : function() { 4252 return this.collapsed; 4253 }, 4254 4255 add : function(o) { 4256 if (!o.settings) 4257 o = new tinymce.ui.MenuItem(o.id || DOM.uniqueId(), o); 4258 4259 this.onAddItem.dispatch(this, o); 4260 4261 return this.items[o.id] = o; 4262 }, 4263 4264 addSeparator : function() { 4265 return this.add({separator : true}); 4266 }, 4267 4268 addMenu : function(o) { 4269 if (!o.collapse) 4270 o = this.createMenu(o); 4271 4272 this.menuCount++; 4273 4274 return this.add(o); 4275 }, 4276 4277 hasMenus : function() { 4278 return this.menuCount !== 0; 4279 }, 4280 4281 remove : function(o) { 4282 delete this.items[o.id]; 4283 }, 4284 4285 removeAll : function() { 4286 var t = this; 4287 4288 walk(t, function(o) { 4289 if (o.removeAll) 4290 o.removeAll(); 4291 4292 o.destroy(); 4293 }, 'items', t); 4294 4295 t.items = {}; 4296 }, 4297 4298 createMenu : function(o) { 4299 var m = new tinymce.ui.Menu(o.id || DOM.uniqueId(), o); 4300 4301 m.onAddItem.add(this.onAddItem.dispatch, this.onAddItem); 4302 4303 return m; 4304 } 4305 4306 }); 4307 })(); 4308 /* file:jscripts/tiny_mce/classes/ui/DropMenu.js */ 4309 4310 (function() { 4311 var is = tinymce.is, DOM = tinymce.DOM, each = tinymce.each, Event = tinymce.dom.Event, Element = tinymce.dom.Element; 4312 4313 tinymce.create('tinymce.ui.DropMenu:tinymce.ui.Menu', { 4314 DropMenu : function(id, s) { 4315 s = s || {}; 4316 s.container = s.container || document.body; 4317 s.offset_x = s.offset_x || 0; 4318 s.offset_y = s.offset_y || 0; 4319 s.vp_offset_x = s.vp_offset_x || 0; 4320 s.vp_offset_y = s.vp_offset_y || 0; 4321 this.parent(id, s); 4322 this.onHideMenu = new tinymce.util.Dispatcher(this); 4323 this.classPrefix = 'mceMenu'; 4324 }, 4325 4326 createMenu : function(s) { 4327 var t = this, cs = t.settings, m; 4328 4329 s.container = s.container || cs.container; 4330 s.parent = t; 4331 s.constrain = s.constrain || cs.constrain; 4332 s['class'] = s['class'] || cs['class']; 4333 s.vp_offset_x = s.vp_offset_x || cs.vp_offset_x; 4334 s.vp_offset_y = s.vp_offset_y || cs.vp_offset_y; 4335 m = new tinymce.ui.DropMenu(s.id || DOM.uniqueId(), s); 4336 4337 m.onAddItem.add(t.onAddItem.dispatch, t.onAddItem); 4338 4339 return m; 4340 }, 4341 4342 update : function() { 4343 var t = this, s = t.settings, tb = DOM.get('menu_' + t.id + '_tbl'), co = DOM.get('menu_' + t.id + '_co'), tw, th; 4344 4345 tw = s.max_width ? Math.min(tb.clientWidth, s.max_width) : tb.clientWidth; 4346 th = s.max_height ? Math.min(tb.clientHeight, s.max_height) : tb.clientHeight; 4347 4348 if (!DOM.boxModel) 4349 t.element.setStyles({width : tw + 2, height : th + 2}); 4350 else 4351 t.element.setStyles({width : tw, height : th}); 4352 4353 if (s.max_width) 4354 DOM.setStyle(co, 'width', tw); 4355 4356 if (s.max_height) { 4357 DOM.setStyle(co, 'height', th); 4358 4359 if (tb.clientHeight < s.max_height) 4360 DOM.setStyle(co, 'overflow', 'hidden'); 4361 } 4362 }, 4363 4364 showMenu : function(x, y, px) { 4365 var t = this, s = t.settings, co, vp = DOM.getViewPort(), w, h, mx, my, ot = 2, dm, tb; 4366 4367 t.collapse(1); 4368 4369 if (t.isMenuVisible) 4370 return; 4371 4372 if (!t.rendered) { 4373 co = DOM.add(t.settings.container, t.renderNode()); 4374 4375 each(t.items, function(o) { 4376 o.postRender(); 4377 }); 4378 4379 t.element = new Element('menu_' + t.id, {blocker : 1, container : s.container}); 4380 } else 4381 co = DOM.get('menu_' + t.id); 4382 4383 DOM.setStyles(co, {left : -0xFFFF , top : -0xFFFF}); 4384 DOM.show(co); 4385 t.update(); 4386 4387 x += s.offset_x || 0; 4388 y += s.offset_y || 0; 4389 vp.w -= 4; 4390 vp.h -= 4; 4391 4392 // Move inside viewport if not submenu 4393 if (s.constrain) { 4394 w = co.clientWidth - ot; 4395 h = co.clientHeight - ot; 4396 mx = vp.x + vp.w; 4397 my = vp.y + vp.h; 4398 4399 if ((x + s.vp_offset_x + w) > mx) 4400 x = px ? px - w : Math.max(0, (mx - s.vp_offset_x) - w); 4401 4402 if ((y + s.vp_offset_y + h) > my) 4403 y = Math.max(0, (my - s.vp_offset_y) - h); 4404 } 4405 4406 DOM.setStyles(co, {left : x , top : y}); 4407 t.element.update(); 4408 4409 t.isMenuVisible = 1; 4410 t.mouseClickFunc = Event.add(co, 'click', function(e) { 4411 var m; 4412 4413 e = e.target; 4414 4415 if (e && (e = DOM.getParent(e, 'TR')) && !DOM.hasClass(e, 'mceMenuItemSub')) { 4416 m = t.items[e.id]; 4417 4418 if (m.isDisabled()) 4419 return; 4420 4421 if (m.settings.onclick) 4422 m.settings.onclick(e); 4423 4424 dm = t; 4425 4426 while (dm) { 4427 if (dm.hideMenu) 4428 dm.hideMenu(); 4429 4430 dm = dm.settings.parent; 4431 } 4432 4433 return Event.cancel(e); // Cancel to fix onbeforeunload problem 4434 } 4435 }); 4436 4437 if (t.hasMenus()) { 4438 t.mouseOverFunc = Event.add(co, 'mouseover', function(e) { 4439 var m, r, mi; 4440 4441 e = e.target; 4442 if (e && (e = DOM.getParent(e, 'TR'))) { 4443 m = t.items[e.id]; 4444 4445 if (t.lastMenu) 4446 t.lastMenu.collapse(1); 4447 4448 if (m.isDisabled()) 4449 return; 4450 4451 if (e && DOM.hasClass(e, 'mceMenuItemSub')) { 4452 //p = DOM.getPos(s.container); 4453 r = DOM.getRect(e); 4454 m.showMenu((r.x + r.w - ot), r.y - ot, r.x); 4455 t.lastMenu = m; 4456 DOM.addClass(DOM.get(m.id).firstChild, 'mceMenuItemActive'); 4457 } 4458 } 4459 }); 4460 } 4461 }, 4462 4463 hideMenu : function() { 4464 var t = this, co = DOM.get('menu_' + t.id), e; 4465 4466 if (!t.isMenuVisible) 4467 return; 4468 4469 Event.remove(co, 'mouseover', t.mouseOverFunc); 4470 Event.remove(co, 'click', t.mouseClickFunc); 4471 DOM.hide(co); 4472 t.isMenuVisible = 0; 4473 4474 if (t.element) 4475 t.element.hide(); 4476 4477 if (e = DOM.get(t.id)) 4478 DOM.removeClass(e.firstChild, 'mceMenuItemActive'); 4479 4480 t.onHideMenu.dispatch(t); 4481 }, 4482 4483 add : function(o) { 4484 var t = this, co; 4485 4486 o = t.parent(o); 4487 4488 if (t.isRendered && (co = DOM.get('menu_' + t.id))) 4489 t._add(DOM.select('tbody', co)[0], o); 4490 4491 return o; 4492 }, 4493 4494 collapse : function(d) { 4495 this.parent(d); 4496 this.hideMenu(); 4497 }, 4498 4499 remove : function(o) { 4500 DOM.remove(o.id); 4501 4502 return this.parent(o); 4503 }, 4504 4505 destroy : function() { 4506 var t = this, co = DOM.get('menu_' + t.id); 4507 4508 Event.remove(co, 'mouseover', t.mouseOverFunc); 4509 Event.remove(co, 'click', t.mouseClickFunc); 4510 4511 if (t.element) 4512 t.element.remove(); 4513 4514 DOM.remove(co); 4515 }, 4516 4517 renderNode : function() { 4518 var t = this, s = t.settings, n, tb, co, w; 4519 4520 w = DOM.create('div', {id : 'menu_' + t.id, 'class' : s['class'], 'style' : 'position:absolute;left:0;top:0;z-index:150'}); 4521 co = DOM.add(w, 'div', {id : 'menu_' + t.id + '_co', 'class' : 'mceMenu' + (s['class'] ? ' ' + s['class'] : '')}); 4522 t.element = new Element('menu_' + t.id, {blocker : 1, container : s.container}); 4523 4524 if (s.menu_line) 4525 DOM.add(co, 'span', {'class' : 'mceMenuLine'}); 4526 4527 // n = DOM.add(co, 'div', {id : 'menu_' + t.id + '_co', 'class' : 'mceMenuContainer'}); 4528 n = DOM.add(co, 'table', {id : 'menu_' + t.id + '_tbl', border : 0, cellPadding : 0, cellSpacing : 0}); 4529 tb = DOM.add(n, 'tbody'); 4530 4531 each(t.items, function(o) { 4532 t._add(tb, o); 4533 }); 4534 4535 t.rendered = true; 4536 4537 return w; 4538 }, 4539 4540 // Internal functions 4541 4542 _add : function(tb, o) { 4543 var n, s = o.settings, a, ro, it; 4544 4545 if (s.separator) { 4546 ro = DOM.add(tb, 'tr', {id : o.id, 'class' : 'mceMenuItemSeparator'}); 4547 DOM.add(ro, 'td', {'class' : 'mceMenuItemSeparator'}); 4548 4549 if (n = ro.previousSibling) 4550 DOM.addClass(n, 'last'); 4551 4552 return; 4553 } 4554 4555 n = ro = DOM.add(tb, 'tr', {id : o.id, 'class' : 'mceMenuItem mceMenuItemEnabled'}); 4556 n = it = DOM.add(n, 'td'); 4557 n = a = DOM.add(n, 'a', {href : 'javascript:;', onclick : "return false;", onmousedown : 'return false;'}); 4558 4559 DOM.addClass(it, s['class']); 4560 // n = DOM.add(n, 'span', {'class' : 'item'}); 4561 DOM.add(n, 'span', {'class' : 'icon' + (s.icon ? ' ' + s.icon : '')}); 4562 n = DOM.add(n, s.element || 'span', {'class' : 'text', title : o.settings.title}, o.settings.title); 4563 4564 if (o.settings.style) 4565 DOM.setAttrib(n, 'style', o.settings.style); 4566 4567 if (tb.childNodes.length == 1) 4568 DOM.addClass(ro, 'first'); 4569 4570 if ((n = ro.previousSibling) && DOM.hasClass(n, 'mceMenuItemSeparator')) 4571 DOM.addClass(ro, 'first'); 4572 4573 if (o.collapse) 4574 DOM.addClass(ro, 'mceMenuItemSub'); 4575 4576 if (n = ro.previousSibling) 4577 DOM.removeClass(n, 'last'); 4578 4579 DOM.addClass(ro, 'last'); 4580 } 4581 4582 }); 4583 })(); 4584 /* file:jscripts/tiny_mce/classes/ui/Button.js */ 4585 4586 (function() { 4587 var DOM = tinymce.DOM; 4588 4589 tinymce.create('tinymce.ui.Button:tinymce.ui.Control', { 4590 Button : function(id, s) { 4591 this.parent(id, s); 4592 this.classPrefix = 'mceButton'; 4593 }, 4594 4595 renderHTML : function() { 4596 var s = this.settings, h = '<a id="' + this.id + '" href="javascript:;" class="mceButton mceButtonEnabled ' + s['class'] + '" onmousedown="return false;" onclick="return false;" title="' + DOM.encode(s.title) + '">'; 4597 4598 if (s.image) 4599 h += '<img class="icon" src="' + s.image + '" /></a>'; 4600 else 4601 h += '<span class="icon ' + s['class'] + '"></span></a>'; 4602 4603 return h; 4604 }, 4605 4606 postRender : function() { 4607 var t = this, s = t.settings; 4608 4609 tinymce.dom.Event.add(t.id, 'click', function(e) { 4610 if (!t.isDisabled()) 4611 return s.onclick.call(s.scope, e); 4612 }); 4613 } 4614 4615 }); 4616 })(); 4617 4618 /* file:jscripts/tiny_mce/classes/ui/ListBox.js */ 4619 4620 (function() { 4621 var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each, Dispatcher = tinymce.util.Dispatcher; 4622 4623 tinymce.create('tinymce.ui.ListBox:tinymce.ui.Control', { 4624 ListBox : function(id, s) { 4625 var t = this; 4626 4627 t.parent(id, s); 4628 t.items = []; 4629 t.onChange = new Dispatcher(t); 4630 t.onPostRender = new Dispatcher(t); 4631 t.onAdd = new Dispatcher(t); 4632 t.onRenderMenu = new tinymce.util.Dispatcher(this); 4633 t.classPrefix = 'mceListBox'; 4634 }, 4635 4636 select : function(v) { 4637 var t = this, e, fv; 4638 4639 // Do we need to do something? 4640 if (v != t.selectedValue) { 4641 e = DOM.get(t.id + '_text'); 4642 t.selectedValue = v; 4643 4644 // Find item 4645 each(t.items, function(o) { 4646 if (o.value == v) { 4647 DOM.setHTML(e, DOM.encode(o.title)); 4648 fv = 1; 4649 return false; 4650 } 4651 }); 4652 4653 // If no item was found then present title 4654 if (!fv) { 4655 DOM.setHTML(e, DOM.encode(t.settings.title)); 4656 DOM.addClass(e, 'title'); 4657 e = 0; 4658 return; 4659 } else 4660 DOM.removeClass(e, 'title'); 4661 } 4662 4663 e = 0; 4664 }, 4665 4666 add : function(n, v, o) { 4667 var t = this; 4668 4669 o = o || {}; 4670 o = tinymce.extend(o, { 4671 title : n, 4672 value : v 4673 }); 4674 4675 t.items.push(o); 4676 t.onAdd.dispatch(t, o); 4677 }, 4678 4679 getLength : function() { 4680 return this.items.length; 4681 }, 4682 4683 renderHTML : function() { 4684 var h = '', t = this, s = t.settings; 4685 4686 h = '<table id="' + t.id + '" cellpadding="0" cellspacing="0" class="mceListBox mceListBoxEnabled' + (s['class'] ? (' ' + s['class']) : '') + '"><tbody><tr>'; 4687 h += '<td>' + DOM.createHTML('a', {id : t.id + '_text', href : 'javascript:;', 'class' : 'text', onclick : "return false;", onmousedown : 'return false;'}, DOM.encode(t.settings.title)) + '</td>'; 4688 h += '<td>' + DOM.createHTML('a', {id : t.id + '_open', href : 'javascript:;', 'class' : 'open', onclick : "return false;", onmousedown : 'return false;'}, '<span></span>') + '</td>'; 4689 h += '</tr></tbody></table>'; 4690 4691 return h; 4692 }, 4693 4694 showMenu : function() { 4695 var t = this, p1, p2, e = DOM.get(this.id), m; 4696 4697 if (t.isDisabled() || t.items.length == 0) 4698 return; 4699 4700 if (!t.isMenuRendered) { 4701 t.renderMenu(); 4702 t.isMenuRendered = true; 4703 } 4704 4705 p1 = DOM.getPos(this.settings.menu_container); 4706 p2 = DOM.getPos(e); 4707 4708 m = t.menu; 4709 m.settings.offset_x = p2.x; 4710 m.settings.offset_y = p2.y; 4711 4712 // Select in menu 4713 if (t.oldID) 4714 m.items[t.oldID].setSelected(0); 4715 4716 each(t.items, function(o) { 4717 if (o.value === t.selectedValue) { 4718 m.items[o.id].setSelected(1); 4719 t.oldID = o.id; 4720 } 4721 }); 4722 4723 m.showMenu(0, e.clientHeight); 4724 4725 Event.add(document, 'mousedown', t.hideMenu, t); 4726 DOM.addClass(t.id, 'mceListBoxSelected'); 4727 }, 4728 4729 hideMenu : function(e) { 4730 var t = this; 4731 4732 if (!e || !DOM.getParent(e.target, function(n) {return DOM.hasClass(n, 'mceMenu');})) { 4733 DOM.removeClass(t.id, 'mceListBoxSelected'); 4734 Event.remove(document, 'mousedown', t.hideMenu, t); 4735 4736 if (t.menu) 4737 t.menu.hideMenu(); 4738 } 4739 }, 4740 4741 renderMenu : function() { 4742 var t = this, m; 4743 4744 m = t.settings.control_manager.createDropMenu(t.id + '_menu', { 4745 menu_line : 1, 4746 'class' : 'mceListBoxMenu noIcons', 4747 max_width : 150, 4748 max_height : 150 4749 }); 4750 4751 m.onHideMenu.add(t.hideMenu, t); 4752 4753 m.add({ 4754 title : t.settings.title, 4755 'class' : 'mceMenuItemTitle' 4756 }).setDisabled(1); 4757 4758 each(t.items, function(o) { 4759 o.id = DOM.uniqueId(); 4760 o.onclick = function() { 4761 if (t.settings.onselect(o.value) !== false) 4762 t.select(o.value); // Must be runned after 4763 }; 4764 4765 m.add(o); 4766 }); 4767 4768 t.onRenderMenu.dispatch(t, m); 4769 t.menu = m; 4770 }, 4771 4772 postRender : function() { 4773 var t = this; 4774 4775 Event.add(t.id, 'click', t.showMenu, t); 4776 4777 // Old IE doesn't have hover on all elements 4778 if (tinymce.isIE6 || !DOM.boxModel) { 4779 Event.add(t.id, 'mouseover', function() { 4780 if (!DOM.hasClass(t.id, 'mceListBoxDisabled')) 4781 DOM.addClass(t.id, 'mceListBoxHover'); 4782 }); 4783 4784 Event.add(t.id, 'mouseout', function() { 4785 if (!DOM.hasClass(t.id, 'mceListBoxDisabled')) 4786 DOM.removeClass(t.id, 'mceListBoxHover'); 4787 }); 4788 } 4789 4790 t.onPostRender.dispatch(t, DOM.get(t.id)); 4791 } 4792 4793 }); 4794 })(); 4795 /* file:jscripts/tiny_mce/classes/ui/NativeListBox.js */ 4796 4797 (function() { 4798 var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each, Dispatcher = tinymce.util.Dispatcher; 4799 4800 tinymce.create('tinymce.ui.NativeListBox:tinymce.ui.ListBox', { 4801 NativeListBox : function(id, s) { 4802 this.parent(id, s); 4803 this.classPrefix = 'mceNativeListBox'; 4804 }, 4805 4806 setDisabled : function(s) { 4807 DOM.get(this.id).disabled = s; 4808 }, 4809 4810 isDisabled : function() { 4811 return DOM.get(this.id).disabled; 4812 }, 4813 4814 select : function(v) { 4815 var e = DOM.get(this.id), ol = e.options; 4816 4817 v = '' + (v || ''); 4818 4819 e.selectedIndex = 0; 4820 each(ol, function(o, i) { 4821 if (o.value == v) { 4822 e.selectedIndex = i; 4823 return false; 4824 } 4825 }); 4826 }, 4827 4828 add : function(n, v, a) { 4829 var o, t = this; 4830 4831 a = a || {}; 4832 a.value = v; 4833 4834 if (t.isRendered()) 4835 DOM.add(DOM.get(this.id), 'option', a, n); 4836 4837 o = { 4838 title : n, 4839 value : v, 4840 attribs : a 4841 }; 4842 4843 t.items.push(o); 4844 t.onAdd.dispatch(t, o); 4845 }, 4846 4847 getLength : function() { 4848 return DOM.get(this.id).options.length - 1; 4849 }, 4850 4851 renderHTML : function() { 4852 var h, t = this; 4853 4854 h = DOM.createHTML('option', {value : ''}, '-- ' + t.settings.title + ' --'); 4855 4856 each(t.items, function(it) { 4857 h += DOM.createHTML('option', {value : it.value}, it.title); 4858 }); 4859 4860 h = DOM.createHTML('select', {id : t.id, 'class' : 'mceNativeListBox'}, h); 4861 4862 return h; 4863 }, 4864 4865 postRender : function() { 4866 var t = this, ch; 4867 4868 t.rendered = true; 4869 4870 function onChange(e) { 4871 var v = e.target.options[e.target.selectedIndex].value; 4872 4873 t.onChange.dispatch(t, v); 4874 4875 if (t.settings.onselect) 4876 t.settings.onselect(v); 4877 }; 4878 4879 Event.add(t.id, 'change', onChange); 4880 4881 // Accessibility keyhandler 4882 Event.add(t.id, 'keydown', function(e) { 4883 var bf; 4884 4885 Event.remove(t.id, 'change', ch); 4886 4887 bf = Event.add(t.id, 'blur', function() { 4888 Event.add(t.id, 'change', onChange); 4889 Event.remove(t.id, 'blur', bf); 4890 }); 4891 4892 if (e.keyCode == 13 || e.keyCode == 32) { 4893 onChange(e); 4894 return Event.cancel(e); 4895 } 4896 }); 4897 4898 t.onPostRender.dispatch(t, DOM.get(t.id)); 4899 } 4900 4901 }); 4902 })(); 4903 /* file:jscripts/tiny_mce/classes/ui/MenuButton.js */ 4904 4905 (function() { 4906 var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each; 4907 4908 tinymce.create('tinymce.ui.MenuButton:tinymce.ui.Button', { 4909 MenuButton : function(id, s) { 4910 this.parent(id, s); 4911 this.onRenderMenu = new tinymce.util.Dispatcher(this); 4912 s.menu_container = s.menu_container || document.body; 4913 }, 4914 4915 showMenu : function() { 4916 var t = this, p1, p2, e = DOM.get(t.id), m; 4917 4918 if (t.isDisabled()) 4919 return; 4920 4921 if (!t.isMenuRendered) { 4922 t.renderMenu(); 4923 t.isMenuRendered = true; 4924 } 4925 4926 p1 = DOM.getPos(t.settings.menu_container); 4927 p2 = DOM.getPos(e); 4928 4929 m = t.menu; 4930 m.settings.offset_x = p2.x; 4931 m.settings.offset_y = p2.y; 4932 m.settings.vp_offset_x = p2.x; 4933 m.settings.vp_offset_y = p2.y; 4934 m.showMenu(0, e.clientHeight); 4935 4936 Event.add(document, 'mousedown', t.hideMenu, t); 4937 t.setState('Selected', 1); 4938 }, 4939 4940 renderMenu : function() { 4941 var t = this, m; 4942 4943 m = t.settings.control_manager.createDropMenu(t.id + '_menu', { 4944 menu_line : 1, 4945 'class' : this.classPrefix + 'Menu' 4946 }); 4947 4948 m.onHideMenu.add(t.hideMenu, t); 4949 4950 t.onRenderMenu.dispatch(t, m); 4951 t.menu = m; 4952 }, 4953 4954 hideMenu : function(e) { 4955 var t = this; 4956 4957 if (!e || !DOM.getParent(e.target, function(n) {return DOM.hasClass(n, 'mceMenu');})) { 4958 t.setState('Selected', 0); 4959 Event.remove(document, 'mousedown', t.hideMenu, t); 4960 if (t.menu) 4961 t.menu.hideMenu(); 4962 } 4963 }, 4964 4965 postRender : function() { 4966 var t = this, s = t.settings; 4967 4968 Event.add(t.id, 'click', function() { 4969 if (!t.isDisabled()) { 4970 if (s.onclick) 4971 s.onclick(t.value); 4972 4973 t.showMenu(); 4974 } 4975 }); 4976 } 4977 4978 }); 4979 })(); 4980 4981 /* file:jscripts/tiny_mce/classes/ui/SplitButton.js */ 4982 4983 (function() { 4984 var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each; 4985 4986 tinymce.create('tinymce.ui.SplitButton:tinymce.ui.MenuButton', { 4987 SplitButton : function(id, s) { 4988 this.parent(id, s); 4989 this.classPrefix = 'mceSplitButton'; 4990 }, 4991 4992 renderHTML : function() { 4993 var h, t = this, s = t.settings, h1; 4994 4995 h = '<tbody><tr>'; 4996 4997 if (s.image) 4998 h1 = DOM.createHTML('img ', {src : s.image, 'class' : 'action ' + s['class']}); 4999 else 5000 h1 = DOM.createHTML('span', {'class' : 'action ' + s['class']}); 5001 5002 h += '<td>' + DOM.createHTML('a', {id : t.id + '_action', href : 'javascript:;', 'class' : 'action ' + s['class'], onclick : "return false;", onmousedown : 'return false;', title : s.title}, h1) + '</td>'; 5003 5004 h1 = DOM.createHTML('span', {'class' : 'open ' + s['class']}); 5005 h += '<td>' + DOM.createHTML('a', {id : t.id + '_open', href : 'javascript:;', 'class' : 'open ' + s['class'], onclick : "return false;", onmousedown : 'return false;', title : s.title}, h1) + '</td>'; 5006 5007 h += '</tr></tbody>'; 5008 5009 return DOM.createHTML('table', {id : t.id, 'class' : 'mceSplitButton mceSplitButtonEnabled ' + s['class'], cellpadding : '0', cellspacing : '0', onmousedown : 'return false;', title : s.title}, h); 5010 }, 5011 5012 postRender : function() { 5013 var t = this, s = t.settings; 5014 5015 if (s.onclick) { 5016 Event.add(t.id + '_action', 'click', function() { 5017 if (!t.isDisabled()) 5018 s.onclick(t.value); 5019 }); 5020 } 5021 5022 Event.add(t.id + '_open', 'click', t.showMenu, t); 5023 5024 // Old IE doesn't have hover on all elements 5025 if (tinymce.isIE6 || !DOM.boxModel) { 5026 Event.add(t.id, 'mouseover', function() { 5027 if (!DOM.hasClass(t.id, 'mceSplitButtonDisabled')) 5028 DOM.addClass(t.id, 'mceSplitButtonHover'); 5029 }); 5030 5031 Event.add(t.id, 'mouseout', function() { 5032 if (!DOM.hasClass(t.id, 'mceSplitButtonDisabled')) 5033 DOM.removeClass(t.id, 'mceSplitButtonHover'); 5034 }); 5035 } 5036 } 5037 5038 }); 5039 })(); 5040 5041 /* file:jscripts/tiny_mce/classes/ui/ColorSplitButton.js */ 5042 5043 (function() { 5044 var DOM = tinymce.DOM, Event = tinymce.dom.Event, is = tinymce.is, each = tinymce.each; 5045 5046 tinymce.create('tinymce.ui.ColorSplitButton:tinymce.ui.SplitButton', { 5047 ColorSplitButton : function(id, s) { 5048 var t = this; 5049 5050 t.parent(id, s); 5051 5052 t.settings = s = tinymce.extend({ 5053 colors : '000000,993300,333300,003300,003366,000080,333399,333333,800000,FF6600,808000,008000,008080,0000FF,666699,808080,FF0000,FF9900,99CC00,339966,33CCCC,3366FF,800080,999999,FF00FF,FFCC00,FFFF00,00FF00,00FFFF,00CCFF,993366,C0C0C0,FF99CC,FFCC99,FFFF99,CCFFCC,CCFFFF,99CCFF,CC99FF,FFFFFF', 5054 grid_width : 8, 5055 default_color : '#888888' 5056 }, t.settings); 5057 5058 t.value = s.default_color; 5059 }, 5060 5061 showMenu : function() { 5062 var t = this, r, p, e; 5063 5064 if (t.isDisabled()) 5065 return; 5066 5067 if (!t.isMenuRendered) { 5068 t.renderMenu(); 5069 t.isMenuRendered = true; 5070 } 5071 5072 e = DOM.get(t.id); 5073 DOM.show(t.id + '_menu'); 5074 DOM.addClass(e, 'mceSplitButtonSelected'); 5075 p2 = DOM.getPos(e); 5076 DOM.setStyles(t.id + '_menu', { 5077 left : p2.x, 5078 top : p2.y + e.clientHeight, 5079 zIndex : 150 5080 }); 5081 e = 0; 5082 5083 Event.add(document, 'mousedown', t.hideMenu, t); 5084 }, 5085 5086 hideMenu : function(e) { 5087 var t = this; 5088 5089 if (!e || !DOM.getParent(e.target, function(n) {return DOM.hasClass(n, 'mceSplitButtonMenu');})) { 5090 DOM.removeClass(t.id, 'mceSplitButtonSelected'); 5091 Event.remove(document, 'mousedown', t.hideMenu, t); 5092 DOM.hide(t.id + '_menu'); 5093 } 5094 }, 5095 5096 renderMenu : function() { 5097 var t = this, m, i = 0, s = t.settings, n, tb, tr, w; 5098 5099 w = DOM.add(s.menu_container, 'div', {id : t.id + '_menu', 'class' : s['menu_class'] + ' ' + s['class'], style : 'position:absolute;left:0;top:-1000px;'}); 5100 m = DOM.add(w, 'div', {'class' : s['class'] + ' mceSplitButtonMenu'}); 5101 DOM.add(m, 'span', {'class' : 'mceMenuLine'}); 5102 5103 n = DOM.add(m, 'table', {'class' : 'mceColorSplitMenu'}); 5104 tb = DOM.add(n, 'tbody'); 5105 5106 // Generate color grid 5107 i = 0; 5108 each(is(s.colors, 'array') ? s.colors : s.colors.split(','), function(c) { 5109 c = c.replace(/^#/, ''); 5110 5111 if (!i--) { 5112 tr = DOM.add(tb, 'tr'); 5113 i = s.grid_width - 1; 5114 } 5115 5116 n = DOM.add(tr, 'td'); 5117 5118 n = DOM.add(n, 'a', { 5119 href : 'javascript:;', 5120 style : { 5121 backgroundColor : '#' + c 5122 } 5123 }); 5124 5125 Event.add(n, 'mousedown', function() { 5126 t.setColor('#' + c); 5127 }); 5128 }); 5129 5130 if (s.more_colors_func) { 5131 n = DOM.add(tb, 'tr'); 5132 n = DOM.add(n, 'td', {colspan : s.grid_width, 'class' : 'morecolors'}); 5133 n = DOM.add(n, 'a', {href : 'javascript:;', onclick : 'return false;', 'class' : 'morecolors'}, s.more_colors_title); 5134 5135 Event.add(n, 'click', function(e) { 5136 s.more_colors_func.call(s.more_colors_scope || this); 5137 return Event.cancel(e); // Cancel to fix onbeforeunload problem 5138 }); 5139 } 5140 5141 DOM.addClass(m, 'mceColorSplitMenu'); 5142 5143 return w; 5144 }, 5145 5146 setColor : function(c) { 5147 var t = this, p, s = this.settings, co = s.menu_container, po, cp, id = t.id + '_preview'; 5148 5149 if (!(p = DOM.get(id))) { 5150 DOM.setStyle(t.id + '_action', 'position', 'relative'); 5151 p = DOM.add(t.id + '_action', 'div', {id : id, 'class' : 'mceColorPreview'}); 5152 } 5153 5154 p.style.backgroundColor = c; 5155 5156 t.value = c; 5157 t.hideMenu(); 5158 s.onselect(c); 5159 } 5160 5161 }); 5162 })(); 5163 5164 /* file:jscripts/tiny_mce/classes/ui/Toolbar.js */ 5165 5166 tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { 5167 renderHTML : function() { 5168 var t = this, h = '', c = 'mceToolbarEnd', co, dom = tinymce.DOM, s = t.settings; 5169 5170 h += dom.createHTML('td', {'class' : 'mceToolbarStart'}, dom.createHTML('span', null, '<!-- IE -->')); 5171 5172 tinymce.each(t.controls, function(c) { 5173 h += '<td>' + c.renderHTML() + '</td>'; 5174 }); 5175 5176 co = t.controls[t.controls.length - 1].constructor; 5177 5178 if (co === tinymce.ui.Button) 5179 c += ' mceToolbarEndButton'; 5180 else if (co === tinymce.ui.SplitButton) 5181 c += ' mceToolbarEndSplitButton'; 5182 else if (co === tinymce.ui.ListBox) 5183 c += ' mceToolbarEndListBox'; 5184 5185 h += dom.createHTML('td', {'class' : c}, dom.createHTML('span', null, '<!-- IE -->')); 5186 5187 return dom.createHTML('table', {id : t.id, 'class' : 'mceToolbar' + (s['class'] ? ' ' + s['class'] : ''), cellpadding : '0', cellspacing : '0', align : t.settings.align || ''}, '<tbody><tr>' + h + '</tr></tbody>'); 5188 } 5189 5190 }); 5191 5192 /* file:jscripts/tiny_mce/classes/AddOnManager.js */ 5193 5194 (function() { 5195 var Dispatcher = tinymce.util.Dispatcher, each = tinymce.each; 5196 5197 tinymce.create('tinymce.AddOnManager', { 5198 items : [], 5199 urls : {}, 5200 lookup : {}, 5201 onAdd : new Dispatcher(this), 5202 5203 get : function(n) { 5204 return this.lookup[n]; 5205 }, 5206 5207 requireLangPack : function(n) { 5208 var u, s; 5209 5210 if (tinymce.EditorManager.settings) { 5211 u = this.urls[n] + '/langs/' + tinymce.EditorManager.settings.language + '.js'; 5212 s = tinymce.EditorManager.settings; 5213 5214 if (s) { 5215 if (!tinymce.dom.Event.domLoaded && !s.strict_mode) 5216 tinymce.ScriptLoader.load(u); 5217 else 5218 tinymce.ScriptLoader.add(u); 5219 } 5220 } 5221 }, 5222 5223 add : function(id, o) { 5224 this.items.push(o); 5225 this.lookup[id] = o; 5226 this.onAdd.dispatch(this, id, o); 5227 5228 return o; 5229 }, 5230 5231 load : function(n, u, cb, s) { 5232 if (u.indexOf('/') != 0 && u.indexOf('://') == -1) 5233 u = tinymce.baseURL + '/' + u; 5234 5235 this.urls[n] = u.substring(0, u.lastIndexOf('/')); 5236 tinymce.ScriptLoader.add(u, cb, s); 5237 } 5238 5239 }); 5240 5241 // Create plugin and theme managers 5242 tinymce.PluginManager = new tinymce.AddOnManager(); 5243 tinymce.ThemeManager = new tinymce.AddOnManager(); 5244 }()); 5245 /* file:jscripts/tiny_mce/classes/EditorManager.js */ 5246 5247 (function() { 5248 // Shorten names 5249 var each = tinymce.each, extend = tinymce.extend, DOM = tinymce.DOM, Event = tinymce.dom.Event, ThemeManager = tinymce.ThemeManager, PluginManager = tinymce.PluginManager; 5250 5251 tinymce.create('static tinymce.EditorManager', { 5252 editors : {}, 5253 i18n : {}, 5254 activeEditor : null, 5255 5256 init : function(s) { 5257 var t = this, pl, sl = tinymce.ScriptLoader; 5258 5259 function execCallback(se, n, s) { 5260 var f = se[n]; 5261 5262 if (!f) 5263 return; 5264 5265 if (tinymce.is(f, 'string')) { 5266 s = f.replace(/\.\w+$/, ''); 5267 s = s ? tinymce.resolve(s) : 0; 5268 f = tinymce.resolve(f); 5269 } 5270 5271 return f.apply(s || this, Array.prototype.slice.call(arguments, 2)); 5272 }; 5273 5274 s = extend({ 5275 theme : "simple", 5276 language : "en", 5277 strict_loading_mode : document.contentType == 'application/xhtml+xml' 5278 }, s); 5279 5280 t.settings = s; 5281 5282 // If page not loaded and strict mode isn't enabled then load them 5283 if (!Event.domLoaded && !s.strict_loading_mode) { 5284 // Load language 5285 if (s.language) 5286 sl.add(tinymce.baseURL + '/langs/' + s.language + '.js'); 5287 5288 // Load theme 5289 if (s.theme && s.theme.charAt(0) != '-') 5290 ThemeManager.load(s.theme, 'themes/' + s.theme + '/editor_template' + tinymce.suffix + '.js'); 5291 5292 // Load plugins 5293 if (s.plugins) { 5294 pl = s.plugins.split(','); 5295 5296 // Load compat2x first 5297 if (tinymce.inArray(pl, 'compat2x') != -1) 5298 PluginManager.load('compat2x', 'plugins/compat2x/editor_plugin' + tinymce.suffix + '.js'); 5299 5300 // Load rest if plugins 5301 each(pl, function(v) { 5302 if (v && v.charAt(0) != '-') { 5303 // Skip safari plugin for other browsers 5304 if (!tinymce.isWebKit && v == 'safari') 5305 return; 5306 5307 PluginManager.load(v, 'plugins/' + v + '/editor_plugin' + tinymce.suffix + '.js'); 5308 } 5309 }); 5310 } 5311 5312 sl.loadQueue(); 5313 } 5314 5315 // Legacy call 5316 Event.add(document, 'init', function() { 5317 var l, co; 5318 5319 execCallback(s, 'onpageload'); 5320 5321 // Verify that it's a valid browser 5322 if (s.browsers) { 5323 l = false; 5324 5325 each(s.browsers.split(','), function(v) { 5326 switch (v) { 5327 case 'ie': 5328 case 'msie': 5329 if (tinymce.isIE) 5330 l = true; 5331 break; 5332 5333 case 'gecko': 5334 if (tinymce.isGecko) 5335 l = true; 5336 break; 5337 5338 case 'safari': 5339 case 'webkit': 5340 if (tinymce.isWebKit) 5341 l = true; 5342 break; 5343 5344 case 'opera': 5345 if (tinymce.isOpera) 5346 l = true; 5347 5348 break; 5349 } 5350 }); 5351 5352 // Not a valid one 5353 if (!l) 5354 return; 5355 } 5356 5357 switch (s.mode) { 5358 case "exact": 5359 l = s.elements || ''; 5360 each(l.split(','), function(v) { 5361 new tinymce.Editor(v, s).render(); 5362 }); 5363 break; 5364 5365 case "textareas": 5366 function hasClass(n, c) { 5367 return new RegExp('\\b' + c + '\\b', 'g').test(n.className); 5368 }; 5369 5370 each(DOM.select('textarea'), function(v) { 5371 if (s.editor_deselector && hasClass(v, s.editor_deselector)) 5372 return; 5373 5374 if (!s.editor_selector || hasClass(v, s.editor_selector)) 5375 new tinymce.Editor(v.id = (v.id || v.name || (v.id = DOM.uniqueId())), s).render(); 5376 }); 5377 break; 5378 } 5379 5380 // Call onInit when all editors are initialized 5381 if (s.oninit) { 5382 l = co = 0; 5383 5384 each (t.editors, function(ed) { 5385 co++; 5386 5387 if (!ed.initialized) { 5388 // Wait for it 5389 ed.onInit.add(function() { 5390 l++; 5391 5392 // All done 5393 if (l == co) 5394 execCallback(s, 'oninit'); 5395 }); 5396 } else 5397 l++; 5398 5399 // All done 5400 if (l == co) 5401 execCallback(s, 'oninit'); 5402 }); 5403 } 5404 }); 5405 }, 5406 5407 get : function(id) { 5408 return this.editors[id]; 5409 }, 5410 5411 getInstanceById : function(id) { 5412 return this.get(id); 5413 }, 5414 5415 add : function(e) { 5416 this.editors[e.id] = e; 5417 this._setActive(e); 5418 5419 return e; 5420 }, 5421 5422 remove : function(e) { 5423 var t = this; 5424 5425 // Not in the collection 5426 if (!t.editors[e.id]) 5427 return null; 5428 5429 delete t.editors[e.id]; 5430 5431 // Select another editor since the active one was removed 5432 if (t.activeEditor == e) { 5433 each(t.editors, function(e) { 5434 t._setActive(e); 5435 return false; // Break 5436 }); 5437 } 5438 5439 e._destroy(); 5440 5441 return e; 5442 }, 5443 5444 execCommand : function(c, u, v) { 5445 var t = this, ed = t.get(v); 5446 5447 // Manager commands 5448 switch (c) { 5449 case "mceFocus": 5450 ed.focus(); 5451 return true; 5452 5453 case "mceAddEditor": 5454 case "mceAddControl": 5455 new tinymce.Editor(v, t.settings).render(); 5456 return true; 5457 5458 case "mceAddFrameControl": 5459 // TODO: Implement this 5460 return true; 5461 5462 case "mceRemoveEditor": 5463 case "mceRemoveControl": 5464 ed.remove(); 5465 return true; 5466 5467 case 'mceToggleEditor': 5468 if (!ed) { 5469 t.execCommand('mceAddControl', 0, v); 5470 return true; 5471 } 5472 5473 if (ed.isHidden()) 5474 ed.show(); 5475 else 5476 ed.hide(); 5477 5478 return true; 5479 } 5480 5481 // Run command on active editor 5482 if (t.activeEditor) 5483 return t.activeEditor.execCommand(c, u, v); 5484 5485 return false; 5486 }, 5487 5488 execInstanceCommand : function(id, c, u, v) { 5489 var ed = this.get(id); 5490 5491 if (ed) 5492 return ed.execCommand(c, u, v); 5493 5494 return false; 5495 }, 5496 5497 triggerSave : function() { 5498 each(this.editors, function(e) { 5499 e.save(); 5500 }); 5501 }, 5502 5503 addI18n : function(p, o) { 5504 var lo, i18n = this.i18n; 5505 5506 if (!tinymce.is(p, 'string')) { 5507 each(p, function(o, lc) { 5508 each(o, function(o, g) { 5509 each(o, function(o, k) { 5510 if (g === 'common') 5511 i18n[lc + '.' + k] = o; 5512 else 5513 i18n[lc + '.' + g + '.' + k] = o; 5514 }); 5515 }); 5516 }); 5517 } else { 5518 each(o, function(o, k) { 5519 i18n[p + '.' + k] = o; 5520 }); 5521 } 5522 }, 5523 5524 // Private methods 5525 5526 _setActive : function(e) { 5527 this.selectedInstance = this.activeEditor = e; 5528 } 5529 5530 }); 5531 5532 // Setup some URLs where the editor API is located and where the document is 5533 tinymce.documentBaseURL = window.location.href.replace(/[\?#].*$/, '').replace(/[\/\\][^\/]+$/, ''); 5534 if (!/[\/\\]$/.test(tinymce.documentBaseURL)) 5535 tinymce.documentBaseURL += '/'; 5536 5537 tinymce.baseURL = new tinymce.util.URI(tinymce.documentBaseURL).toAbsolute(tinymce.baseURL); 5538 tinymce.EditorManager.baseURI = new tinymce.util.URI(tinymce.baseURL); 5539 })(); 5540 5541 // Short for editor manager window.tinyMCE is needed when TinyMCE gets loaded though a XHR call 5542 var tinyMCE = window.tinyMCE = tinymce.EditorManager; 5543 5544 /* file:jscripts/tiny_mce/classes/Editor.js */ 5545 5546 (function() { 5547 var DOM = tinymce.DOM, Event = tinymce.dom.Event, extend = tinymce.extend, Dispatcher = tinymce.util.Dispatcher; 5548 var each = tinymce.each, isGecko = tinymce.isGecko, isIE = tinymce.isIE, isWebKit = tinymce.isWebKit; 5549 var is = tinymce.is, ThemeManager = tinymce.ThemeManager, PluginManager = tinymce.PluginManager, EditorManager = tinymce.EditorManager; 5550 var inArray = tinymce.inArray, grep = tinymce.grep; 5551 5552 tinymce.create('tinymce.Editor', { 5553 Editor : function(id, s) { 5554 var t = this; 5555 5556 t.id = t.editorId = id; 5557 t.execCommands = {}; 5558 t.queryStateCommands = {}; 5559 t.queryValueCommands = {}; 5560 t.plugins = {}; 5561 5562 // Add events to the editor 5563 each([ 5564 'onPreInit', 5565 'onBeforeRenderUI', 5566 'onPostRender', 5567 'onInit', 5568 'onRemove', 5569 'onActivate', 5570 'onDeactivate', 5571 'onClick', 5572 'onEvent', 5573 'onMouseUp', 5574 'onMouseDown', 5575 'onDblClick', 5576 'onKeyDown', 5577 'onKeyUp', 5578 'onKeyPress', 5579 'onContextMenu', 5580 'onSubmit', 5581 'onReset', 5582 'onPaste', 5583 'onPreProcess', 5584 'onPostProcess', 5585 'onBeforeSetContent', 5586 'onBeforeGetContent', 5587 'onSetContent', 5588 'onGetContent', 5589 'onLoadContent', 5590 'onSaveContent', 5591 'onNodeChange', 5592 'onChange', 5593 'onBeforeExecCommand', 5594 'onExecCommand', 5595 'onUndo', 5596 'onRedo', 5597 'onVisualAid', 5598 'onSetProgressState' 5599 ], function(e) { 5600 t[e] = new Dispatcher(t); 5601 }); 5602 5603 // Default editor config 5604 t.settings = s = extend({ 5605 id : id, 5606 language : 'en', 5607 docs_language : 'en', 5608 theme : 'simple', 5609 skin : 'default', 5610 delta_width : 0, 5611 delta_height : 0, 5612 popup_css : '', 5613 plugins : '', 5614 document_base_url : tinymce.documentBaseURL, 5615 add_form_submit_trigger : 1, 5616 submit_patch : 1, 5617 add_unload_trigger : 1, 5618 convert_urls : 1, 5619 relative_urls : 1, 5620 remove_script_host : 1, 5621 table_inline_editing : 0, 5622 object_resizing : 1, 5623 cleanup : 1, 5624 accessibility_focus : 1, 5625 custom_shortcuts : 1, 5626 custom_undo_redo_keyboard_shortcuts : 1, 5627 custom_undo_redo_restore_selection : 1, 5628 custom_undo_redo : 1, 5629 doctype : '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', 5630 visual_table_class : 'mceItemTable', 5631 visual : 1, 5632 inline_styles : true, 5633 convert_fonts_to_spans : true, 5634 font_size_style_values : 'xx-small,x-small,small,medium,large,x-large,xx-large', 5635 apply_source_formatting : 1, 5636 directionality : 'ltr', 5637 forced_root_block : 'p', 5638 valid_elements : '@[id|class|style|title|dir<ltr?rtl|lang|xml::lang|onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup],a[rel|rev|charset|hreflang|tabindex|accesskey|type|name|href|target|title|class|onfocus|onblur],strong/b,em/i,strike,u,#p[align],-ol[type|compact],-ul[type|compact],-li,br,img[longdesc|usemap|src|border|alt=|title|hspace|vspace|width|height|align],-sub,-sup,-blockquote,-table[border=0|cellspacing|cellpadding|width|frame|rules|height|align|summary|bgcolor|background|bordercolor],-tr[rowspan|width|height|align|valign|bgcolor|background|bordercolor],tbody,thead,tfoot,#td[colspan|rowspan|width|height|align|valign|bgcolor|background|bordercolor|scope],#th[colspan|rowspan|width|height|align|valign|scope],caption,-div,-span,-pre,address,-h1,-h2,-h3,-h4,-h5,-h6,hr[size|noshade],-font[face|size|color],dd,dl,dt,cite,abbr,acronym,del[datetime|cite],ins[datetime|cite],object[classid|width|height|codebase|*],param[name|value|_value],embed[type|width|height|src|*],script[type]', 5639 hidden_input : 1, 5640 padd_empty_editor : 1, 5641 render_ui : 1, 5642 init_theme : 1, 5643 indentation : '30px' 5644 }, s); 5645 5646 // Setup URIs 5647 t.documentBaseURI = new tinymce.util.URI(s.document_base_url || tinymce.documentBaseURL, { 5648 base_uri : tinyMCE.baseURI 5649 }); 5650 t.baseURI = EditorManager.baseURI; 5651 5652 // Call setup 5653 t.execCallback('setup', t); 5654 }, 5655 5656 render : function() { 5657 var t = this, s = t.settings, id = t.id, sl = tinymce.ScriptLoader; 5658 5659 // Element not found, then skip initialization 5660 if (!t.getElement()) 5661 return; 5662 5663 if (s.strict_loading_mode) { 5664 sl.settings.strict_mode = s.strict_loading_mode; 5665 tinymce.DOM.settings.strict = 1; 5666 } 5667 5668 // Add hidden input for non input elements inside form elements 5669 if (!/TEXTAREA|INPUT/i.test(t.getElement().nodeName) && s.hidden_input && DOM.getParent(id, 'form')) 5670 DOM.insertAfter(DOM.create('input', {type : 'hidden', name : id}), id); 5671 5672 t.windowManager = new tinymce.WindowManager(t); 5673 5674 if (s.encoding == 'xml') { 5675 t.onGetContent.add(function(ed, o) { 5676 if (o.get) 5677 o.content = DOM.encode(o.content); 5678 }); 5679 } 5680 5681 if (s.add_form_submit_trigger) { 5682 t.onSubmit.addToTop(function() { 5683 if (t.initialized) { 5684 t.save(); 5685 t.isNotDirty = 1; 5686 } 5687 }); 5688 } 5689 5690 Event.add(document, 'unload', function() { 5691 if (t.initialized && !t.destroyed && s.add_unload_trigger) 5692 t.save({format : 'raw', no_events : true}); 5693 }); 5694 5695 tinymce.addUnload(t._destroy, t); 5696 5697 if (s.submit_patch) { 5698 t.onBeforeRenderUI.add(function() { 5699 var n = t.getElement().form; 5700 5701 if (!n) 5702 return; 5703 5704 // Already patched 5705 if (n._mceOldSubmit) 5706 return; 5707 5708 // Check page uses id="submit" or name="submit" for it's submit button 5709 if (!n.submit.nodeType) { 5710 t.formElement = n; 5711 n._mceOldSubmit = n.submit; 5712 n.submit = function() { 5713 // Save all instances 5714 EditorManager.triggerSave(); 5715 t.isNotDirty = 1; 5716 5717 return this._mceOldSubmit(this); 5718 }; 5719 } 5720 5721 n = null; 5722 }); 5723 } 5724 5725 // Load scripts 5726 function loadScripts() { 5727 sl.add(tinymce.baseURL + '/langs/' + s.language + '.js'); 5728 5729 if (s.theme.charAt(0) != '-') 5730 ThemeManager.load(s.theme, 'themes/' + s.theme + '/editor_template' + tinymce.suffix + '.js'); 5731 5732 each(s.plugins.split(','), function(p) { 5733 if (p && p.charAt(0) != '-') { 5734 // Skip safari plugin for other browsers 5735 if (!isWebKit && p == 'safari') 5736 return; 5737 5738 PluginManager.load(p, 'plugins/' + p + '/editor_plugin' + tinymce.suffix + '.js'); 5739 } 5740 }); 5741 5742 // Init when que is loaded 5743 sl.loadQueue(function() { 5744 if (s.ask) { 5745 function ask() { 5746 t.windowManager.confirm(t.getLang('edit_confirm'), function(s) { 5747 if (s) 5748 t.init(); 5749 else 5750 Event.remove(t.id, 'focus', ask); 5751 }); 5752 }; 5753 5754 Event.add(t.id, 'focus', ask); 5755 return; 5756 } 5757 5758 if (!t.removed) 5759 t.init(); 5760 }); 5761 }; 5762 5763 // Load compat2x first 5764 if (s.plugins.indexOf('compat2x') != -1) { 5765 PluginManager.load('compat2x', 'plugins/compat2x/editor_plugin' + tinymce.suffix + '.js'); 5766 sl.loadQueue(loadScripts); 5767 } else 5768 loadScripts(); 5769 }, 5770 5771 init : function() { 5772 var n, t = this, s = t.settings, w, h, e = t.getElement(), o, ti; 5773 5774 EditorManager.add(t); 5775 5776 // Create theme 5777 s.theme = s.theme.replace(/-/, ''); 5778 o = ThemeManager.get(s.theme); 5779 t.theme = new o(); 5780 5781 if (t.theme.init && s.init_theme) 5782 t.theme.init(t, ThemeManager.urls[s.theme] || tinymce.documentBaseURL.replace(/\/$/, '')); 5783 5784 // Create all plugins 5785 each(s.plugins.replace(/\-/g, '').split(','), function(p) { 5786 var c = PluginManager.get(p), u = PluginManager.urls[p] || tinymce.documentBaseURL.replace(/\/$/, ''), po; 5787 5788 if (c) { 5789 po = new c(t, u); 5790 5791 t.plugins[p] = po; 5792 5793 if (po.init) 5794 po.init(t, u); 5795 } 5796 }); 5797 5798 // Setup popup CSS path(s) 5799 s.popup_css = t.baseURI.toAbsolute(s.popup_css || "themes/" + s.theme + "/skins/" + s.skin + "/dialog.css"); 5800 5801 if (s.popup_css_add) 5802 s.popup_css += ',' + s.popup_css_add; 5803 5804 // Setup control factory 5805 t.controlManager = new tinymce.ControlManager(t); 5806 t.undoManager = new tinymce.UndoManager(t); 5807 5808 // Pass through 5809 t.undoManager.onAdd.add(function(um, l) { 5810 return t.onChange.dispatch(t, l, um); 5811 }); 5812 5813 t.undoManager.onUndo.add(function(um, l) { 5814 return t.onUndo.dispatch(t, l, um); 5815 }); 5816 5817 t.undoManager.onRedo.add(function(um, l) { 5818 return t.onRedo.dispatch(t, l, um); 5819 }); 5820 5821 if (s.custom_undo_redo) { 5822 t.onExecCommand.add(function(ed, cmd) { 5823 if (cmd != 'Undo' && cmd != 'Redo' && cmd != 'mceRepaint') 5824 t.undoManager.add(); 5825 }); 5826 } 5827 5828 t.onExecCommand.add(function(ed, c) { 5829 // Don't refresh the select lists until caret move 5830 if (!/^(FontName|FontSize)$/.test(c)) 5831 t.nodeChanged(); 5832 }); 5833 5834 // Remove ghost selections on images and tables in Gecko 5835 if (isGecko) { 5836 function repaint() { 5837 t.execCommand('mceRepaint'); 5838 }; 5839 5840 t.onUndo.add(repaint); 5841 t.onRedo.add(repaint); 5842 t.onSetContent.add(repaint); 5843 } 5844 5845 // Enables users to override the control factory 5846 t.onBeforeRenderUI.dispatch(t, t.controlManager); 5847 5848 // Measure box 5849 if (s.render_ui) { 5850 w = s.width || e.style.width || e.clientWidth; 5851 h = s.height || e.style.height || e.clientHeight; 5852 t.orgDisplay = e.style.display; 5853 5854 if (('' + w).indexOf('%') == -1) 5855 w = Math.max(parseInt(w) + (o.deltaWidth || 0), 100); 5856 5857 if (('' + h).indexOf('%') == -1) 5858 h = Math.max(parseInt(h) + (o.deltaHeight || 0), 100); 5859 5860 // Render UI 5861 o = t.theme.renderUI({ 5862 targetNode : e, 5863 width : w, 5864 height : h, 5865 deltaWidth : s.delta_width, 5866 deltaHeight : s.delta_height 5867 }); 5868 5869 t.editorContainer = o.editorContainer; 5870 } 5871 5872 5873 // Resize editor 5874 DOM.setStyles(o.sizeContainer || o.editorContainer, { 5875 width : w, 5876 height : h 5877 }); 5878 5879 h = (o.iframeHeight || h) + ((h + '').indexOf('%') == -1 ? (o.deltaHeight || 0) : ''); 5880 if (h < 100) 5881 h = 100; 5882 5883 // Create iframe 5884 n = DOM.add(o.iframeContainer, 'iframe', { 5885 id : s.id + "_ifr", 5886 src : 'javascript:""', // Workaround for HTTPS warning in IE6/7 5887 frameBorder : '0', 5888 style : { 5889 width : '100%', 5890 height : h 5891 } 5892 }); 5893 5894 t.contentAreaContainer = o.iframeContainer; 5895 DOM.get(o.editorContainer).style.display = t.orgDisplay; 5896 DOM.get(s.id).style.display = 'none'; 5897 5898 // Safari 2.x requires us to wait for the load event and load a real HTML doc 5899 if (tinymce.isOldWebKit) { 5900 Event.add(n, 'load', t.setupIframe, t); 5901 n.src = tinymce.baseURL + '/plugins/safari/blank.htm'; 5902 } else { 5903 t.setupIframe(); 5904 e = n = o = null; // Cleanup 5905 } 5906 5907 /* function createIfr() { 5908 h = (o.iframeHeight || h) + ((h + '').indexOf('%') == -1 ? (o.deltaHeight || 0) : ''); 5909 if (h < 100) 5910 h = 100; 5911 5912 // Create iframe 5913 n = DOM.add(o.iframeContainer, 'iframe', { 5914 id : s.id + "_ifr", 5915 src : 'javascript:""', // Workaround for HTTPS warning in IE6/7 5916 frameBorder : '0', 5917 style : { 5918 width : '100%', 5919 height : h 5920 } 5921 }); 5922 5923 t.contentAreaContainer = o.iframeContainer; 5924 DOM.get(o.editorContainer).style.display = t.orgDisplay; 5925 DOM.get(s.id).style.display = 'none'; 5926 5927 // Safari 2.x requires us to wait for the load event and load a real HTML doc 5928 if (tinymce.isOldWebKit) { 5929 Event.add(n, 'load', t.setupIframe, t); 5930 n.src = tinymce.baseURL + '/plugins/safari/blank.htm'; 5931 } else { 5932 t.setupIframe(); 5933 e = n = o = null; // Cleanup 5934 } 5935 }; 5936 */ 5937 // Waits for the editor to become visible, then it will run the init 5938 // This method is somewhat ugly but this is the best way to deal with it without 5939 // forcing the user to add some logic to their application. 5940 /* if (isGecko) { 5941 function check() { 5942 var hi; 5943 5944 DOM.getParent(t.id, function(e) { 5945 if (DOM.getStyle(e, 'display', true) == 'none') { 5946 hi = 1; 5947 return true; 5948 } 5949 }); 5950 5951 return hi; 5952 }; 5953 5954 if (check()) { 5955 ti = window.setInterval(function() { 5956 if (!check()) { 5957 createIfr(); 5958 window.clearInterval(ti); 5959 } 5960 }, 300); 5961 5962 return; 5963 } 5964 } 5965 5966 createIfr(); 5967 */ 5968 }, 5969 5970 setupIframe : function() { 5971 var t = this, s = t.settings, e = DOM.get(s.id), d = t.getDoc(); 5972 5973 // Setup body 5974 d.open(); 5975 d.write(s.doctype + '<html><head xmlns="http://www.w3.org/1999/xhtml"><base href="' + t.documentBaseURI.getURI() + '" /><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /></head><body id="tinymce" class="mceContentBody"></body></html>'); 5976 d.close(); 5977 5978 // Design mode needs to be added here Ctrl+A will fail otherwise 5979 if (!isIE) { 5980 try { 5981 d.designMode = 'On'; 5982 } catch (ex) { 5983 // Will fail on Gecko if the editor is placed in an hidden container element 5984 // The design mode will be set ones the editor is focused 5985 } 5986 } 5987 5988 // IE needs to use contentEditable or it will display non secure items for HTTPS 5989 if (isIE) 5990 t.getBody().contentEditable = true; 5991 5992 // Setup objects 5993 t.dom = new tinymce.DOM.DOMUtils(t.getDoc(), { 5994 keep_values : true, 5995 url_converter : t.convertURL, 5996 url_converter_scope : t, 5997 hex_colors : s.force_hex_style_colors, 5998 class_filter : s.class_filter, 5999 update_styles : 1 6000 }); 6001 6002 t.serializer = new tinymce.dom.Serializer({ 6003 entity_encoding : s.entity_encoding, 6004 entities : s.entities, 6005 valid_elements : s.verify_html === false ? '*[*]' : s.valid_elements, 6006 extended_valid_elements : s.extended_valid_elements, 6007 valid_child_elements : s.valid_child_elements, 6008 invalid_elements : s.invalid_elements, 6009 fix_table_elements : s.fix_table_elements, 6010 fix_list_elements : s.fix_list_elements, 6011 fix_content_duplication : s.fix_content_duplication, 6012 convert_fonts_to_spans : s.convert_fonts_to_spans, 6013 font_size_classes : s.font_size_classes, 6014 font_size_style_values : s.font_size_style_values, 6015 apply_source_formatting : s.apply_source_formatting, 6016 remove_linebreaks : s.remove_linebreaks, 6017 dom : t.dom 6018 }); 6019 6020 t.selection = new tinymce.dom.Selection(t.dom, t.getWin(), t.serializer); 6021 t.forceBlocks = new tinymce.ForceBlocks(t, { 6022 forced_root_block : s.forced_root_block 6023 }); 6024 t.editorCommands = new tinymce.EditorCommands(t); 6025 6026 // Pass through 6027 t.serializer.onPreProcess.add(function(se, o) { 6028 return t.onPreProcess.dispatch(t, o, se); 6029 }); 6030 6031 t.serializer.onPostProcess.add(function(se, o) { 6032 return t.onPostProcess.dispatch(t, o, se); 6033 }); 6034 6035 t.onPreInit.dispatch(t); 6036 6037 if (!s.gecko_spellcheck) 6038 t.getBody().spellcheck = 0; 6039 6040 t._addEvents(); 6041 6042 t.controlManager.onPostRender.dispatch(t, t.controlManager); 6043 t.onPostRender.dispatch(t); 6044 6045 if (s.directionality) 6046 t.getBody().dir = s.directionality; 6047 6048 if (s.nowrap) 6049 t.getBody().style.whiteSpace = "nowrap"; 6050 6051 if (s.auto_resize) 6052 t.onNodeChange.add(t.resizeToContent, t); 6053 6054 if (s.handle_node_change_callback) { 6055 t.onNodeChange.add(function(ed, cm, n) { 6056 t.execCallback('handle_node_change_callback', t.id, n, -1, -1, true, t.selection.isCollapsed()); 6057 }); 6058 } 6059 6060 if (s.save_callback) { 6061 t.onSaveContent.add(function(ed, o) { 6062 var h = t.execCallback('save_callback', t.id, o.content, t.getBody()); 6063 6064 if (h) 6065 o.content = h; 6066 }); 6067 } 6068 6069 if (s.onchange_callback) { 6070 t.onChange.add(function(ed, l) { 6071 t.execCallback('onchange_callback', t, l); 6072 }); 6073 } 6074 6075 if (s.convert_newlines_to_brs) { 6076 t.onBeforeSetContent.add(function(ed, o) { 6077 if (o.initial) 6078 o.content = o.content.replace(/\r?\n/g, '<br />'); 6079 }); 6080 } 6081 6082 if (s.fix_nesting && isIE) { 6083 t.onBeforeSetContent.add(function(ed, o) { 6084 o.content = t._fixNesting(o.content); 6085 }); 6086 } 6087 6088 if (s.preformatted) { 6089 t.onPostProcess.add(function(ed, o) { 6090 o.content = o.content.replace(/^\s*<pre.*?>/, ''); 6091 o.content = o.content.replace(/<\/pre>\s*$/, ''); 6092 6093 if (o.set) 6094 o.content = '<pre class="mceItemHidden">' + o.content + '</pre>'; 6095 }); 6096 } 6097 6098 if (s.verify_css_classes) { 6099 t.serializer.attribValueFilter = function(n, v) { 6100 var s, cl; 6101 6102 if (n == 'class') { 6103 // Build regexp for classes 6104 if (!t.classesRE) { 6105 cl = t.dom.getClasses(); 6106 6107 if (cl.length > 0) { 6108 s = ''; 6109 6110 each (cl, function(o) { 6111 s += (s ? '|' : '') + o['class']; 6112 }); 6113 6114 t.classesRE = new RegExp('(' + s + ')', 'gi'); 6115 } 6116 } 6117 6118 return !t.classesRE || /(\bmceItem\w+\b|\bmceTemp\w+\b)/g.test(v) || t.classesRE.test(v) ? v : ''; 6119 } 6120 6121 return v; 6122 }; 6123 } 6124 6125 if (s.convert_fonts_to_spans) 6126 t._convertFonts(); 6127 6128 if (s.inline_styles) 6129 t._convertInlineElements(); 6130 6131 if (s.cleanup_callback) { 6132 t.onSetContent.add(function(ed, o) { 6133 if (o.initial) { 6134 t.setContent(t.execCallback('cleanup_callback', 'insert_to_editor', o.content, o), {format : 'raw', no_events : true}); 6135 t.execCallback('cleanup_callback', 'insert_to_editor_dom', t.getDoc(), o); 6136 } 6137 }); 6138 6139 t.onPreProcess.add(function(ed, o) { 6140 if (o.set) 6141 t.execCallback('cleanup_callback', 'insert_to_editor_dom', o.node, o); 6142 6143 if (o.get) 6144 t.execCallback('cleanup_callback', 'get_from_editor_dom', o.node, o); 6145 }); 6146 6147 t.onPostProcess.add(function(ed, o) { 6148 if (o.set) 6149 o.content = t.execCallback('cleanup_callback', 'insert_to_editor', o.content, o); 6150 6151 if (o.get) 6152 o.content = t.execCallback('cleanup_callback', 'get_from_editor', o.content, o); 6153 }); 6154 } 6155 6156 if (s.save_callback) { 6157 t.onGetContent.add(function(ed, o) { 6158 if (o.save) 6159 o.content = t.execCallback('save_callback', t.id, o.content, t.getBody()); 6160 }); 6161 } 6162 6163 if (s.handle_event_callback) { 6164 t.onEvent.add(function(ed, e, o) { 6165 if (t.execCallback('handle_event_callback', e, ed, o) === false) 6166 Event.cancel(e); 6167 }); 6168 } 6169 6170 t.onSetContent.add(function() { 6171 // Safari needs some time, it will crash the browser when a link is created otherwise 6172 // I think this crash issue is resolved in the latest 3.0.4 6173 //window.setTimeout(function() { 6174 t.addVisual(t.getBody()); 6175 //}, 1); 6176 }); 6177 6178 // Remove empty contents 6179 if (s.padd_empty_editor) { 6180 t.onPostProcess.add(function(ed, o) { 6181 o.content = o.content.replace(/^<p>( |#160;|\s)<\/p>$/, ''); 6182 }); 6183 } 6184 6185 // A small timeout was needed since firefox will remove. Bug: #1838304 6186 setTimeout(function () { 6187 if (t.removed) 6188 return; 6189 6190 t.load({initial : true, format : (s.cleanup_on_startup ? 'html' : 'raw')}); 6191 t.startContent = t.getContent({format : 'raw'}); 6192 t.undoManager.add({initial : true}); 6193 t.initialized = true; 6194 6195 t.onInit.dispatch(t); 6196 t.execCallback('setupcontent_callback', t.id, t.getBody(), t.getDoc()); 6197 t.execCallback('init_instance_callback', t); 6198 t.focus(true); 6199 t.nodeChanged({initial : 1}); 6200 6201 // Load specified content CSS last 6202 if (s.content_css) { 6203 tinymce.each(s.content_css.split(','), function(u) { 6204 t.dom.loadCSS(t.documentBaseURI.toAbsolute(u)); 6205 }); 6206 } 6207 6208 // Handle auto focus 6209 if (s.auto_focus) { 6210 setTimeout(function () { 6211 var ed = EditorManager.get(s.auto_focus); 6212 6213 ed.selection.select(ed.getBody(), 1); 6214 ed.selection.collapse(1); 6215 ed.getWin().focus(); 6216 }, 100); 6217 } 6218 }, 1); 6219 6220 e = null; 6221 }, 6222 6223 6224 focus : function(sf) { 6225 var oed, t = this; 6226 6227 if (!sf) { 6228 t.getWin().focus(); 6229 6230 } 6231 6232 if (EditorManager.activeEditor != t) { 6233 if ((oed = EditorManager.activeEditor) != null) 6234 oed.onDeactivate.dispatch(oed, t); 6235 6236 t.onActivate.dispatch(t, oed); 6237 } 6238 6239 EditorManager._setActive(t); 6240 }, 6241 6242 execCallback : function(n) { 6243 var t = this, f = t.settings[n], s; 6244 6245 if (!f) 6246 return; 6247 6248 // Look through lookup 6249 if (t.callbackLookup && (s = t.callbackLookup[n])) { 6250 f = s.func; 6251 s = s.scope; 6252 } 6253 6254 if (is(f, 'string')) { 6255 s = f.replace(/\.\w+$/, ''); 6256 s = s ? tinymce.resolve(s) : 0; 6257 f = tinymce.resolve(f); 6258 t.callbackLookup = t.callbackLookup || {}; 6259 t.callbackLookup[n] = {func : f, scope : s}; 6260 } 6261 6262 return f.apply(s || t, Array.prototype.slice.call(arguments, 1)); 6263 }, 6264 6265 translate : function(s) { 6266 var c = this.settings.language, i18n = EditorManager.i18n; 6267 6268 if (!s) 6269 return ''; 6270 6271 return i18n[c + '.' + s] || s.replace(/{\#([^}]+)\}/g, function(a, b) { 6272 return i18n[c + '.' + b] || '{#' + b + '}'; 6273 }); 6274 }, 6275 6276 getLang : function(n, dv) { 6277 return EditorManager.i18n[this.settings.language + '.' + n] || (is(dv) ? dv : '{#' + n + '}'); 6278 }, 6279 6280 getParam : function(n, dv) { 6281 return is(this.settings[n]) ? this.settings[n] : dv; 6282 }, 6283 6284 nodeChanged : function(o) { 6285 var t = this, s = t.selection, n = s.getNode() || this.getBody(); 6286 6287 this.onNodeChange.dispatch( 6288 t, 6289 o ? o.controlManager || t.controlManager : t.controlManager, 6290 isIE && n.ownerDocument != t.getDoc() ? this.getBody() : n, // Fix for IE initial state 6291 s.isCollapsed(), 6292 o 6293 ); 6294 }, 6295 6296 addButton : function(n, s) { 6297 var t = this; 6298 6299 t.buttons = t.buttons || {}; 6300 t.buttons[n] = s; 6301 }, 6302 6303 addCommand : function(n, f, s) { 6304 this.execCommands[n] = {func : f, scope : s || this}; 6305 }, 6306 6307 addQueryStateHandler : function(n, f, s) { 6308 this.queryStateCommands[n] = {func : f, scope : s || this}; 6309 }, 6310 6311 addQueryValueHandler : function(n, f, s) { 6312 this.queryValueCommands[n] = {func : f, scope : s || this}; 6313 }, 6314 6315 addShortcut : function(pa, desc, cmd_func, sc) { 6316 var t = this, c; 6317 6318 if (!t.settings.custom_shortcuts) 6319 return false; 6320 6321 t.shortcuts = t.shortcuts || {}; 6322 6323 if (is(cmd_func, 'string')) { 6324 c = cmd_func; 6325 6326 cmd_func = function() { 6327 t.execCommand(c, false, null); 6328 }; 6329 } 6330 6331 if (is(cmd_func, 'object')) { 6332 c = cmd_func; 6333 6334 cmd_func = function() { 6335 t.execCommand(c[0], c[1], c[2]); 6336 }; 6337 } 6338 6339 each(pa.split(','), function(pa) { 6340 var o = { 6341 func : cmd_func, 6342 scope : sc || this, 6343 desc : desc, 6344 alt : false, 6345 ctrl : false, 6346 shift : false 6347 }; 6348 6349 each(pa.split('+'), function(v) { 6350 switch (v) { 6351 case 'alt': 6352 case 'ctrl': 6353 case 'shift': 6354 o[v] = true; 6355 break; 6356 6357 default: 6358 o.charCode = v.charCodeAt(0); 6359 o.keyCode = v.toUpperCase().charCodeAt(0); 6360 } 6361 }); 6362 6363 t.shortcuts[(o.ctrl ? 'ctrl' : '') + ',' + (o.alt ? 'alt' : '') + ',' + (o.shift ? 'shift' : '') + ',' + o.keyCode] = o; 6364 }); 6365 6366 return true; 6367 }, 6368 6369 execCommand : function(cmd, ui, val, a) { 6370 var t = this, s = 0, o; 6371 6372 if (!/^(mceAddUndoLevel|mceEndUndoLevel|mceBeginUndoLevel|mceRepaint|SelectAll)$/.test(cmd) && (!a || !a.skip_focus)) 6373 t.focus(); 6374 6375 o = {}; 6376 t.onBeforeExecCommand.dispatch(t, cmd, ui, val, o); 6377 if (o.terminate) 6378 return false; 6379 6380 // Comamnd callback 6381 if (t.execCallback('execcommand_callback', null, t.id, t.selection.getNode(), cmd, ui, val)) { 6382 t.onExecCommand.dispatch(t, cmd, ui, val); 6383 return true; 6384 } 6385 6386 // Registred commands 6387 if (o = t.execCommands[cmd]) { 6388 s = o.func.call(o.scope, ui, val); 6389 t.onExecCommand.dispatch(t, cmd, ui, val); 6390 return s; 6391 } 6392 6393 // Plugin commands 6394 each(t.plugins, function(p) { 6395 if (p.execCommand && p.execCommand(cmd, ui, val)) { 6396 t.onExecCommand.dispatch(t, cmd, ui, val); 6397 s = 1; 6398 return false; 6399 } 6400 }); 6401 6402 if (s) 6403 return true; 6404 6405 // Theme commands 6406 if (t.theme.execCommand && t.theme.execCommand(cmd, ui, val)) { 6407 t.onExecCommand.dispatch(t, cmd, ui, val); 6408 return true; 6409 } 6410 6411 // Editor commands 6412 if (t.editorCommands.execCommand(cmd, ui, val)) { 6413 t.onExecCommand.dispatch(t, cmd, ui, val); 6414 return true; 6415 } 6416 6417 // Browser commands 6418 t.getDoc().execCommand(cmd, ui, val); 6419 t.onExecCommand.dispatch(t, cmd, ui, val); 6420 }, 6421 6422 queryCommandState : function(c) { 6423 var t = this, o; 6424 6425 // Is hidden then return undefined 6426 if (t._isHidden()) 6427 return; 6428 6429 // Registred commands 6430 if (o = t.queryStateCommands[c]) 6431 return o.func.call(o.scope); 6432 6433 // Registred commands 6434 o = t.editorCommands.queryCommandState(c); 6435 if (o !== -1) 6436 return o; 6437 6438 // Browser commands 6439 return this.getDoc().queryCommandState(c); 6440 }, 6441 6442 queryCommandValue : function(c) { 6443 var t = this, o; 6444 6445 // Is hidden then return undefined 6446 if (t._isHidden()) 6447 return; 6448 6449 // Registred commands 6450 if (o = t.queryValueCommands[c]) 6451 return o.func.call(o.scope); 6452 6453 // Registred commands 6454 o = t.editorCommands.queryCommandValue(c); 6455 if (is(o)) 6456 return o; 6457 6458 // Browser commands 6459 return this.getDoc().queryCommandValue(c); 6460 }, 6461 6462 show : function() { 6463 var t = this; 6464 6465 DOM.show(t.getContainer()); 6466 DOM.hide(t.id); 6467 t.load(); 6468 }, 6469 6470 hide : function() { 6471 var t = this, s = t.settings, d = t.getDoc(); 6472 6473 // Fixed bug where IE has a blinking cursor left from the editor 6474 if (isIE && d) 6475 d.execCommand('SelectAll'); 6476 6477 DOM.hide(t.getContainer()); 6478 DOM.setStyle(s.id, 'display', t.orgDisplay); 6479 t.save(); 6480 }, 6481 6482 isHidden : function() { 6483 return !DOM.isHidden(this.id); 6484 }, 6485 6486 setProgressState : function(b, ti, o) { 6487 this.onSetProgressState.dispatch(this, b, ti, o); 6488 6489 return b; 6490 }, 6491 6492 remove : function() { 6493 var t = this; 6494 6495 t.removed = 1; // Cancels post remove event execution 6496 t.hide(); 6497 DOM.remove(t.getContainer()); 6498 6499 t.execCallback('remove_instance_callback', t); 6500 t.onRemove.dispatch(t); 6501 6502 EditorManager.remove(t); 6503 }, 6504 6505 resizeToContent : function() { 6506 var t = this; 6507 6508 DOM.setStyle(t.id + "_ifr", 'height', t.getBody().scrollHeight); 6509 }, 6510 6511 load : function(o) { 6512 var t = this, e = t.getElement(), h; 6513 6514 o = o || {}; 6515 o.load = true; 6516 6517 h = t.setContent(is(e.value) ? e.value : e.innerHTML, o); 6518 o.element = e; 6519 6520 if (!o.no_events) 6521 t.onLoadContent.dispatch(t, o); 6522 6523 o.element = e = null; 6524 6525 return h; 6526 }, 6527 6528 save : function(o) { 6529 var t = this, e = t.getElement(), h, f; 6530 6531 if (!t.initialized) 6532 return; 6533 6534 o = o || {}; 6535 o.save = true; 6536 6537 o.element = e; 6538 h = o.content = t.getContent(o); 6539 6540 if (!o.no_events) 6541 t.onSaveContent.dispatch(t, o); 6542 6543 h = o.content; 6544 6545 if (!/TEXTAREA|INPUT/i.test(e.nodeName)) { 6546 e.innerHTML = h; 6547 6548 // Update hidden form element 6549 if (f = DOM.getParent(t.id, 'form')) { 6550 each(f.elements, function(e) { 6551 if (e.name == t.id) { 6552 e.value = h; 6553 return false; 6554 } 6555 }); 6556 } 6557 } else 6558 e.value = h; 6559 6560 o.element = e = null; 6561 6562 return h; 6563 }, 6564 6565 setContent : function(h, o) { 6566 var t = this; 6567 6568 o = o || {}; 6569 o.format = o.format || 'html'; 6570 o.set = true; 6571 o.content = h; 6572 6573 if (!o.no_events) 6574 t.onBeforeSetContent.dispatch(t, o); 6575 6576 // Padd empty content in Gecko and Safari. Commands will otherwise fail on the content 6577 // It will also be impossible to place the caret in the editor unless there is a BR element present 6578 if (!tinymce.isIE && (h.length === 0 || /^\s+$/.test(h))) { 6579 o.content = t.dom.setHTML(t.getBody(), '<br mce_bogus="1" />', 1); 6580 o.format = 'raw'; 6581 } 6582 6583 o.content = t.dom.setHTML(t.getBody(), o.content); 6584 6585 if (o.format != 'raw' && t.settings.cleanup) { 6586 o.getInner = true; 6587 o.content = t.dom.setHTML(t.getBody(), t.serializer.serialize(t.getBody(), o)); 6588 } 6589 6590 if (!o.no_events) 6591 t.onSetContent.dispatch(t, o); 6592 6593 return o.content; 6594 }, 6595 6596 getContent : function(o) { 6597 var t = this, h; 6598 6599 o = o || {}; 6600 o.format = o.format || 'html'; 6601 o.get = true; 6602 6603 if (!o.no_events) 6604 t.onBeforeGetContent.dispatch(t, o); 6605 6606 if (o.format != 'raw' && t.settings.cleanup) { 6607 o.getInner = true; 6608 h = t.serializer.serialize(t.getBody(), o); 6609 } else 6610 h = t.getBody().innerHTML; 6611 6612 h = h.replace(/^\s*|\s*$/g, ''); 6613 o = {content : h}; 6614 t.onGetContent.dispatch(t, o); 6615 6616 return o.content; 6617 }, 6618 6619 isDirty : function() { 6620 var t = this; 6621 6622 return tinymce.trim(t.startContent) != tinymce.trim(t.getContent({format : 'raw', no_events : 1})) && !t.isNotDirty; 6623 }, 6624 6625 getContainer : function() { 6626 var t = this; 6627 6628 if (!t.container) 6629 t.container = DOM.get(t.editorContainer || t.id + '_parent'); 6630 6631 return t.container; 6632 }, 6633 6634 getContentAreaContainer : function() { 6635 return this.contentAreaContainer; 6636 }, 6637 6638 getElement : function() { 6639 return DOM.get(this.settings.content_element || this.id); 6640 }, 6641 6642 getWin : function() { 6643 var t = this, e; 6644 6645 if (!t.contentWindow) { 6646 e = DOM.get(t.id + "_ifr"); 6647 6648 if (e) 6649 t.contentWindow = e.contentWindow; 6650 } 6651 6652 return t.contentWindow; 6653 }, 6654 6655 getDoc : function() { 6656 var t = this, w; 6657 6658 if (!t.contentDocument) { 6659 w = this.getWin(); 6660 6661 if (w) 6662 t.contentDocument = w.document; 6663 } 6664 6665 return t.contentDocument; 6666 }, 6667 6668 getBody : function() { 6669 return this.bodyElement || this.getDoc().body; 6670 }, 6671 6672 convertURL : function(u, n, e) { 6673 var t = this, s = t.settings; 6674 6675 // Use callback instead 6676 if (s.urlconverter_callback) 6677 return t.execCallback('urlconverter_callback', u, e, true, n); 6678 6679 // Don't convert link href since thats the CSS files that gets loaded into the editor 6680 if (!s.convert_urls || (e && e.nodeName == 'LINK')) 6681 return u; 6682 6683 // Convert to relative 6684 if (s.relative_urls) 6685 return t.documentBaseURI.toRelative(u); 6686 6687 // Convert to absolute 6688 u = t.documentBaseURI.toAbsolute(u, s.remove_script_host); 6689 6690 return u; 6691 }, 6692 6693 addVisual : function(e) { 6694 var t = this, s = t.settings; 6695 6696 e = e || t.getBody(); 6697 6698 if (!is(t.hasVisual)) 6699 t.hasVisual = s.visual; 6700 6701 each(t.dom.select('table,a', e), function(e) { 6702 var v; 6703 6704 switch (e.nodeName) { 6705 case 'TABLE': 6706 v = t.dom.getAttrib(e, 'border'); 6707 6708 if (!v || v == '0') { 6709 if (t.hasVisual) 6710 t.dom.addClass(e, s.visual_table_class); 6711 else 6712 t.dom.removeClass(e, s.visual_table_class); 6713 } 6714 6715 return; 6716 6717 case 'A': 6718 v = t.dom.getAttrib(e, 'name'); 6719 6720 if (v) { 6721 if (t.hasVisual) 6722 t.dom.addClass(e, 'mceItemAnchor'); 6723 else 6724 t.dom.removeClass(e, 'mceItemAnchor'); 6725 } 6726 6727 return; 6728 } 6729 }); 6730 6731 t.onVisualAid.dispatch(t, e, t.hasVisual); 6732 }, 6733 6734 // Internal functions 6735 6736 _addEvents : function() { 6737 // 'focus', 'blur', 'dblclick', 'beforedeactivate', submit, reset 6738 var t = this, i, s = t.settings, lo = { 6739 mouseup : 'onMouseUp', 6740 mousedown : 'onMouseDown', 6741 click : 'onClick', 6742 keyup : 'onKeyUp', 6743 keydown : 'onKeyDown', 6744 keypress : 'onKeyPress', 6745 submit : 'onSubmit', 6746 reset : 'onReset', 6747 contextmenu : 'onContextMenu', 6748 dblclick : 'onDblClick', 6749 paste : 'onPaste' // Doesn't work in all browsers yet 6750 }; 6751 6752 function eventHandler(e, o) { 6753 var ty = e.type; 6754 6755 // Don't fire events when it's removed 6756 if (t.removed) 6757 return; 6758 6759 // Generic event handler 6760 if (t.onEvent.dispatch(t, e, o) !== false) { 6761 // Specific event handler 6762 t[lo[e.fakeType || e.type]].dispatch(t, e, o); 6763 } 6764 }; 6765 6766 // Add DOM events 6767 each(lo, function(v, k) { 6768 switch (k) { 6769 case 'contextmenu': 6770 if (tinymce.isOpera) { 6771 // Fake contextmenu on Opera 6772 Event.add(t.getDoc(), 'mousedown', function(e) { 6773 if (e.ctrlKey) { 6774 e.fakeType = 'contextmenu'; 6775 eventHandler(e); 6776 } 6777 }); 6778 } else 6779 Event.add(t.getDoc(), k, eventHandler); 6780 break; 6781 6782 case 'paste': 6783 Event.add(t.getBody(), k, function(e) { 6784 var tx, h, el, r; 6785 6786 // Get plain text data 6787 if (e.clipboardData) 6788 tx = e.clipboardData.getData('text/plain'); 6789 else if (tinymce.isIE) 6790 tx = t.getWin().clipboardData.getData('Text'); 6791 6792 // Get HTML data 6793 /*if (tinymce.isIE) { 6794 el = DOM.add(document.body, 'div', {style : 'visibility:hidden;overflow:hidden;position:absolute;width:1px;height:1px'}); 6795 r = document.body.createTextRange(); 6796 r.moveToElementText(el); 6797 r.execCommand('Paste'); 6798 h = el.innerHTML; 6799 DOM.remove(el); 6800 }*/ 6801 6802 eventHandler(e, {text : tx, html : h}); 6803 }); 6804 break; 6805 6806 case 'submit': 6807 case 'reset': 6808 Event.add(t.getElement().form || DOM.getParent(t.id, 'form'), k, eventHandler); 6809 break; 6810 6811 default: 6812 Event.add(s.content_editable ? t.getBody() : t.getDoc(), k, eventHandler); 6813 } 6814 }); 6815 6816 Event.add(s.content_editable ? t.getBody() : (isGecko ? t.getDoc() : t.getWin()), 'focus', function(e) { 6817 t.focus(true); 6818 }); 6819 6820 // Fixes bug where a specified document_base_uri could result in broken images 6821 // This will also fix drag drop of images in Gecko 6822 if (tinymce.isGecko) { 6823 // Convert all images to absolute URLs 6824 /* t.onSetContent.add(function(ed, o) { 6825 each(ed.dom.select('img'), function(e) { 6826 var v; 6827 6828 if (v = e.getAttribute('mce_src')) 6829 e.src = t.documentBaseURI.toAbsolute(v); 6830 }) 6831 });*/ 6832 6833 Event.add(t.getDoc(), 'DOMNodeInserted', function(e) { 6834 var v; 6835 6836 e = e.target; 6837 6838 if (e.nodeType === 1 && e.nodeName === 'IMG' && (v = e.getAttribute('mce_src'))) 6839 e.src = t.documentBaseURI.toAbsolute(v); 6840 }); 6841 } 6842 6843 // Set various midas options in Gecko 6844 if (isGecko) { 6845 function setOpts() { 6846 var t = this, d = t.getDoc(), s = t.settings; 6847 6848 if (isGecko) { 6849 if (t._isHidden()) { 6850 try { 6851 d.designMode = 'On'; 6852 } catch (ex) { 6853 // Fails if it's hidden 6854 } 6855 } 6856 6857 try { 6858 // Try new Gecko method 6859 d.execCommand("styleWithCSS", 0, false); 6860 } catch (ex) { 6861 // Use old method 6862 if (!t._isHidden()) 6863 d.execCommand("useCSS", 0, true); 6864 } 6865 6866 if (!s.table_inline_editing) 6867 try {d.execCommand('enableInlineTableEditing', false, false);} catch (ex) {} 6868 6869 if (!s.object_resizing) 6870 try {d.execCommand('enableObjectResizing', false, false);} catch (ex) {} 6871 } 6872 }; 6873 6874 t.onBeforeExecCommand.add(setOpts); 6875 t.onMouseDown.add(setOpts); 6876 } 6877 6878 // Add node change handlers 6879 t.onMouseUp.add(t.nodeChanged); 6880 t.onClick.add(t.nodeChanged); 6881 t.onKeyUp.add(function(ed, e) { 6882 if ((e.keyCode >= 33 && e.keyCode <= 36) || (e.keyCode >= 37 && e.keyCode <= 40) || e.keyCode == 13 || e.keyCode == 45 || e.keyCode == 46 || e.keyCode == 8 || e.ctrlKey) 6883 t.nodeChanged(); 6884 }); 6885 6886 // Add reset handler 6887 t.onReset.add(function() { 6888 t.setContent(t.startContent, {format : 'raw'}); 6889 }); 6890 6891 if (t.getParam('tab_focus')) { 6892 function tabCancel(ed, e) { 6893 if (e.keyCode === 9) 6894 return Event.cancel(e); 6895 }; 6896 6897 function tabHandler(ed, e) { 6898 var v, f, el; 6899 6900 if (e.keyCode === 9) { 6901 v = ed.getParam('tab_focus'); 6902 6903 if (v == ':next') { 6904 f = DOM.getParent(ed.id, 'form'); 6905 6906 if (f) { 6907 each(f.elements, function(e, i) { 6908 if (e.id == ed.id) 6909 el = f.elements[i + 1]; 6910 }); 6911 } 6912 } else 6913 el = DOM.get(v); 6914 6915 if (el) { 6916 window.setTimeout(function() {window.focus();el.focus();}, 10); 6917 return Event.cancel(e); 6918 } 6919 } 6920 }; 6921 6922 t.onKeyUp.add(tabCancel); 6923 6924 if (isGecko) { 6925 t.onKeyPress.add(tabHandler); 6926 t.onKeyDown.add(tabCancel); 6927 } else 6928 t.onKeyDown.add(tabHandler); 6929 } 6930 6931 // Add shortcuts 6932 if (s.custom_shortcuts) { 6933 if (s.custom_undo_redo_keyboard_shortcuts) { 6934 t.addShortcut('ctrl+z', t.getLang('undo_desc'), 'Undo'); 6935 t.addShortcut('ctrl+y', t.getLang('redo_desc'), 'Redo'); 6936 } 6937 6938 // Add default shortcuts for gecko 6939 if (isGecko) { 6940 t.addShortcut('ctrl+b', t.getLang('bold_desc'), 'Bold'); 6941 t.addShortcut('ctrl+i', t.getLang('italic_desc'), 'Italic'); 6942 t.addShortcut('ctrl+u', t.getLang('underline_desc'), 'Underline'); 6943 } 6944 6945 // BlockFormat shortcuts keys 6946 for (i=1; i<=6; i++) 6947 t.addShortcut('ctrl+' + i, '', ['FormatBlock', false, '<h' + i + '>']); 6948 6949 t.addShortcut('ctrl+7', '', ['FormatBlock', false, '<p>']); 6950 t.addShortcut('ctrl+8', '', ['FormatBlock', false, '<div>']); 6951 t.addShortcut('ctrl+9', '', ['FormatBlock', false, '<address>']); 6952 6953 function find(e) { 6954 var v = null; 6955 6956 if (!e.altKey && !e.ctrlKey && !e.metaKey) 6957 return v; 6958 6959 each(t.shortcuts, function(o) { 6960 if (o.ctrl != e.ctrlKey && (!tinymce.isMac || o.ctrl == e.metaKey)) 6961 return; 6962 6963 if (o.alt != e.altKey) 6964 return; 6965 6966 if (o.shift != e.shiftKey) 6967 return; 6968 6969 if (e.keyCode == o.keyCode || (e.charCode && e.charCode == o.charCode)) { 6970 v = o; 6971 return false; 6972 } 6973 }); 6974 6975 return v; 6976 }; 6977 6978 t.onKeyUp.add(function(ed, e) { 6979 var o = find(e); 6980 6981 if (o) 6982 return Event.cancel(e); 6983 }); 6984 6985 t.onKeyPress.add(function(ed, e) { 6986 var o = find(e); 6987 6988 if (o) 6989 return Event.cancel(e); 6990 }); 6991 6992 t.onKeyDown.add(function(ed, e) { 6993 var o = find(e); 6994 6995 if (o) { 6996 o.func.call(o.scope); 6997 return Event.cancel(e); 6998 } 6999 }); 7000 } 7001 7002 if (tinymce.isIE) { 7003 // Fix so resize will only update the width and height attributes not the styles of an image 7004 // It will also block mceItemNoResize items 7005 Event.add(t.getDoc(), 'controlselect', function(e) { 7006 var re = t.resizeInfo, cb; 7007 7008 e = e.target; 7009 7010 if (re) 7011 Event.remove(re.node, re.ev, re.cb); 7012 7013 if (!t.dom.hasClass(e, 'mceItemNoResize')) { 7014 ev = 'resizeend'; 7015 cb = Event.add(e, ev, function(e) { 7016 var v; 7017 7018 e = e.target; 7019 7020 if (v = t.dom.getStyle(e, 'width')) { 7021 t.dom.setAttrib(e, 'width', v.replace(/[^0-9%]+/g, '')); 7022 t.dom.setStyle(e, 'width', ''); 7023 } 7024 7025 if (v = t.dom.getStyle(e, 'height')) { 7026 t.dom.setAttrib(e, 'height', v.replace(/[^0-9%]+/g, '')); 7027 t.dom.setStyle(e, 'height', ''); 7028 } 7029 }); 7030 } else { 7031 ev = 'resizestart'; 7032 cb = Event.add(e, 'resizestart', Event.cancel, Event); 7033 } 7034 7035 re = t.resizeInfo = { 7036 node : e, 7037 ev : ev, 7038 cb : cb 7039 }; 7040 }); 7041 7042 t.onKeyDown.add(function(ed, e) { 7043 switch (e.keyCode) { 7044 case 8: 7045 // Fix IE control + backspace browser bug 7046 if (t.selection.getRng().item) { 7047 t.selection.getRng().item(0).removeNode(); 7048 return Event.cancel(e); 7049 } 7050 } 7051 }); 7052 } 7053 7054 if (tinymce.isOpera) { 7055 t.onClick.add(function(ed, e) { 7056 Event.prevent(e); 7057 }); 7058 } 7059 7060 // Add custom undo/redo handlers 7061 if (s.custom_undo_redo) { 7062 function addUndo() { 7063 t.undoManager.typing = 0; 7064 t.undoManager.add(); 7065 }; 7066 7067 // Add undo level on editor blur 7068 if (tinymce.isIE) { 7069 Event.add(t.getWin(), 'blur', function(e) { 7070 var n; 7071 7072 // Check added for fullscreen bug 7073 if (t.selection) { 7074 n = t.selection.getNode(); 7075 7076 // Add undo level is selection was lost to another document 7077 if (!t.removed && n.ownerDocument && n.ownerDocument != t.getDoc()) 7078 addUndo(); 7079 } 7080 }); 7081 } else { 7082 Event.add(t.getDoc(), 'blur', function() { 7083 if (t.selection && !t.removed) 7084 addUndo(); 7085 }); 7086 } 7087 7088 t.onMouseDown.add(addUndo); 7089 7090 t.onKeyUp.add(function(ed, e) { 7091 if ((e.keyCode >= 33 && e.keyCode <= 36) || (e.keyCode >= 37 && e.keyCode <= 40) || e.keyCode == 13 || e.keyCode == 45 || e.ctrlKey) { 7092 t.undoManager.typing = 0; 7093 t.undoManager.add(); 7094 } 7095 }); 7096 7097 t.onKeyDown.add(function(ed, e) { 7098 // Is caracter positon keys 7099 if ((e.keyCode >= 33 && e.keyCode <= 36) || (e.keyCode >= 37 && e.keyCode <= 40) || e.keyCode == 13 || e.keyCode == 45) { 7100 if (t.undoManager.typing) { 7101 t.undoManager.add(); 7102 t.undoManager.typing = 0; 7103 } 7104 7105 return; 7106 } 7107 7108 if (!t.undoManager.typing) { 7109 t.undoManager.add(); 7110 t.undoManager.typing = 1; 7111 } 7112 }); 7113 } 7114 }, 7115 7116 _destroy : function() { 7117 var t = this; 7118 7119 if (t.formElement) { 7120 t.formElement.submit = t.formElement._mceOldSubmit; 7121 t.formElement._mceOldSubmit = null; 7122 } 7123 7124 t.contentAreaContainer = t.formElement = t.container = t.contentDocument = t.contentWindow = null; 7125 7126 if (t.selection) 7127 t.selection = t.selection.win = t.selection.dom = t.selection.dom.doc = null; 7128 7129 t.destroyed = 1; 7130 }, 7131 7132 _convertInlineElements : function() { 7133 var t = this, s = t.settings, dom = t.dom; 7134 7135 function convert(ed, o) { 7136 if (!s.inline_styles) 7137 return; 7138 7139 if (o.get) { 7140 each(t.dom.select('table,u,strike', o.node), function(n) { 7141 switch (n.nodeName) { 7142 case 'TABLE': 7143 if (v = dom.getAttrib(n, 'height')) { 7144 dom.setStyle(n, 'height', v); 7145 dom.setAttrib(n, 'height', ''); 7146 } 7147 break; 7148 7149 case 'U': 7150 dom.replace(dom.create('span', {style : 'text-decoration: underline;'}), n, 1); 7151 break; 7152 7153 case 'STRIKE': 7154 dom.replace(dom.create('span', {style : 'text-decoration: line-through;'}), n, 1); 7155 break; 7156 } 7157 }); 7158 } else if (o.set) { 7159 each(t.dom.select('table,span', o.node), function(n) { 7160 if (n.nodeName == 'TABLE') { 7161 if (v = dom.getStyle(n, 'height')) 7162 dom.setAttrib(n, 'height', v.replace(/[^0-9%]+/g, '')); 7163 } else { 7164 // Convert spans to elements 7165 if (n.style.textDecoration == 'underline') 7166 dom.replace(dom.create('u'), n, 1); 7167 else if (n.style.textDecoration == 'line-through') 7168 dom.replace(dom.create('strike'), n, 1); 7169 } 7170 }); 7171 } 7172 }; 7173 7174 t.onPreProcess.add(convert); 7175 7176 if (!s.cleanup_on_startup) { 7177 t.onInit.add(function() { 7178 convert(t, {node : t.getBody(), set : 1}); 7179 }); 7180 } 7181 }, 7182 7183 _convertFonts : function() { 7184 var t = this, s = t.settings, dom = t.dom, sl, cl, fz, fzn, v, i; 7185 7186 // Font pt values and font size names 7187 fz = [8, 10, 12, 14, 18, 24, 36]; 7188 fzn = ['xx-small', 'x-small','small','medium','large','x-large', 'xx-large']; 7189 7190 if (sl = s.font_size_style_values) 7191 sl = sl.split(','); 7192 7193 if (cl = s.font_size_classes) 7194 cl = cl.split(','); 7195 7196 t.onPreProcess.add(function(ed, o) { 7197 if (!s.inline_styles) 7198 return; 7199 7200 if (o.set) { 7201 // Convert spans to fonts on non WebKit browsers 7202 if (tinymce.isWebKit) 7203 return; 7204 7205 each(t.dom.select('span', o.node), function(n) { 7206 var f = dom.create('font', { 7207 color : dom.toHex(dom.getStyle(n, 'color')), 7208 face : dom.getStyle(n, 'fontFamily') 7209 }); 7210 7211 if (sl) { 7212 i = inArray(sl, dom.getStyle(n, 'fontSize')); 7213 7214 if (i != -1) 7215 dom.setAttrib(f, 'size', '' + (i + 1 || 1)); 7216 } else if (cl) { 7217 i = inArray(cl, dom.getAttrib(n, 'class')); 7218 7219 v = dom.getStyle(n, 'fontSize'); 7220 7221 if (i == -1 && v.indexOf('pt') > 0) 7222 i = inArray(fz, parseInt(v)); 7223 7224 if (i == -1) 7225 i = inArray(fzn, v); 7226 7227 if (i != -1) 7228 dom.setAttrib(f, 'size', '' + (i + 1 || 1)); 7229 } 7230 7231 if (f.color || f.face || f.size) 7232 dom.replace(f, n, 1); 7233 }); 7234 } else if (o.get) { 7235 each(t.dom.select('font', o.node), function(n) { 7236 var sp = dom.create('span', { 7237 style : { 7238 fontFamily : dom.getAttrib(n, 'face'), 7239 color : dom.getAttrib(n, 'color'), 7240 backgroundColor : n.style.backgroundColor 7241 } 7242 }); 7243 7244 if (n.size) { 7245 if (sl) 7246 dom.setStyle(sp, 'fontSize', sl[parseInt(n.size) - 1]); 7247 else 7248 dom.setAttrib(sp, 'class', cl[parseInt(n.size) - 1]); 7249 } 7250 7251 dom.replace(sp, n, 1); 7252 }); 7253 } 7254 }); 7255 }, 7256 7257 _isHidden : function() { 7258 var s; 7259 7260 if (!isGecko) 7261 return 0; 7262 7263 // Weird, wheres that cursor selection? 7264 s = this.selection.getSel(); 7265 return (!s || !s.rangeCount || s.rangeCount == 0); 7266 }, 7267 7268 _fixNesting : function(s) { 7269 var d = [], i; 7270 7271 s = s.replace(/<(\/)?([^\s>]+)[^>]*?>/g, function(a, b, c) { 7272 var e; 7273 7274 // Handle end element 7275 if (b === '/') { 7276 if (!d.length) 7277 return ''; 7278 7279 if (c !== d[d.length - 1].tag) { 7280 for (i=d.length - 1; i>=0; i--) { 7281 if (d[i].tag === c) { 7282 d[i].close = 1; 7283 break; 7284 } 7285 } 7286 7287 return ''; 7288 } else { 7289 d.pop(); 7290 7291 if (d.length && d[d.length - 1].close) { 7292 a = a + '</' + d[d.length - 1].tag + '>'; 7293 d.pop(); 7294 } 7295 } 7296 } else { 7297 // Ignore these 7298 if (/^(br|hr|input|meta|img|link|param)$/i.test(c)) 7299 return a; 7300 7301 // Ignore closed ones 7302 if (/\/>$/.test(a)) 7303 return a; 7304 7305 d.push({tag : c}); // Push start element 7306 } 7307 7308 return a; 7309 }); 7310 7311 // End all open tags 7312 for (i=d.length - 1; i>=0; i--) 7313 s += '</' + d[i].tag + '>'; 7314 7315 return s; 7316 } 7317 7318 }); 7319 })(); 7320 7321 /* file:jscripts/tiny_mce/classes/EditorCommands.js */ 7322 7323 (function() { 7324 var each = tinymce.each, isIE = tinymce.isIE, isGecko = tinymce.isGecko, isOpera = tinymce.isOpera, isWebKit = tinymce.isWebKit; 7325 7326 tinymce.create('tinymce.EditorCommands', { 7327 EditorCommands : function(ed) { 7328 this.editor = ed; 7329 }, 7330 7331 execCommand : function(cmd, ui, val) { 7332 var t = this, ed = t.editor, f; 7333 7334 switch (cmd) { 7335 case 'Cut': 7336 case 'Copy': 7337 case 'Paste': 7338 try { 7339 ed.getDoc().execCommand(cmd, ui, val); 7340 } catch (ex) { 7341 if (isGecko) { 7342 ed.windowManager.confirm(ed.getLang('clipboard_msg'), function(s) { 7343 if (s) 7344 window.open('http://www.mozilla.org/editor/midasdemo/securityprefs.html', 'mceExternal'); 7345 }); 7346 } else 7347 ed.windowManager.alert(ed.getLang('clipboard_no_support')); 7348 } 7349 7350 return true; 7351 7352 // Ignore these 7353 case 'mceResetDesignMode': 7354 case 'mceBeginUndoLevel': 7355 return true; 7356 7357 // Ignore these 7358 case 'unlink': 7359 t.UnLink(); 7360 return true; 7361 7362 // Bundle these together 7363 case 'JustifyLeft': 7364 case 'JustifyCenter': 7365 case 'JustifyRight': 7366 case 'JustifyFull': 7367 t.mceJustify(cmd, cmd.substring(7).toLowerCase()); 7368 return true; 7369 7370 case 'mceEndUndoLevel': 7371 case 'mceAddUndoLevel': 7372 ed.undoManager.add(); 7373 return true; 7374 7375 default: 7376 f = this[cmd]; 7377 7378 if (f) { 7379 f.call(this, ui, val); 7380 return true; 7381 } 7382 } 7383 7384 return false; 7385 }, 7386 7387 Indent : function() { 7388 var ed = this.editor, d = ed.dom, s = ed.selection, e, iv, iu; 7389 7390 // Setup indent level 7391 iv = ed.settings.indentation; 7392 iu = /[a-z%]+$/i.exec(iv); 7393 iv = parseInt(iv); 7394 7395 if (ed.settings.inline_styles && (!this.queryStateInsertUnorderedList() && !this.queryStateInsertOrderedList())) { 7396 each(this._getSelectedBlocks(), function(e) { 7397 d.setStyle(e, 'paddingLeft', (parseInt(e.style.paddingLeft || 0) + iv) + iu); 7398 }); 7399 7400 return; 7401 } 7402 7403 ed.getDoc().execCommand('Indent', false, null); 7404 7405 if (isIE) { 7406 d.getParent(s.getNode(), function(n) { 7407 if (n.nodeName == 'BLOCKQUOTE') { 7408 n.dir = n.style.cssText = ''; 7409 } 7410 }); 7411 } 7412 }, 7413 7414 Outdent : function() { 7415 var ed = this.editor, d = ed.dom, s = ed.selection, e, v, iv, iu; 7416 7417 // Setup indent level 7418 iv = ed.settings.indentation; 7419 iu = /[a-z%]+$/i.exec(iv); 7420 iv = parseInt(iv); 7421 7422 if (ed.settings.inline_styles && (!this.queryStateInsertUnorderedList() && !this.queryStateInsertOrderedList())) { 7423 each(this._getSelectedBlocks(), function(e) { 7424 v = Math.max(0, parseInt(e.style.paddingLeft || 0) - iv); 7425 d.setStyle(e, 'paddingLeft', v ? v + iu : ''); 7426 }); 7427 7428 return; 7429 } 7430 7431 ed.getDoc().execCommand('Outdent', false, null); 7432 }, 7433 7434 mceSetAttribute : function(u, v) { 7435 var ed = this.editor, d = ed.dom, e; 7436 7437 if (e = d.getParent(ed.selection.getNode(), d.isBlock)) 7438 d.setAttrib(e, v.name, v.value); 7439 }, 7440 7441 mceSetContent : function(u, v) { 7442 this.editor.setContent(v); 7443 }, 7444 7445 mceToggleVisualAid : function() { 7446 var ed = this.editor; 7447 7448 ed.hasVisual = !ed.hasVisual; 7449 ed.addVisual(); 7450 }, 7451 7452 mceReplaceContent : function(u, v) { 7453 var s = this.editor.selection; 7454 7455 s.setContent(v.replace(/\{\$selection\}/g, s.getContent({format : 'text'}))); 7456 }, 7457 7458 mceInsertLink : function(u, v) { 7459 var ed = this.editor, e = ed.dom.getParent(ed.selection.getNode(), 'A'); 7460 7461 if (tinymce.is(v, 'string')) 7462 v = {href : v}; 7463 7464 function set(e) { 7465 each(v, function(v, k) { 7466 ed.dom.setAttrib(e, k, v); 7467 }); 7468 }; 7469 7470 if (!e) { 7471 ed.execCommand('CreateLink', false, 'javascript:mctmp(0);'); 7472 each(ed.dom.select('a'), function(e) { 7473 if (e.href == 'javascript:mctmp(0);') 7474 set(e); 7475 }); 7476 } else { 7477 if (v.href) 7478 set(e); 7479 else 7480 ed.dom.remove(e, 1); 7481 } 7482 }, 7483 7484 UnLink : function() { 7485 var ed = this.editor, s = ed.selection; 7486 7487 if (s.isCollapsed()) 7488 s.select(s.getNode()); 7489 7490 ed.getDoc().execCommand('unlink', false, null); 7491 s.collapse(0); 7492 }, 7493 7494 FontName : function(u, v) { 7495 var t = this, ed = t.editor, s = ed.selection, e; 7496 7497 if (!v) { 7498 if (s.isCollapsed()) 7499 s.select(s.getNode()); 7500 7501 t.RemoveFormat(); 7502 } else 7503 ed.getDoc().execCommand('FontName', false, v); 7504 }, 7505 7506 queryCommandValue : function(c) { 7507 var f = this['queryValue' + c]; 7508 7509 if (f) 7510 return f.call(this, c); 7511 7512 return false; 7513 }, 7514 7515 queryCommandState : function(cmd) { 7516 var f; 7517 7518 switch (cmd) { 7519 // Bundle these together 7520 case 'JustifyLeft': 7521 case 'JustifyCenter': 7522 case 'JustifyRight': 7523 case 'JustifyFull': 7524 return this.queryStateJustify(cmd, cmd.substring(7).toLowerCase()); 7525 7526 default: 7527 if (f = this['queryState' + cmd]) 7528 return f.call(this, cmd); 7529 } 7530 7531 return -1; 7532 }, 7533 7534 queryValueFontSize : function() { 7535 var ed = this.editor, v = 0, p; 7536 7537 if (isOpera || isWebKit) { 7538 if (p = ed.dom.getParent(ed.selection.getNode(), 'FONT')) 7539 v = p.size; 7540 7541 return v; 7542 } 7543 7544 return ed.getDoc().queryCommandValue('FontSize'); 7545 }, 7546 7547 queryValueFontName : function() { 7548 var ed = this.editor, v = 0, p; 7549 7550 if (p = ed.dom.getParent(ed.selection.getNode(), 'FONT')) 7551 v = p.face; 7552 7553 if (!v) 7554 v = ed.getDoc().queryCommandValue('FontName'); 7555 7556 return v; 7557 }, 7558 7559 mceJustify : function(c, v) { 7560 var ed = this.editor, se = ed.selection, n = se.getNode(), nn = n.nodeName, bl, nb, dom = ed.dom, rm; 7561 7562 if (ed.settings.inline_styles && this.queryStateJustify(c, v)) 7563 rm = 1; 7564 7565 bl = dom.getParent(n, ed.dom.isBlock); 7566 7567 if (nn == 'IMG') { 7568 if (v == 'full') 7569 return; 7570 7571 if (rm) { 7572 dom.setStyle(n, 'float', ''); 7573 this.mceRepaint(); 7574 return; 7575 } 7576 7577 if (v == 'center') { 7578 if (!bl || bl.childNodes.length > 1) { 7579 nb = dom.create('p'); 7580 nb.appendChild(n.cloneNode(false)); 7581 7582 if (bl) 7583 dom.insertAfter(nb, bl); 7584 else 7585 dom.insertAfter(nb, n); 7586 7587 dom.remove(n); 7588 n = nb.firstChild; 7589 bl = nb; 7590 } 7591 7592 dom.setStyle(bl, 'textAlign', v); 7593 dom.setStyle(n, 'float', ''); 7594 } else 7595 dom.setStyle(n, 'float', v); 7596 7597 this.mceRepaint(); 7598 return; 7599 } 7600 7601 // Handle the alignment outselfs, less quirks in all browsers 7602 if (ed.settings.inline_styles && ed.settings.forced_root_block) { 7603 if (rm) 7604 v = ''; 7605 7606 each(this._getSelectedBlocks(dom.getParent(se.getStart(), dom.isBlock), dom.getParent(se.getEnd(), dom.isBlock)), function(e) { 7607 dom.setAttrib(e, 'align', ''); 7608 dom.setStyle(e, 'textAlign', v == 'full' ? 'justify' : v); 7609 }); 7610 7611 return; 7612 } else if (!rm) 7613 ed.getDoc().execCommand(c, false, null); 7614 7615 if (ed.settings.inline_styles) { 7616 if (rm) { 7617 dom.getParent(ed.selection.getNode(), function(n) { 7618 if (n.style && n.style.textAlign) 7619 dom.setStyle(n, 'textAlign', ''); 7620 }); 7621 7622 return; 7623 } 7624 7625 each(dom.select('*'), function(n) { 7626 var v = n.align; 7627 7628 if (v) { 7629 if (v == 'full') 7630 v = 'justify'; 7631 7632 dom.setStyle(n, 'textAlign', v); 7633 dom.setAttrib(n, 'align', ''); 7634 } 7635 }); 7636 } 7637 }, 7638 7639 mceSetCSSClass : function(u, v) { 7640 this.mceSetStyleInfo(0, {command : 'setattrib', name : 'class', value : v}); 7641 }, 7642 7643 getSelectedElement : function() { 7644 var t = this, ed = t.editor, dom = ed.dom, se = ed.selection, r = se.getRng(), r1, r2, sc, ec, so, eo, e, sp, ep, re; 7645 7646 if (se.isCollapsed() || r.item) 7647 return se.getNode(); 7648 7649 // Setup regexp 7650 re = ed.settings.merge_styles_invalid_parents; 7651 if (tinymce.is(re, 'string')) 7652 re = new RegExp(re, 'i'); 7653 7654 if (isIE) { 7655 r1 = r.duplicate(); 7656 r1.collapse(true); 7657 sc = r1.parentElement(); 7658 7659 r2 = r.duplicate(); 7660 r2.collapse(false); 7661 ec = r2.parentElement(); 7662 7663 if (sc != ec) { 7664 r1.move('character', 1); 7665 sc = r1.parentElement(); 7666 } 7667 7668 if (sc == ec) { 7669 r1 = r.duplicate(); 7670 r1.moveToElementText(sc); 7671 7672 if (r1.compareEndPoints('StartToStart', r) == 0 && r1.compareEndPoints('EndToEnd', r) == 0) 7673 return re && re.test(sc.nodeName) ? null : sc; 7674 } 7675 } else { 7676 function getParent(n) { 7677 return dom.getParent(n, function(n) {return n.nodeType == 1;}); 7678 }; 7679 7680 sc = r.startContainer; 7681 ec = r.endContainer; 7682 so = r.startOffset; 7683 eo = r.endOffset; 7684 7685 if (!r.collapsed) { 7686 if (sc == ec) { 7687 if (so - eo < 2) { 7688 if (sc.hasChildNodes()) { 7689 sp = sc.childNodes[so]; 7690 return re && re.test(sp.nodeName) ? null : sp; 7691 } 7692 } 7693 } 7694 } 7695 7696 if (sc.nodeType != 3 || ec.nodeType != 3) 7697 return null; 7698 7699 if (so == 0) { 7700 sp = getParent(sc); 7701 7702 if (sp && sp.firstChild != sc) 7703 sp = null; 7704 } 7705 7706 if (so == sc.nodeValue.length) { 7707 e = sc.nextSibling; 7708 7709 if (e && e.nodeType == 1) 7710 sp = sc.nextSibling; 7711 } 7712 7713 if (eo == 0) { 7714 e = ec.previousSibling; 7715 7716 if (e && e.nodeType == 1) 7717 ep = e; 7718 } 7719 7720 if (eo == ec.nodeValue.length) { 7721 ep = getParent(ec); 7722 7723 if (ep && ep.lastChild != ec) 7724 ep = null; 7725 } 7726 7727 // Same element 7728 if (sp == ep) 7729 return re && sp && re.test(sp.nodeName) ? null : sp; 7730 } 7731 7732 return null; 7733 }, 7734 7735 InsertHorizontalRule : function() { 7736 // Fix for Gecko <hr size="1" /> issue and IE bug rep(/<a.*?href=\"(.*?)\".*?>(.*?)<\/a>/gi,"[url=$1]$2[/url]"); 7737 if (isGecko || isIE) 7738 this.editor.selection.setContent('<hr />'); 7739 else 7740 this.editor.getDoc().execCommand('InsertHorizontalRule', false, ''); 7741 }, 7742 7743 RemoveFormat : function() { 7744 var t = this, ed = t.editor, s = ed.selection, b; 7745 7746 // Safari breaks tables 7747 if (isWebKit) 7748 s.setContent(s.getContent({format : 'raw'}).replace(/(<(span|b|i|strong|em|strike) [^>]+>|<(span|b|i|strong|em|strike)>|<\/(span|b|i|strong|em|strike)>|)/g, ''), {format : 'raw'}); 7749 else 7750 ed.getDoc().execCommand('RemoveFormat', false, null); 7751 7752 t.mceSetStyleInfo(0, {command : 'removeformat'}); 7753 ed.addVisual(); 7754 }, 7755 7756 mceSetStyleInfo : function(u, v) { 7757 var t = this, ed = t.editor, d = ed.getDoc(), dom = ed.dom, e, b, s = ed.selection, nn = v.wrapper || 'span', b = s.getBookmark(), re; 7758 7759 function set(n, e) { 7760 if (n.nodeType == 1) { 7761 switch (v.command) { 7762 case 'setattrib': 7763 return dom.setAttrib(n, v.name, v.value); 7764 7765 case 'setstyle': 7766 return dom.setStyle(n, v.name, v.value); 7767 7768 case 'removeformat': 7769 return dom.setAttrib(n, 'class', ''); 7770 } 7771 } 7772 }; 7773 7774 // Setup regexp 7775 re = ed.settings.merge_styles_invalid_parents; 7776 if (tinymce.is(re, 'string')) 7777 re = new RegExp(re, 'i'); 7778 7779 // Set style info on selected element 7780 if (e = t.getSelectedElement()) 7781 set(e, 1); 7782 else { 7783 // Generate wrappers and set styles on them 7784 d.execCommand('FontName', false, '__'); 7785 each(isWebKit ? dom.select('span') : dom.select('font'), function(n) { 7786 var sp, e; 7787 7788 if (dom.getAttrib(n, 'face') == '__' || n.style.fontFamily === '__') { 7789 sp = dom.create(nn, {mce_new : '1'}); 7790 7791 set(sp); 7792 7793 each (n.childNodes, function(n) { 7794 sp.appendChild(n.cloneNode(true)); 7795 }); 7796 7797 dom.replace(sp, n); 7798 } 7799 }); 7800 } 7801 7802 // Remove wrappers inside new ones 7803 each(dom.select(nn).reverse(), function(n) { 7804 var p = n.parentNode; 7805 7806 dom.setAttrib(n, 'mce_new', ''); 7807 7808 // Check if it's an old span in a new wrapper 7809 if (!dom.getAttrib(n, 'mce_new')) { 7810 // Find new wrapper 7811 p = dom.getParent(n, function(n) { 7812 return n.nodeType == 1 && dom.getAttrib(n, 'mce_new'); 7813 }); 7814 7815 if (p) 7816 dom.remove(n, 1); 7817 } 7818 }); 7819 7820 // Merge wrappers with parent wrappers 7821 each(dom.select(nn).reverse(), function(n) { 7822 var p = n.parentNode; 7823 7824 if (!p) 7825 return; 7826 7827 // Has parent of the same type and only child 7828 if (p.nodeName == nn.toUpperCase() && p.childNodes.length == 1) 7829 return dom.remove(p, 1); 7830 7831 // Has parent that is more suitable to have the class and only child 7832 if (n.nodeType == 1 && (!re || !re.test(p.nodeName)) && p.childNodes.length == 1) { 7833 set(p); // Set style info on parent instead 7834 dom.setAttrib(n, 'class', ''); 7835 } 7836 }); 7837 7838 // Remove empty wrappers 7839 each(dom.select(nn).reverse(), function(n) { 7840 if (!dom.getAttrib(n, 'class') && !dom.getAttrib(n, 'style')) 7841 return dom.remove(n, 1); 7842 }); 7843 7844 s.moveToBookmark(b); 7845 }, 7846 7847 queryStateJustify : function(c, v) { 7848 var ed = this.editor, n = ed.selection.getNode(), dom = ed.dom; 7849 7850 if (n && n.nodeName == 'IMG') 7851 return dom.getStyle(n, 'float') == v; 7852 7853 n = dom.getParent(ed.selection.getStart(), function(n) { 7854 return n.nodeType == 1 && n.style.textAlign; 7855 }); 7856 7857 if (v == 'full') 7858 v = 'justify'; 7859 7860 if (ed.settings.inline_styles) 7861 return (n && n.style.textAlign == v); 7862 7863 return ed.getDoc().queryCommandState(c); 7864 }, 7865 7866 HiliteColor : function(ui, val) { 7867 var t = this, ed = t.editor, d = ed.getDoc(); 7868 7869 function set(s) { 7870 if (!isGecko) 7871 return; 7872 7873 try { 7874 // Try new Gecko method 7875 d.execCommand("styleWithCSS", 0, s); 7876 } catch (ex) { 7877 // Use old 7878 d.execCommand("useCSS", 0, !s); 7879 } 7880 }; 7881 7882 if (isGecko || isOpera) { 7883 set(true); 7884 d.execCommand('hilitecolor', false, val); 7885 set(false); 7886 } else 7887 d.execCommand('BackColor', false, val); 7888 }, 7889 7890 Undo : function() { 7891 var ed = this.editor; 7892 7893 if (ed.settings.custom_undo_redo) { 7894 ed.undoManager.undo(); 7895 ed.nodeChanged(); 7896 } else 7897 ed.getDoc().execCommand('Undo', false, null); 7898 }, 7899 7900 Redo : function() { 7901 var ed = this.editor; 7902 7903 if (ed.settings.custom_undo_redo) { 7904 ed.undoManager.redo(); 7905 ed.nodeChanged(); 7906 } else 7907 ed.getDoc().execCommand('Redo', false, null); 7908 }, 7909 7910 FormatBlock : function(ui, val) { 7911 var t = this, ed = t.editor; 7912 7913 val = ed.settings.forced_root_block ? (val || '<p>') : val; 7914 t.mceRemoveNode(); 7915 7916 if (val.indexOf('<') == -1) 7917 val = '<' + val + '>'; 7918 7919 if (tinymce.isGecko) 7920 val = val.replace(/<(div|blockquote|code|dt|dd|dl|samp)>/gi, '$1'); 7921 7922 ed.getDoc().execCommand('FormatBlock', false, val); 7923 }, 7924 7925 mceCleanup : function() { 7926 var ed = this.editor, s = ed.selection, b = s.getBookmark(); 7927 ed.setContent(ed.getContent()); 7928 s.moveToBookmark(b); 7929 }, 7930 7931 mceRemoveNode : function(ui, val) { 7932 var ed = this.editor, s = ed.selection, b, n = val || s.getNode(); 7933 7934 // Make sure that the body node isn't removed 7935 if (n == ed.getBody()) 7936 return; 7937 7938 b = s.getBookmark(); 7939 ed.dom.remove(n, 1); 7940 s.moveToBookmark(b); 7941 ed.nodeChanged(); 7942 }, 7943 7944 mceSelectNodeDepth : function(ui, val) { 7945 var ed = this.editor, s = ed.selection, c = 0; 7946 7947 ed.dom.getParent(s.getNode(), function(n) { 7948 if (n.nodeType == 1 && c++ == val) { 7949 s.select(n); 7950 ed.nodeChanged(); 7951 return false; 7952 } 7953 }, ed.getBody()); 7954 }, 7955 7956 mceSelectNode : function(u, v) { 7957 this.editor.selection.select(v); 7958 }, 7959 7960 mceInsertContent : function(ui, val) { 7961 this.editor.selection.setContent(val); 7962 }, 7963 7964 mceInsertRawHTML : function(ui, val) { 7965 var ed = this.editor; 7966 7967 ed.execCommand('mceInsertContent', false, 'tiny_mce_marker'); 7968 ed.setContent(ed.getContent().replace(/tiny_mce_marker/g, val)); 7969 }, 7970 7971 mceRepaint : function() { 7972 var s, b, e = this.editor; 7973 7974 if (tinymce.isGecko) { 7975 try { 7976 s = e.selection; 7977 b = s.getBookmark(true); 7978 7979 if (s.getSel()) 7980 s.getSel().selectAllChildren(e.getBody()); 7981 7982 s.collapse(true); 7983 s.moveToBookmark(b); 7984 } catch (ex) { 7985 // Ignore 7986 } 7987 } 7988 }, 7989 7990 queryStateUnderline : function() { 7991 var ed = this.editor, n; 7992 7993 if (n && n.nodeName == 'A') 7994 return false; 7995 7996 return ed.getDoc().queryCommandState('Underline'); 7997 }, 7998 7999 queryStateOutdent : function() { 8000 var ed = this.editor, n; 8001 8002 if (ed.settings.inline_styles) { 8003 if ((n = ed.dom.getParent(ed.selection.getStart(), ed.dom.isBlock)) && parseInt(n.style.paddingLeft) > 0) 8004 return true; 8005 8006 if ((n = ed.dom.getParent(ed.selection.getEnd(), ed.dom.isBlock)) && parseInt(n.style.paddingLeft) > 0) 8007 return true; 8008 } else 8009 return !!ed.dom.getParent(ed.selection.getNode(), 'BLOCKQUOTE'); 8010 8011 return this.queryStateInsertUnorderedList() || this.queryStateInsertOrderedList(); 8012 }, 8013 8014 queryStateInsertUnorderedList : function() { 8015 return this.editor.dom.getParent(this.editor.selection.getNode(), 'UL'); 8016 }, 8017 8018 queryStateInsertOrderedList : function() { 8019 return this.editor.dom.getParent(this.editor.selection.getNode(), 'OL'); 8020 }, 8021 8022 queryStatemceBlockQuote : function() { 8023 return !!this.editor.dom.getParent(this.editor.selection.getStart(), function(n) {return n.nodeName === 'BLOCKQUOTE';}); 8024 }, 8025 8026 mceBlockQuote : function() { 8027 var t = this, s = t.editor.selection, b = s.getBookmark(), bq, dom = t.editor.dom; 8028 8029 function findBQ(e) { 8030 return dom.getParent(e, function(n) {return n.nodeName === 'BLOCKQUOTE';}); 8031 }; 8032 8033 // Remove blockquote(s) 8034 if (findBQ(s.getStart())) { 8035 each(t._getSelectedBlocks(findBQ(s.getStart()), findBQ(s.getEnd())), function(e) { 8036 // Found BQ lets remove it 8037 if (e.nodeName == 'BLOCKQUOTE') 8038 dom.remove(e, 1); 8039 }); 8040 8041 t.editor.selection.moveToBookmark(b); 8042 return; 8043 } 8044 8045 each(t._getSelectedBlocks(findBQ(s.getStart()), findBQ(s.getEnd())), function(e) { 8046 var n; 8047 8048 // Found existing BQ add to this one 8049 if (e.nodeName == 'BLOCKQUOTE' && !bq) { 8050 bq = e; 8051 return; 8052 } 8053 8054 // No BQ found, create one 8055 if (!bq) { 8056 bq = dom.create('blockquote'); 8057 e.parentNode.insertBefore(bq, e); 8058 } 8059 8060 // Add children from existing BQ 8061 if (e.nodeName == 'BLOCKQUOTE' && bq) { 8062 n = e.firstChild; 8063 8064 while (n) { 8065 bq.appendChild(n.cloneNode(true)); 8066 n = n.nextSibling; 8067 } 8068 8069 dom.remove(e); 8070 8071 return; 8072 } 8073 8074 // Add non BQ element to BQ 8075 bq.appendChild(dom.remove(e)); 8076 }); 8077 8078 t.editor.selection.moveToBookmark(b); 8079 }, 8080 8081 _getSelectedBlocks : function(st, en) { 8082 var ed = this.editor, dom = ed.dom, s = ed.selection, sb, eb, n, bl = []; 8083 8084 sb = dom.getParent(st || s.getStart(), dom.isBlock); 8085 eb = dom.getParent(en || s.getEnd(), dom.isBlock); 8086 8087 if (sb) 8088 bl.push(sb); 8089 8090 if (sb && eb && sb != eb) { 8091 n = sb; 8092 8093 while ((n = n.nextSibling) && n != eb) { 8094 if (dom.isBlock(n)) 8095 bl.push(n); 8096 } 8097 } 8098 8099 if (eb && sb != eb) 8100 bl.push(eb); 8101 8102 return bl; 8103 } 8104 }); 8105 })(); 8106 8107 8108 /* file:jscripts/tiny_mce/classes/UndoManager.js */ 8109 8110 tinymce.create('tinymce.UndoManager', { 8111 index : 0, 8112 data : null, 8113 typing : 0, 8114 8115 UndoManager : function(ed) { 8116 var t = this, Dispatcher = tinymce.util.Dispatcher; 8117 8118 t.editor = ed; 8119 t.data = []; 8120 t.onAdd = new Dispatcher(this); 8121 t.onUndo = new Dispatcher(this); 8122 t.onRedo = new Dispatcher(this); 8123 }, 8124 8125 add : function(l) { 8126 var t = this, i, ed = t.editor, b, s = ed.settings, la; 8127 8128 l = l || {}; 8129 l.content = l.content || ed.getContent({format : 'raw', no_events : 1}); 8130 8131 // Add undo level if needed 8132 l.content = l.content.replace(/^\s*|\s*$/g, ''); 8133 la = t.data[t.index > 0 ? t.index - 1 : 0]; 8134 if (!l.initial && la && l.content == la.content) 8135 return null; 8136 8137 // Time to compress 8138 if (s.custom_undo_redo_levels) { 8139 if (t.data.length > s.custom_undo_redo_levels) { 8140 for (i = 0; i < t.data.length - 1; i++) 8141 t.data[i] = t.data[i + 1]; 8142 8143 t.data.length--; 8144 t.index = t.data.length; 8145 } 8146 } 8147 8148 if (s.custom_undo_redo_restore_selection) 8149 l.bookmark = b = l.bookmark || ed.selection.getBookmark(); 8150 8151 if (t.index < t.data.length && t.data[t.index].initial) 8152 t.index++; 8153 8154 // Add level 8155 t.data.length = t.index + 1; 8156 t.data[t.index++] = l; 8157 8158 if (l.initial) 8159 t.index = 0; 8160 8161 // Set initial bookmark use first real undo level 8162 if (t.data.length == 2 && t.data[0].initial) 8163 t.data[0].bookmark = b; 8164 8165 t.onAdd.dispatch(t, l); 8166 8167 //console.dir(t.data); 8168 8169 return l; 8170 }, 8171 8172 undo : function() { 8173 var t = this, ed = t.editor, l = l, i; 8174 8175 if (t.typing) { 8176 t.add(); 8177 t.typing = 0; 8178 } 8179 8180 if (t.index > 0) { 8181 // If undo on last index then take snapshot 8182 if (t.index == t.data.length && t.index > 1) { 8183 i = t.index; 8184 t.typing = 0; 8185 8186 if (!t.add()) 8187 t.index = i; 8188 8189 --t.index; 8190 } 8191 8192 l = t.data[--t.index]; 8193 ed.setContent(l.content, {format : 'raw'}); 8194 ed.selection.moveToBookmark(l.bookmark); 8195 8196 t.onUndo.dispatch(t, l); 8197 } 8198 8199 return l; 8200 }, 8201 8202 redo : function() { 8203 var t = this, ed = t.editor, l = null; 8204 8205 if (t.index < t.data.length - 1) { 8206 l = t.data[++t.index]; 8207 ed.setContent(l.content, {format : 'raw'}); 8208 ed.selection.moveToBookmark(l.bookmark); 8209 8210 t.onRedo.dispatch(t, l); 8211 } 8212 8213 return l; 8214 }, 8215 8216 clear : function() { 8217 var t = this; 8218 8219 t.data = []; 8220 t.index = 0; 8221 t.typing = 0; 8222 t.add({initial : true}); 8223 }, 8224 8225 hasUndo : function() { 8226 return this.index != 0 || this.typing; 8227 }, 8228 8229 hasRedo : function() { 8230 return this.index < this.data.length - 1; 8231 } 8232 8233 }); 8234 /* file:jscripts/tiny_mce/classes/ForceBlocks.js */ 8235 8236 (function() { 8237 // Shorten names 8238 var Event, isIE, isGecko, isOpera, each, extend; 8239 8240 Event = tinymce.dom.Event; 8241 isIE = tinymce.isIE; 8242 isGecko = tinymce.isGecko; 8243 isOpera = tinymce.isOpera; 8244 each = tinymce.each; 8245 extend = tinymce.extend; 8246 8247 tinymce.create('tinymce.ForceBlocks', { 8248 ForceBlocks : function(ed) { 8249 var t = this, s; 8250 8251 t.editor = ed; 8252 t.dom = ed.dom; 8253 8254 // Default settings 8255 t.settings = s = extend({ 8256 element : 'P', 8257 forced_root_block : 'p', 8258 force_p_newlines : true 8259 }, ed.settings); 8260 8261 ed.onPreInit.add(t.setup, t); 8262 8263 if (!isIE) { 8264 ed.onSetContent.add(function(ed, o) { 8265 o.content = o.content.replace(/<p>[\s\u00a0]+<\/p>/g, '<p><br /></p>'); 8266 }); 8267 } 8268 8269 ed.onPostProcess.add(function(ed, o) { 8270 if (isOpera) 8271 o.content = o.content.replace(/(\u00a0| | )<\/p>/g, '</p>'); 8272 8273 o.content = o.content.replace(/<p><\/p>/g, '<p>\u00a0</p>'); 8274 8275 // Use BR instead of padded paragraphs 8276 o.content = o.content.replace(/<p>\s*<br \/>\s*<\/p>/g, '<p>\u00a0</p>'); 8277 o.content = o.content.replace(/\s*<br \/>\s*<\/p>/g, '</p>'); 8278 }); 8279 8280 if (s.forced_root_block) { 8281 ed.onInit.add(t.forceRoots, t); 8282 ed.onSetContent.add(t.forceRoots, t); 8283 ed.onBeforeGetContent.add(t.forceRoots, t); 8284 } 8285 }, 8286 8287 setup : function() { 8288 var t = this, ed = t.editor, s = t.settings; 8289 8290 // Force root blocks when typing and when getting output 8291 if (s.forced_root_block) { 8292 ed.onKeyUp.add(t.forceRoots, t); 8293 ed.onPreProcess.add(t.forceRoots, t); 8294 } 8295 8296 if (s.force_br_newlines) { 8297 // Force IE to produce BRs on enter 8298 if (isIE) { 8299 ed.onKeyPress.add(function(ed, e) { 8300 var n, s = ed.selection; 8301 8302 if (e.keyCode == 13) { 8303 s.setContent('<br id="__" /> ', {format : 'raw'}); 8304 n = ed.dom.get('__'); 8305 n.removeAttribute('id'); 8306 s.select(n); 8307 s.collapse(); 8308 return Event.cancel(e); 8309 } 8310 }); 8311 } 8312 8313 return; 8314 } 8315 8316 if (!isIE && s.force_p_newlines) { 8317 ed.onPreProcess.add(function(ed, o) { 8318 each(ed.dom.select('br', o.node), function(n) { 8319 var p = n.parentNode; 8320 8321 // Replace <p><br /></p> with <p> </p> 8322 if (p && p.nodeName == 'p' && (p.childNodes.length == 1 || p.lastChild == n)) 8323 p.replaceChild(ed.getDoc().createTextNode('\u00a0'), n); 8324 }); 8325 }); 8326 8327 ed.onKeyPress.add(function(ed, e) { 8328 if (e.keyCode == 13 && !e.shiftKey) { 8329 if (!t.insertPara(e)) 8330 Event.cancel(e); 8331 } 8332 }); 8333 8334 if (isGecko) { 8335 ed.onKeyDown.add(function(ed, e) { 8336 if ((e.keyCode == 8 || e.keyCode == 46) && !e.shiftKey) 8337 t.backspaceDelete(e, e.keyCode == 8); 8338 }); 8339 } 8340 } 8341 }, 8342 8343 find : function(n, t, s) { 8344 var ed = this.editor, w = ed.getDoc().createTreeWalker(n, 4, null, false), c = -1; 8345 8346 while (n = w.nextNode()) { 8347 c++; 8348 8349 // Index by node 8350 if (t == 0 && n == s) 8351 return c; 8352 8353 // Node by index 8354 if (t == 1 && c == s) 8355 return n; 8356 } 8357 8358 return -1; 8359 }, 8360 8361 forceRoots : function(ed, e) { 8362 var t = this, ed = t.editor, b = ed.getBody(), d = ed.getDoc(), se = ed.selection, s = se.getSel(), r = se.getRng(), si = -2, ei, so, eo, tr, c = -0xFFFFFF; 8363 var nx, bl, bp, sp, le, nl = b.childNodes, i; 8364 8365 // Fix for bug #1863847 8366 if (e && e.keyCode == 13) 8367 return true; 8368 8369 // Wrap non blocks into blocks 8370 for (i = nl.length - 1; i >= 0; i--) { 8371 nx = nl[i]; 8372 8373 // Is text or non block element 8374 if (nx.nodeType == 3 || !t.dom.isBlock(nx)) { 8375 if (!bl) { 8376 // Create new block but ignore whitespace 8377 if (nx.nodeType != 3 || /[^\s]/g.test(nx.nodeValue)) { 8378 // Store selection 8379 if (si == -2 && r) { 8380 if (!isIE) { 8381 so = r.startOffset; 8382 eo = r.endOffset; 8383 si = t.find(b, 0, r.startContainer); 8384 ei = t.find(b, 0, r.endContainer); 8385 } else { 8386 tr = d.body.createTextRange(); 8387 tr.moveToElementText(b); 8388 tr.collapse(1); 8389 bp = tr.move('character', c) * -1; 8390 8391 tr = r.duplicate(); 8392 tr.collapse(1); 8393 sp = tr.move('character', c) * -1; 8394 8395 tr = r.duplicate(); 8396 tr.collapse(0); 8397 le = (tr.move('character', c) * -1) - sp; 8398 8399 si = sp - bp; 8400 ei = le; 8401 } 8402 } 8403 8404 bl = ed.dom.create(t.settings.forced_root_block); 8405 bl.appendChild(nx.cloneNode(1)); 8406 b.replaceChild(bl, nx); 8407 } 8408 } else { 8409 if (bl.hasChildNodes()) 8410 bl.insertBefore(nx, bl.firstChild); 8411 else 8412 bl.appendChild(nx); 8413 } 8414 } else 8415 bl = null; // Time to create new block 8416 } 8417 8418 // Restore selection 8419 if (si != -2) { 8420 if (!isIE) { 8421 bl = d.getElementsByTagName(t.settings.element)[0]; 8422 r = d.createRange(); 8423 8424 // Select last location or generated block 8425 if (si != -1) 8426 r.setStart(t.find(b, 1, si), so); 8427 else 8428 r.setStart(bl, 0); 8429 8430 // Select last location or generated block 8431 if (ei != -1) 8432 r.setEnd(t.find(b, 1, ei), eo); 8433 else 8434 r.setEnd(bl, 0); 8435 8436 if (s) { 8437 s.removeAllRanges(); 8438 s.addRange(r); 8439 } 8440 } else { 8441 try { 8442 r = s.createRange(); 8443 r.moveToElementText(b); 8444 r.collapse(1); 8445 r.moveStart('character', si); 8446 r.moveEnd('character', ei); 8447 r.select(); 8448 } catch (ex) { 8449 // Ignore 8450 } 8451 } 8452 } 8453 }, 8454 8455 getParentBlock : function(n) { 8456 var d = this.dom; 8457 8458 return d.getParent(n, d.isBlock); 8459 }, 8460 8461 insertPara : function(e) { 8462 var t = this, ed = t.editor, d = ed.getDoc(), se = t.settings, s = ed.selection.getSel(), r = s.getRangeAt(0), b = d.body; 8463 var rb, ra, dir, sn, so, en, eo, sb, eb, bn, bef, aft, sc, ec, n; 8464 8465 function isEmpty(n) { 8466 n = n.innerHTML; 8467 n = n.replace(/<(img|hr|table)/gi, '-'); // Keep these convert them to - chars 8468 n = n.replace(/<[^>]+>/g, ''); // Remove all tags 8469 8470 return n.replace(/[ \t\r\n]+/g, '') == ''; 8471 }; 8472 8473 // If root blocks are forced then use Operas default behavior since it's really good 8474 // Removed due to bug: #1853816 8475 // if (se.forced_root_block && isOpera) 8476 // return true; 8477 8478 // Setup before range 8479 rb = d.createRange(); 8480 8481 // If is before the first block element and in body, then move it into first block element 8482 rb.setStart(s.anchorNode, s.anchorOffset); 8483 rb.collapse(true); 8484 8485 // Setup after range 8486 ra = d.createRange(); 8487 8488 // If is before the first block element and in body, then move it into first block element 8489 ra.setStart(s.focusNode, s.focusOffset); 8490 ra.collapse(true); 8491 8492 // Setup start/end points 8493 dir = rb.compareBoundaryPoints(rb.START_TO_END, ra) < 0; 8494 sn = dir ? s.anchorNode : s.focusNode; 8495 so = dir ? s.anchorOffset : s.focusOffset; 8496 en = dir ? s.focusNode : s.anchorNode; 8497 eo = dir ? s.focusOffset : s.anchorOffset; 8498 8499 // If the caret is in an invalid location in FF we need to move it into the first block 8500 if (sn == b && en == b && b.firstChild && ed.dom.isBlock(b.firstChild)) { 8501 sn = en = sn.firstChild; 8502 so = eo = 0; 8503 rb = d.createRange(); 8504 rb.setStart(sn, 0); 8505 ra = d.createRange(); 8506 ra.setStart(en, 0); 8507 } 8508 8509 // Never use body as start or end node 8510 sn = sn.nodeName == "BODY" ? sn.firstChild : sn; 8511 en = en.nodeName == "BODY" ? en.firstChild : en; 8512 8513 // Get start and end blocks 8514 sb = t.getParentBlock(sn); 8515 eb = t.getParentBlock(en); 8516 bn = sb ? sb.nodeName : se.element; // Get block name to create 8517 8518 // Return inside list use default browser behavior 8519 if (t.dom.getParent(sb, function(n) { return /OL|UL|PRE/.test(n.nodeName); })) 8520 return true; 8521 8522 // If caption or absolute layers then always generate new blocks within 8523 if (sb && (sb.nodeName == 'CAPTION' || /absolute|relative|static/gi.test(sb.style.position))) { 8524 bn = se.element; 8525 sb = null; 8526 } 8527 8528 // If caption or absolute layers then always generate new blocks within 8529 if (eb && (eb.nodeName == 'CAPTION' || /absolute|relative|static/gi.test(eb.style.position))) { 8530 bn = se.element; 8531 eb = null; 8532 } 8533 8534 // Use P instead 8535 if (/(TD|TABLE|TH|CAPTION)/.test(bn) || (sb && bn == "DIV" && /left|right/gi.test(sb.style.cssFloat))) { 8536 bn = se.element; 8537 sb = eb = null; 8538 } 8539 8540 // Setup new before and after blocks 8541 bef = (sb && sb.nodeName == bn) ? sb.cloneNode(0) : ed.dom.create(bn); 8542 aft = (eb && eb.nodeName == bn) ? eb.cloneNode(0) : ed.dom.create(bn); 8543 8544 // Remove id from after clone 8545 aft.removeAttribute('id'); 8546 8547 // Is header and cursor is at the end, then force paragraph under 8548 if (/^(H[1-6])$/.test(bn) && sn.nodeValue && so == sn.nodeValue.length) 8549 aft = ed.dom.create(se.element); 8550 8551 // Find start chop node 8552 n = sc = sn; 8553 do { 8554 if (n == b || n.nodeType == 9 || t.dom.isBlock(n) || /(TD|TABLE|TH|CAPTION)/.test(n.nodeName)) 8555 break; 8556 8557 sc = n; 8558 } while ((n = n.previousSibling ? n.previousSibling : n.parentNode)); 8559 8560 // Find end chop node 8561 n = ec = en; 8562 do { 8563 if (n == b || n.nodeType == 9 || t.dom.isBlock(n) || /(TD|TABLE|TH|CAPTION)/.test(n.nodeName)) 8564 break; 8565 8566 ec = n; 8567 } while ((n = n.nextSibling ? n.nextSibling : n.parentNode)); 8568 8569 // Place first chop part into before block element 8570 if (sc.nodeName == bn) 8571 rb.setStart(sc, 0); 8572 else 8573 rb.setStartBefore(sc); 8574 8575 rb.setEnd(sn, so); 8576 bef.appendChild(rb.cloneContents() || d.createTextNode('')); // Empty text node needed for Safari 8577 8578 // Place secnd chop part within new block element 8579 try { 8580 ra.setEndAfter(ec); 8581 } catch(ex) { 8582 //console.debug(s.focusNode, s.focusOffset); 8583 } 8584 8585 ra.setStart(en, eo); 8586 aft.appendChild(ra.cloneContents() || d.createTextNode('')); // Empty text node needed for Safari 8587 8588 // Create range around everything 8589 r = d.createRange(); 8590 if (!sc.previousSibling && sc.parentNode.nodeName == bn) { 8591 r.setStartBefore(sc.parentNode); 8592 } else { 8593 if (rb.startContainer.nodeName == bn && rb.startOffset == 0) 8594 r.setStartBefore(rb.startContainer); 8595 else 8596 r.setStart(rb.startContainer, rb.startOffset); 8597 } 8598 8599 if (!ec.nextSibling && ec.parentNode.nodeName == bn) 8600 r.setEndAfter(ec.parentNode); 8601 else 8602 r.setEnd(ra.endContainer, ra.endOffset); 8603 8604 // Delete and replace it with new block elements 8605 r.deleteContents(); 8606 8607 // Never wrap blocks in blocks 8608 if (bef.firstChild && bef.firstChild.nodeName == bn) 8609 bef.innerHTML = bef.firstChild.innerHTML; 8610 8611 if (aft.firstChild && aft.firstChild.nodeName == bn) 8612 aft.innerHTML = aft.firstChild.innerHTML; 8613 8614 // Padd empty blocks 8615 if (isEmpty(bef)) 8616 bef.innerHTML = '<br />'; 8617 8618 if (isEmpty(aft)) 8619 aft.innerHTML = isOpera ? ' ' : '<br />'; // Extra space for Opera so that the caret can move there 8620 8621 // Opera needs this one backwards 8622 if (isOpera) { 8623 r.insertNode(bef); 8624 r.insertNode(aft); 8625 } else { 8626 r.insertNode(aft); 8627 r.insertNode(bef); 8628 } 8629 8630 // Normalize 8631 aft.normalize(); 8632 bef.normalize(); 8633 8634 // Move cursor and scroll into view 8635 r = d.createRange(); 8636 r.selectNodeContents(aft); 8637 r.collapse(1); 8638 s.removeAllRanges(); 8639 s.addRange(r); 8640 aft.scrollIntoView(0); 8641 8642 return false; 8643 }, 8644 8645 backspaceDelete : function(e, bs) { 8646 var t = this, ed = t.editor, b = ed.getBody(), n, se = ed.selection, r = se.getRng(), sc = r.startContainer, n; 8647 8648 // The caret sometimes gets stuck in Gecko if you delete empty paragraphs 8649 // This workaround removes the element by hand and moves the caret to the previous element 8650 if (sc && ed.dom.isBlock(sc) && bs) { 8651 if (sc.childNodes.length == 1 && sc.firstChild.nodeName == 'BR') { 8652 n = sc.previousSibling; 8653 if (n) { 8654 ed.dom.remove(sc); 8655 se.select(n, 1); 8656 se.collapse(0); 8657 return Event.cancel(e); 8658 } 8659 } 8660 } 8661 8662 // Gecko generates BR elements here and there, we don't like those so lets remove them 8663 function handler(e) { 8664 e = e.target; 8665 8666 // A new BR was created in a block element, remove it 8667 if (e && e.parentNode && e.nodeName == 'BR' && t.getParentBlock(e)) { 8668 ed.dom.remove(e); 8669 Event.remove(b, 'DOMNodeInserted', handler); 8670 } 8671 }; 8672 8673 // Listen for new nodes 8674 Event._add(b, 'DOMNodeInserted', handler); 8675 8676 // Remove listener 8677 window.setTimeout(function() { 8678 Event._remove(b, 'DOMNodeInserted', handler); 8679 }, 1); 8680 } 8681 }); 8682 })(); 8683 8684 /* file:jscripts/tiny_mce/classes/ControlManager.js */ 8685 8686 (function() { 8687 // Shorten names 8688 var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each, extend = tinymce.extend; 8689 8690 tinymce.create('tinymce.ControlManager', { 8691 ControlManager : function(ed, s) { 8692 var t = this, i; 8693 8694 s = s || {}; 8695 t.editor = ed; 8696 t.controls = {}; 8697 t.onAdd = new tinymce.util.Dispatcher(t); 8698 t.onPostRender = new tinymce.util.Dispatcher(t); 8699 t.prefix = s.prefix || ed.id + '_'; 8700 8701 t.onPostRender.add(function() { 8702 each(t.controls, function(c) { 8703 c.postRender(); 8704 }); 8705 }); 8706 }, 8707 8708 get : function(id) { 8709 return this.controls[this.prefix + id] || this.controls[id]; 8710 }, 8711 8712 setActive : function(id, s) { 8713 var c = null; 8714 8715 if (c = this.get(id)) 8716 c.setActive(s); 8717 8718 return c; 8719 }, 8720 8721 setDisabled : function(id, s) { 8722 var c = null; 8723 8724 if (c = this.get(id)) 8725 c.setDisabled(s); 8726 8727 return c; 8728 }, 8729 8730 add : function(c) { 8731 var t = this; 8732 8733 if (c) { 8734 t.controls[c.id] = c; 8735 t.onAdd.dispatch(c, t); 8736 } 8737 8738 return c; 8739 }, 8740 8741 createControl : function(n) { 8742 var c, t = this, ed = t.editor; 8743 8744 each(ed.plugins, function(p) { 8745 if (p.createControl) { 8746 c = p.createControl(n, t); 8747 8748 if (c) 8749 return false; 8750 } 8751 }); 8752 8753 switch (n) { 8754 case "|": 8755 case "separator": 8756 return t.createSeparator(); 8757 } 8758 8759 if (!c && ed.buttons && (c = ed.buttons[n])) 8760 return t.createButton(n, c); 8761 8762 return t.add(c); 8763 }, 8764 8765 createDropMenu : function(id, s) { 8766 var t = this, ed = t.editor, c; 8767 8768 s = extend({ 8769 'class' : 'mceDropDown' 8770 }, s); 8771 8772 s['class'] = s['class'] + ' ' + ed.getParam('skin') + 'Skin'; 8773 8774 id = t.prefix + id; 8775 c = t.controls[id] = new tinymce.ui.DropMenu(id, s); 8776 c.onAddItem.add(function(c, o) { 8777 var s = o.settings; 8778 8779 s.title = ed.getLang(s.title, s.title); 8780 8781 if (!s.onclick) { 8782 s.onclick = function(v) { 8783 ed.execCommand(s.cmd, s.ui || false, v || s.value); 8784 }; 8785 } 8786 }); 8787 8788 ed.onRemove.add(function() { 8789 c.destroy(); 8790 }); 8791 8792 return t.add(c); 8793 }, 8794 8795 createListBox : function(id, s) { 8796 var t = this, ed = t.editor, cmd, c; 8797 8798 if (t.get(id)) 8799 return null; 8800 8801 s.title = ed.translate(s.title); 8802 s.scope = s.scope || ed; 8803 8804 if (!s.onselect) { 8805 s.onselect = function(v) { 8806 ed.execCommand(s.cmd, s.ui || false, v || s.value); 8807 }; 8808 } 8809 8810 s = extend({ 8811 title : s.title, 8812 'class' : id, 8813 scope : s.scope, 8814 control_manager : t 8815 }, s); 8816 8817 id = t.prefix + id; 8818 8819 if (ed.settings.use_native_selects) 8820 c = new tinymce.ui.NativeListBox(id, s); 8821 else 8822 c = new tinymce.ui.ListBox(id, s); 8823 8824 t.controls[id] = c; 8825 8826 // Fix focus problem in Safari 8827 if (tinymce.isWebKit) { 8828 c.onPostRender.add(function(c, n) { 8829 // Store bookmark on mousedown 8830 Event.add(n, 'mousedown', function() { 8831 ed.bookmark = ed.selection.getBookmark('simple'); 8832 }); 8833 8834 // Restore on focus, since it might be lost 8835 Event.add(n, 'focus', function() { 8836 ed.selection.moveToBookmark(ed.bookmark); 8837 ed.bookmark = null; 8838 }); 8839 }); 8840 } 8841 8842 if (c.hideMenu) 8843 ed.onMouseDown.add(c.hideMenu, c); 8844 8845 return t.add(c); 8846 }, 8847 8848 createButton : function(id, s) { 8849 var t = this, ed = t.editor, o, c; 8850 8851 if (t.get(id)) 8852 return null; 8853 8854 s.title = ed.translate(s.title); 8855 s.scope = s.scope || ed; 8856 8857 if (!s.onclick && !s.menu_button) { 8858 s.onclick = function() { 8859 ed.execCommand(s.cmd, s.ui || false, s.value); 8860 }; 8861 } 8862 8863 s = extend({ 8864 title : s.title, 8865 'class' : id, 8866 unavailable_prefix : ed.getLang('unavailable', ''), 8867 scope : s.scope, 8868 control_manager : t 8869 }, s); 8870 8871 id = t.prefix + id; 8872 8873 if (s.menu_button) { 8874 c = new tinymce.ui.MenuButton(id, s); 8875 ed.onMouseDown.add(c.hideMenu, c); 8876 } else 8877 c = new tinymce.ui.Button(id, s); 8878 8879 return t.add(c); 8880 }, 8881 8882 createMenuButton : function(id, s) { 8883 s = s || {}; 8884 s.menu_button = 1; 8885 8886 return this.createButton(id, s); 8887 }, 8888 8889 createSplitButton : function(id, s) { 8890 var t = this, ed = t.editor, cmd, c; 8891 8892 if (t.get(id)) 8893 return null; 8894 8895 s.title = ed.translate(s.title); 8896 s.scope = s.scope || ed; 8897 8898 if (!s.onclick) { 8899 s.onclick = function(v) { 8900 ed.execCommand(s.cmd, s.ui || false, v || s.value); 8901 }; 8902 } 8903 8904 if (!s.onselect) { 8905 s.onselect = function(v) { 8906 ed.execCommand(s.cmd, s.ui || false, v || s.value); 8907 }; 8908 } 8909 8910 s = extend({ 8911 title : s.title, 8912 'class' : id, 8913 scope : s.scope, 8914 control_manager : t 8915 }, s); 8916 8917 id = t.prefix + id; 8918 c = t.add(new tinymce.ui.SplitButton(id, s)); 8919 ed.onMouseDown.add(c.hideMenu, c); 8920 8921 return c; 8922 }, 8923 8924 createColorSplitButton : function(id, s) { 8925 var t = this, ed = t.editor, cmd, c; 8926 8927 if (t.get(id)) 8928 return null; 8929 8930 s.title = ed.translate(s.title); 8931 s.scope = s.scope || ed; 8932 8933 if (!s.onclick) { 8934 s.onclick = function(v) { 8935 ed.execCommand(s.cmd, s.ui || false, v || s.value); 8936 }; 8937 } 8938 8939 if (!s.onselect) { 8940 s.onselect = function(v) { 8941 ed.execCommand(s.cmd, s.ui || false, v || s.value); 8942 }; 8943 } 8944 8945 s = extend({ 8946 title : s.title, 8947 'class' : id, 8948 'menu_class' : ed.getParam('skin') + 'Skin', 8949 scope : s.scope, 8950 more_colors_title : ed.getLang('more_colors') 8951 }, s); 8952 8953 id = t.prefix + id; 8954 c = new tinymce.ui.ColorSplitButton(id, s); 8955 ed.onMouseDown.add(c.hideMenu, c); 8956 8957 return t.add(c); 8958 }, 8959 8960 createToolbar : function(id, s) { 8961 var c, t = this; 8962 8963 id = t.prefix + id; 8964 c = new tinymce.ui.Toolbar(id, s); 8965 8966 if (t.get(id)) 8967 return null; 8968 8969 return t.add(c); 8970 }, 8971 8972 createSeparator : function() { 8973 return new tinymce.ui.Separator(); 8974 } 8975 8976 }); 8977 })(); 8978 8979 /* file:jscripts/tiny_mce/classes/WindowManager.js */ 8980 8981 (function() { 8982 var Dispatcher = tinymce.util.Dispatcher, each = tinymce.each, isIE = tinymce.isIE, isOpera = tinymce.isOpera; 8983 8984 tinymce.create('tinymce.WindowManager', { 8985 WindowManager : function(ed) { 8986 var t = this; 8987 8988 t.editor = ed; 8989 t.onOpen = new Dispatcher(t); 8990 t.onClose = new Dispatcher(t); 8991 t.params = {}; 8992 t.features = {}; 8993 }, 8994 8995 open : function(s, p) { 8996 var t = this, f = '', x, y, mo = t.editor.settings.dialog_type == 'modal', w, sw, sh, vp = tinymce.DOM.getViewPort(); 8997 8998 // Default some options 8999 s = s || {}; 9000 p = p || {}; 9001 sw = isOpera ? vp.w : screen.width; // Opera uses windows inside the Opera window 9002 sh = isOpera ? vp.h : screen.height; 9003 s.name = s.name || 'mc_' + new Date().getTime(); 9004 s.width = parseInt(s.width || 320); 9005 s.height = parseInt(s.height || 240); 9006 s.resizable = true; 9007 s.left = s.left || parseInt(sw / 2.0) - (s.width / 2.0); 9008 s.top = s.top || parseInt(sh / 2.0) - (s.height / 2.0); 9009 p.inline = false; 9010 p.mce_width = s.width; 9011 p.mce_height = s.height; 9012 9013 if (mo) { 9014 if (isIE) { 9015 s.center = true; 9016 s.help = false; 9017 s.dialogWidth = s.width + 'px'; 9018 s.dialogHeight = s.height + 'px'; 9019 s.scroll = s.scrollbars || false; 9020 } else 9021 s.modal = s.alwaysRaised = s.dialog = s.centerscreen = s.dependent = true; 9022 } 9023 9024 // Build features string 9025 each(s, function(v, k) { 9026 if (tinymce.is(v, 'boolean')) 9027 v = v ? 'yes' : 'no'; 9028 9029 if (!/^(name|url)$/.test(k)) { 9030 if (isIE && mo) 9031 f += (f ? ';' : '') + k + ':' + v; 9032 else 9033 f += (f ? ',' : '') + k + '=' + v; 9034 } 9035 }); 9036 9037 t.features = s; 9038 t.params = p; 9039 t.onOpen.dispatch(t, s, p); 9040 9041 try { 9042 if (isIE && mo) { 9043 w = 1; 9044 window.showModalDialog(s.url || s.file, window, f); 9045 } else 9046 w = window.open(s.url || s.file, s.name, f); 9047 } catch (ex) { 9048 // Ignore 9049 } 9050 9051 if (!w) 9052 alert(t.editor.getLang('popup_blocked')); 9053 }, 9054 9055 close : function(w) { 9056 w.close(); 9057 this.onClose.dispatch(this); 9058 }, 9059 9060 createInstance : function(cl) { 9061 var a = arguments, i, f = tinymce.resolve(cl), s = ''; 9062 9063 // Is there a better way to dynamically create 9064 // a class with a dynamic number of arguments 9065 for (i=1; i<a.length; i++) 9066 s += (i > 1 ? ',' : '') + 'a[' + i + ']'; 9067 9068 return eval('(new f(' + s + '))'); 9069 }, 9070 9071 confirm : function(t, cb, s) { 9072 cb.call(s || this, confirm(this._decode(this.editor.getLang(t, t)))); 9073 }, 9074 9075 alert : function(t, cb, s) { 9076 alert(this._decode(t)); 9077 9078 if (cb) 9079 cb.call(s || this); 9080 }, 9081 9082 // Internal functions 9083 9084 _decode : function(s) { 9085 return tinymce.DOM.decode(s).replace(/\\n/g, '\n'); 9086 } 9087 9088 }); 9089 }()); 1 var tinymce={majorVersion:'3',minorVersion:'0',releaseDate:'2008-01-30',_init:function(){var t=this,ua=navigator.userAgent,i,nl,n,base;t.isOpera=window.opera&&opera.buildNumber;t.isWebKit=/WebKit/.test(ua);t.isOldWebKit=t.isWebKit&&!window.getSelection().getRangeAt;t.isIE=!t.isWebKit&&!t.isOpera&&(/MSIE/gi).test(ua)&&(/Explorer/gi).test(navigator.appName);t.isIE6=t.isIE&&/MSIE [56]/.test(ua);t.isGecko=!t.isWebKit&&/Gecko/.test(ua);t.isMac=ua.indexOf('Mac')!=-1;if(window.tinyMCEPreInit){t.suffix=tinyMCEPreInit.suffix;t.baseURL=tinyMCEPreInit.base;return;}t.suffix='';nl=document.getElementsByTagName('base');for(i=0;i<nl.length;i++){if(nl[i].href)base=nl[i].href;}function getBase(n){if(n.src&&/tiny_mce(|_dev|_src|_gzip|_jquery|_prototype).js/.test(n.src)){if(/_(src|dev)\.js/g.test(n.src))t.suffix='_src';t.baseURL=n.src.substring(0,n.src.lastIndexOf('/'));if(base&&t.baseURL.indexOf('://')==-1)t.baseURL=base+t.baseURL;return t.baseURL;}return null;};nl=document.getElementsByTagName('script');for(i=0;i<nl.length;i++){if(getBase(nl[i]))return;}n=document.getElementsByTagName('head')[0];if(n){nl=n.getElementsByTagName('script');for(i=0;i<nl.length;i++){if(getBase(nl[i]))return;}}return;},is:function(o,t){var n=typeof(o);if(!t)return n!='undefined';if(t=='array'&&(o instanceof Array))return true;return n==t;},each:function(o,cb,s){var n,l;if(!o)return 0;s=s||o;if(typeof(o.length)!='undefined'){for(n=0,l=o.length;n<l;n++){if(cb.call(s,o[n],n,o)===false)return 0;}}else{for(n in o){if(o.hasOwnProperty(n)){if(cb.call(s,o[n],n,o)===false)return 0;}}}return 1;},map:function(a,f){var o=[];tinymce.each(a,function(v){o.push(f(v));});return o;},grep:function(a,f){var o=[];tinymce.each(a,function(v){if(!f||f(v))o.push(v);});return o;},inArray:function(a,v){var i,l;if(a){for(i=0,l=a.length;i<l;i++){if(a[i]===v)return i;}}return-1;},extend:function(o,e){var i,a=arguments;for(i=1;i<a.length;i++){e=a[i];tinymce.each(e,function(v,n){if(typeof(v)!=='undefined')o[n]=v;});}return o;},trim:function(s){return(s?''+s:'').replace(/^\s*|\s*$/g,'');},create:function(s,p){var t=this,sp,ns,cn,scn,c,de=0;s=/^((static) )?([\w.]+)(:([\w.]+))?/.exec(s);cn=s[3].match(/(^|\.)(\w+)$/i)[2];ns=t.createNS(s[3].replace(/\.\w+$/,''));if(ns[cn])return;if(s[2]=='static'){ns[cn]=p;if(this.onCreate)this.onCreate(s[2],s[3],ns[cn]);return;}if(!p[cn]){p[cn]=function(){};de=1;}ns[cn]=p[cn];t.extend(ns[cn].prototype,p);if(s[5]){sp=t.resolve(s[5]).prototype;scn=s[5].match(/\.(\w+)$/i)[1];c=ns[cn];if(de){ns[cn]=function(){return sp[scn].apply(this,arguments);};}else{ns[cn]=function(){this.parent=sp[scn];return c.apply(this,arguments);};}ns[cn].prototype[cn]=ns[cn];t.each(sp,function(f,n){if(n!=scn)ns[cn].prototype[n]=sp[n];});t.each(p,function(f,n){if(sp[n]){ns[cn].prototype[n]=function(){this.parent=sp[n];return f.apply(this,arguments);};}else{if(n!=cn)ns[cn].prototype[n]=f;}});}t.each(p['static'],function(f,n){ns[cn][n]=f;});if(this.onCreate)this.onCreate(s[2],s[3],ns[cn].prototype);},walk:function(o,f,n,s){s=s||this;if(o){if(n)o=o[n];tinymce.each(o,function(o,i){if(f.call(s,o,i,n)===false)return false;tinymce.walk(o,f,n,s);});}},createNS:function(n,o){var i,v;o=o||window;n=n.split('.');for(i=0;i<n.length;i++){v=n[i];if(!o[v])o[v]={};o=o[v];}return o;},resolve:function(n,o){var i,l;o=o||window;n=n.split('.');for(i=0,l=n.length;i<l;i++){o=o[n[i]];if(!o)break;}return o;},addUnload:function(f,s){var t=this,w=window,unload;f={func:f,scope:s||this};if(!t.unloads){unload=function(){var li=t.unloads,o,n;for(n in li){o=li[n];if(o&&o.func)o.func.call(o.scope);}if(w.detachEvent)w.detachEvent('onunload',unload);else if(w.removeEventListener)w.removeEventListener('unload',unload,false);o=li=w=unload=null;if(window.CollectGarbage)window.CollectGarbage();};if(w.attachEvent)w.attachEvent('onunload',unload);else if(w.addEventListener)w.addEventListener('unload',unload,false);t.unloads=[f];}else t.unloads.push(f);return f;},removeUnload:function(f){var u=this.unloads,r=null;tinymce.each(u,function(o,i){if(o&&o.func==f){u.splice(i,1);r=f;return false;}});return r;}};window.tinymce=tinymce;tinymce._init();tinymce.create('tinymce.util.Dispatcher',{scope:null,listeners:null,Dispatcher:function(s){this.scope=s||this;this.listeners=[];},add:function(cb,s){this.listeners.push({cb:cb,scope:s||this.scope});return cb;},addToTop:function(cb,s){this.listeners.unshift({cb:cb,scope:s||this.scope});return cb;},remove:function(cb){var l=this.listeners,o=null;tinymce.each(l,function(c,i){if(cb==c.cb){o=cb;l.splice(i,1);return false;}});return o;},dispatch:function(){var s,a=arguments;tinymce.each(this.listeners,function(c){return s=c.cb.apply(c.scope,a);});return s;}});(function(){var each=tinymce.each;tinymce.create('tinymce.util.URI',{URI:function(u,s){var t=this,o,a,b;s=t.settings=s||{};if(/^(mailto|news|javascript|about):/i.test(u)||/^\s*#/.test(u)){t.source=u;return;}if(u.indexOf('/')===0&&u.indexOf('//')!==0)u=(s.base_uri?s.base_uri.protocol||'http':'http')+'://mce_host'+u;if(u.indexOf('://')===-1&&u.indexOf('//')!==0)u=(s.base_uri.protocol||'http')+'://mce_host'+t.toAbsPath(s.base_uri.path,u);u=u.replace(/@@/g,'(mce_at)');u=/^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/.exec(u);each(["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],function(v,i){var s=u[i];if(s)s=s.replace(/\(mce_at\)/g,'@@');t[v]=s;});if(b=s.base_uri){if(!t.protocol)t.protocol=b.protocol;if(!t.userInfo)t.userInfo=b.userInfo;if(!t.port&&t.host=='mce_host')t.port=b.port;if(!t.host||t.host=='mce_host')t.host=b.host;t.source='';}},setPath:function(p){var t=this;p=/^(.*?)\/?(\w+)?$/.exec(p);t.path=p[0];t.directory=p[1];t.file=p[2];t.source='';t.getURI();},toRelative:function(u){var t=this,o;u=new tinymce.util.URI(u,{base_uri:t});if((u.host!='mce_host'&&t.host!=u.host&&u.host)||t.port!=u.port||t.protocol!=u.protocol)return u.getURI();o=t.toRelPath(t.path,u.path);if(u.query)o+='?'+u.query;if(u.anchor)o+='#'+u.anchor;return o;},toAbsolute:function(u,nh){var u=new tinymce.util.URI(u,{base_uri:this});return u.getURI(this.host==u.host?nh:0);},toRelPath:function(base,path){var items,bp=0,out='',i;base=base.substring(0,base.lastIndexOf('/'));base=base.split('/');items=path.split('/');if(base.length>=items.length){for(i=0;i<base.length;i++){if(i>=items.length||base[i]!=items[i]){bp=i+1;break;}}}if(base.length<items.length){for(i=0;i<items.length;i++){if(i>=base.length||base[i]!=items[i]){bp=i+1;break;}}}if(bp==1)return path;for(i=0;i<base.length-(bp-1);i++)out+="../";for(i=bp-1;i<items.length;i++){if(i!=bp-1)out+="/"+items[i];else out+=items[i];}return out;},toAbsPath:function(base,path){var i,nb=0,o=[];base=base.split('/');path=path.split('/');each(base,function(k){if(k)o.push(k);});base=o;for(i=path.length-1,o=[];i>=0;i--){if(path[i].length==0||path[i]==".")continue;if(path[i]=='..'){nb++;continue;}if(nb>0){nb--;continue;}o.push(path[i]);}i=base.length-nb;if(i<=0)return'/'+o.reverse().join('/');return'/'+base.slice(0,i).join('/')+'/'+o.reverse().join('/');},getURI:function(nh){var s,t=this;if(!t.source||nh){s='';if(!nh){if(t.protocol)s+=t.protocol+'://';if(t.userInfo)s+=t.userInfo+'@';if(t.host)s+=t.host;if(t.port)s+=':'+t.port;}if(t.path)s+=t.path;if(t.query)s+='?'+t.query;if(t.anchor)s+='#'+t.anchor;t.source=s;}return t.source;}});})();(function(){var each=tinymce.each;tinymce.create('static tinymce.util.Cookie',{getHash:function(n){var v=this.get(n),h;if(v){each(v.split('&'),function(v){v=v.split('=');h=h||{};h[unescape(v[0])]=unescape(v[1]);});}return h;},setHash:function(n,v,e,p,d,s){var o='';each(v,function(v,k){o+=(!o?'':'&')+escape(k)+'='+escape(v);});this.set(n,o,e,p,d,s);},get:function(n){var c=document.cookie,e,p=n+"=",b;if(!c)return;b=c.indexOf("; "+p);if(b==-1){b=c.indexOf(p);if(b!=0)return null;}else b+=2;e=c.indexOf(";",b);if(e==-1)e=c.length;return unescape(c.substring(b+p.length,e));},set:function(n,v,e,p,d,s){document.cookie=n+"="+escape(v)+((e)?"; expires="+e.toGMTString():"")+((p)?"; path="+escape(p):"")+((d)?"; domain="+d:"")+((s)?"; secure":"");},remove:function(n,p){var d=new Date();d.setTime(d.getTime()-1000);this.set(n,'',d,p,d);}});})();tinymce.create('static tinymce.util.JSON',{serialize:function(o){var i,v,s=tinymce.util.JSON.serialize,t;if(o==null)return'null';t=typeof o;if(t=='string'){v='\bb\tt\nn\ff\rr\""\'\'\\\\';return'"'+o.replace(/([\u0080-\uFFFF\x00-\x1f\"\'])/g,function(a,b){i=v.indexOf(b);if(i+1)return'\\'+v.charAt(i+1);a=b.charCodeAt().toString(16);return'\\u'+'0000'.substring(a.length)+a;})+'"';}if(t=='object'){if(o instanceof Array){for(i=0,v='[';i<o.length;i++)v+=(i>0?',':'')+s(o[i]);return v+']';}v='{';for(i in o)v+=typeof o[i]!='function'?(v.length>1?',"':'"')+i+'":'+s(o[i]):'';return v+'}';}return''+o;},parse:function(s){try{return eval('('+s+')');}catch(ex){}}});tinymce.create('static tinymce.util.XHR',{send:function(o){var x,t,w=window,c=0;o.scope=o.scope||this;o.success_scope=o.success_scope||o.scope;o.error_scope=o.error_scope||o.scope;o.async=o.async===false?false:true;o.data=o.data||'';function get(s){x=0;try{x=new ActiveXObject(s);}catch(ex){}return x;};x=w.XMLHttpRequest?new XMLHttpRequest():get('Microsoft.XMLHTTP')||get('Msxml2.XMLHTTP');if(x){if(x.overrideMimeType)x.overrideMimeType(o.content_type);x.open(o.type||(o.data?'POST':'GET'),o.url,o.async);if(o.content_type)x.setRequestHeader('Content-Type',o.content_type);x.send(o.data);t=w.setInterval(function(){if(x.readyState==4||c++>10000){w.clearInterval(t);if(o.success&&c<10000&&x.status==200)o.success.call(o.success_scope,''+x.responseText,x,o);else if(o.error)o.error.call(o.error_scope,c>10000?'TIMED_OUT':'GENERAL',x,o);x=null;}},10);}}});(function(){var extend=tinymce.extend,JSON=tinymce.util.JSON,XHR=tinymce.util.XHR;tinymce.create('tinymce.util.JSONRequest',{JSONRequest:function(s){this.settings=extend({},s);this.count=0;},send:function(o){var ecb=o.error,scb=o.success;o=extend(this.settings,o);o.success=function(c,x){c=JSON.parse(c);if(typeof(c)=='undefined'){c={error:'JSON Parse error.'};}if(c.error)ecb.call(o.error_scope||o.scope,c.error,x);else scb.call(o.success_scope||o.scope,c.result);};o.error=function(ty,x){ecb.call(o.error_scope||o.scope,ty,x);};o.data=JSON.serialize({id:o.id||'c'+(this.count++),method:o.method,params:o.params});XHR.send(o);},'static':{sendRPC:function(o){return new tinymce.util.JSONRequest().send(o);}}});}());(function(){var each=tinymce.each,is=tinymce.is;var isWebKit=tinymce.isWebKit,isIE=tinymce.isIE;tinymce.create('tinymce.dom.DOMUtils',{doc:null,root:null,files:null,listeners:{},pixelStyles:/^(top|left|bottom|right|width|height|borderWidth)$/,cache:{},idPattern:/^#[\w]+$/,elmPattern:/^[\w_*]+$/,elmClassPattern:/^([\w_]*)\.([\w_]+)$/,DOMUtils:function(d,s){var t=this;t.doc=d;t.files={};t.cssFlicker=false;t.counter=0;t.boxModel=!tinymce.isIE||d.compatMode=="CSS1Compat";this.settings=s=tinymce.extend({keep_values:false,hex_colors:1,process_html:1},s);if(tinymce.isIE6){try{d.execCommand('BackgroundImageCache',false,true);}catch(e){t.cssFlicker=true;}}tinymce.addUnload(function(){t.doc=t.root=null;});},getRoot:function(){var t=this,s=t.settings;return(s&&t.get(s.root_element))||t.doc.body;},getViewPort:function(w){var d,b;w=!w?window:w;d=w.document;b=this.boxModel?d.documentElement:d.body;return{x:w.pageXOffset||b.scrollLeft,y:w.pageYOffset||b.scrollTop,w:w.innerWidth||b.clientWidth,h:w.innerHeight||b.clientHeight};},getRect:function(e){var p,t=this,w,h;e=t.get(e);p=t.getPos(e);w=t.getStyle(e,'width');h=t.getStyle(e,'height');if(w.indexOf('px')===-1)w=0;if(h.indexOf('px')===-1)h=0;return{x:p.x,y:p.y,w:parseInt(w)||e.offsetWidth||e.clientWidth,h:parseInt(h)||e.offsetHeight||e.clientHeight};},getParent:function(n,f,r){var na,se=this.settings;n=this.get(n);if(se.strict_root)r=r||this.getRoot();if(is(f,'string')){na=f.toUpperCase();f=function(n){var s=false;if(n.nodeType==1&&na==='*'){s=true;return false;}each(na.split(','),function(v){if(n.nodeType==1&&((se.strict&&n.nodeName.toUpperCase()==v)||n.nodeName==v)){s=true;return false;}});return s;};}while(n){if(n==r)return null;if(f(n))return n;n=n.parentNode;}return null;},get:function(e){if(typeof(e)=='string')return this.doc.getElementById(e);return e;},select:function(pa,s){var t=this,cs,c,pl,o=[],x,i,l,n;s=t.get(s)||t.doc;if(t.settings.strict){function get(s,n){return s.getElementsByTagName(n.toLowerCase());};}else{function get(s,n){return s.getElementsByTagName(n);};}if(t.elmPattern.test(pa)){x=get(s,pa);for(i=0,l=x.length;i<l;i++)o.push(x[i]);return o;}if(t.elmClassPattern.test(pa)){pl=t.elmClassPattern.exec(pa);x=get(s,pl[1]||'*');c=' '+pl[2]+' ';for(i=0,l=x.length;i<l;i++){n=x[i];if(n.className&&(' '+n.className+' ').indexOf(c)!==-1)o.push(n);}return o;}function collect(n){if(!n.mce_save){n.mce_save=1;o.push(n);}};function collectIE(n){if(!n.getAttribute('mce_save')){n.setAttribute('mce_save','1');o.push(n);}};function find(n,f,r){var i,l,nl=get(r,n);for(i=0,l=nl.length;i<l;i++)f(nl[i]);};each(pa.split(','),function(v,i){v=tinymce.trim(v);if(t.elmPattern.test(v)){each(get(s,v),function(n){collect(n);});return;}if(t.elmClassPattern.test(v)){x=t.elmClassPattern.exec(v);each(get(s,x[1]),function(n){if(t.hasClass(n,x[2]))collect(n);});return;}if(!(cs=t.cache[pa])){cs='x=(function(cf, s) {';pl=v.split(' ');each(pl,function(v){var p=/^([\w\\*]+)?(?:#([\w\\]+))?(?:\.([\w\\\.]+))?(?:\[\@([\w\\]+)([\^\$\*!]?=)([\w\\]+)\])?(?:\:([\w\\]+))?/i.exec(v);p[1]=p[1]||'*';cs+='find("'+p[1]+'", function(n) {';if(p[2])cs+='if (n.id !== "'+p[2]+'") return;';if(p[3]){cs+='var c = " " + n.className + " ";';cs+='if (';c='';each(p[3].split('.'),function(v){if(v)c+=(c?'||':'')+'c.indexOf(" '+v+' ") === -1';});cs+=c+') return;';}});cs+='cf(n);';for(i=pl.length-1;i>=0;i--)cs+='}, '+(i?'n':'s')+');';cs+='})';t.cache[pa]=cs=eval(cs);}cs(isIE?collectIE:collect,s);});each(o,function(n){if(isIE)n.removeAttribute('mce_save');else delete n.mce_save;});return o;},add:function(p,n,a,h,c){var t=this;return this.run(p,function(p){var e,k;e=is(n,'string')?t.doc.createElement(n):n;if(a){for(k in a){if(a.hasOwnProperty(k)&&!is(a[k],'object'))t.setAttrib(e,k,''+a[k]);}if(a.style&&!is(a.style,'string')){each(a.style,function(v,n){t.setStyle(e,n,v);});}}if(h){if(h.nodeType)e.appendChild(h);else t.setHTML(e,h);}return!c?p.appendChild(e):e;});},create:function(n,a,h){return this.add(this.doc.createElement(n),n,a,h,1);},createHTML:function(n,a,h){var o='',t=this,k;o+='<'+n;for(k in a){if(a.hasOwnProperty(k))o+=' '+k+'="'+t.encode(a[k])+'"';}if(tinymce.is(h))return o+'>'+h+'</'+n+'>';return o+' />';},remove:function(n,k){return this.run(n,function(n){var p;p=n.parentNode;if(!p)return null;if(k){each(n.childNodes,function(c){p.insertBefore(c.cloneNode(true),n);});}return p.removeChild(n);});},setStyle:function(n,na,v){var t=this;return t.run(n,function(e){var s,i;s=e.style;na=na.replace(/-(\D)/g,function(a,b){return b.toUpperCase();});if(t.pixelStyles.test(na)&&(tinymce.is(v,'number')||/^[\-0-9\.]+$/.test(v)))v+='px';switch(na){case'opacity':if(isIE){s.filter=v===''?'':"alpha(opacity="+(v*100)+")";if(!n.currentStyle||!n.currentStyle.hasLayout)s.display='inline-block';}s['-moz-opacity']=s['-khtml-opacity']=v;break;case'float':isIE?s.styleFloat=v:s.cssFloat=v;break;}s[na]=v||'';if(t.settings.update_styles)t.setAttrib(e,'mce_style');});},getStyle:function(n,na,c){n=this.get(n);if(!n)return false;if(this.doc.defaultView&&c){na=na.replace(/[A-Z]/g,function(a){return'-'+a;});try{return this.doc.defaultView.getComputedStyle(n,null).getPropertyValue(na);}catch(ex){return null;}}na=na.replace(/-(\D)/g,function(a,b){return b.toUpperCase();});if(na=='float')na=isIE?'styleFloat':'cssFloat';if(n.currentStyle&&c)return n.currentStyle[na];return n.style[na];},setStyles:function(e,o){var t=this,s=t.settings,ol;ol=s.update_styles;s.update_styles=0;each(o,function(v,n){t.setStyle(e,n,v);});s.update_styles=ol;if(s.update_styles)t.setAttrib(e,s.cssText);},setAttrib:function(e,n,v){var t=this;if(t.settings.strict)n=n.toLowerCase();return this.run(e,function(e){var s=t.settings;switch(n){case"style":if(s.keep_values){if(v)e.setAttribute('mce_style',v,2);else e.removeAttribute('mce_style',2);}e.style.cssText=v;break;case"class":e.className=v;break;case"src":case"href":if(s.keep_values){if(s.url_converter)v=s.url_converter.call(s.url_converter_scope||t,v,n,e);t.setAttrib(e,'mce_'+n,v,2);}break;}if(is(v)&&v!==null&&v.length!==0)e.setAttribute(n,''+v,2);else e.removeAttribute(n,2);});},setAttribs:function(e,o){var t=this;return this.run(e,function(e){each(o,function(v,n){t.setAttrib(e,n,v);});});},getAttrib:function(e,n,dv){var v,t=this;e=t.get(e);if(!e)return false;if(!is(dv))dv="";if(/^(src|href|style|coords)$/.test(n)){v=e.getAttribute("mce_"+n);if(v)return v;}v=e.getAttribute(n,2);if(!v){switch(n){case'class':v=e.className;break;default:v=e.attributes[n];v=v&&is(v.nodeValue)?v.nodeValue:v;}}switch(n){case'style':v=v||e.style.cssText;if(v){v=t.serializeStyle(t.parseStyle(v));if(t.settings.keep_values)e.setAttribute('mce_style',v);}break;}if(isWebKit&&n==="class"&&v)v=v.replace(/(apple|webkit)\-[a-z\-]+/gi,'');if(isIE){switch(n){case'rowspan':case'colspan':if(v===1)v='';break;case'size':if(v==='+0')v='';break;case'hspace':if(v===-1)v='';break;case'tabindex':if(v===32768)v='';break;case'shape':v=v.toLowerCase();break;default:if(n.indexOf('on')===0&&v)v=(''+v).replace(/^function\s+anonymous\(\)\s+\{\s+(.*)\s+\}$/,'$1');}}return(v&&v!='')?''+v:dv;},getPos:function(n){var t=this,x=0,y=0,e,d=t.doc,r;n=t.get(n);if(n&&isIE){n=n.getBoundingClientRect();e=t.boxModel?d.documentElement:d.body;x=t.getStyle(t.select('html')[0],'borderWidth');x=(x=='medium'||t.boxModel&&!t.isIE6)&&2||x;n.top+=window.self!=window.top?2:0;return{x:n.left+e.scrollLeft-x,y:n.top+e.scrollTop-x};}r=n;while(r){x+=r.offsetLeft||0;y+=r.offsetTop||0;r=r.offsetParent;}r=n;while(r){x-=r.scrollLeft||0;y-=r.scrollTop||0;r=r.parentNode;if(r==d.body)break;}return{x:x,y:y};},parseStyle:function(st){var t=this,s=t.settings,o={};if(!st)return o;function compress(p,s,ot){var t,r,b,l;t=o[p+'-top'+s];if(!t)return;r=o[p+'-right'+s];if(t!=r)return;b=o[p+'-bottom'+s];if(r!=b)return;l=o[p+'-left'+s];if(b!=l)return;o[ot]=l;delete o[p+'-top'+s];delete o[p+'-right'+s];delete o[p+'-bottom'+s];delete o[p+'-left'+s];};function compress2(ta,a,b,c){var t;t=o[a];if(!t)return;t=o[b];if(!t)return;t=o[c];if(!t)return;o[ta]=o[a]+' '+o[b]+' '+o[c];delete o[a];delete o[b];delete o[c];};each(st.split(';'),function(v){var sv,ur=[];if(v){v=v.replace(/url\([^\)]+\)/g,function(v){ur.push(v);return'url('+ur.length+')';});v=v.split(':');sv=tinymce.trim(v[1]);sv=sv.replace(/url\(([^\)]+)\)/g,function(a,b){return ur[parseInt(b)-1];});sv=sv.replace(/rgb\([^\)]+\)/g,function(v){return t.toHex(v);});if(s.url_converter){sv=sv.replace(/url\([\'\"]?([^\)\'\"]+)[\'\"]?\)/g,function(x,c){return'url('+t.encode(s.url_converter.call(s.url_converter_scope||t,t.decode(c),'style',null))+')';});}o[tinymce.trim(v[0]).toLowerCase()]=sv;}});compress("border","","border");compress("border","-width","border-width");compress("border","-color","border-color");compress("border","-style","border-style");compress("padding","","padding");compress("margin","","margin");compress2('border','border-width','border-style','border-color');if(isIE){if(o.border=='medium none')o.border='';}return o;},serializeStyle:function(o){var s='';each(o,function(v,k){if(k&&v){switch(k){case'color':case'background-color':v=v.toLowerCase();break;}s+=(s?' ':'')+k+': '+v+';';}});return s;},loadCSS:function(u){var t=this,d=this.doc;if(!u)u='';each(u.split(','),function(u){if(t.files[u])return;t.files[u]=true;if(!d.createStyleSheet)t.add(t.select('head')[0],'link',{rel:'stylesheet',href:u});else d.createStyleSheet(u);});},addClass:function(e,c){return this.run(e,function(e){var o;if(!c)return 0;if(this.hasClass(e,c))return e.className;o=this.removeClass(e,c);return e.className=(o!=''?(o+' '):'')+c;});},removeClass:function(e,c){var t=this,re;return t.run(e,function(e){var v;if(t.hasClass(e,c)){if(!re)re=new RegExp("(^|\\s+)"+c+"(\\s+|$)","g");v=e.className.replace(re,' ');return e.className=tinymce.trim(v!=' '?v:'');}return e.className;});},hasClass:function(n,c){n=this.get(n);if(!n||!c)return false;return(' '+n.className+' ').indexOf(' '+c+' ')!==-1;},show:function(e){return this.setStyle(e,'display','block');},hide:function(e){return this.setStyle(e,'display','none');},isHidden:function(e){e=this.get(e);return e.style.display=='none'||this.getStyle(e,'display')=='none';},uniqueId:function(p){return(!p?'mce_':p)+(this.counter++);},setHTML:function(e,h){var t=this;return this.run(e,function(e){var x;h=t.processHTML(h);if(isIE){try{e.innerHTML='<br />'+h;e.removeChild(e.firstChild);}catch(ex){x=t.create('div');x.innerHTML='<br />'+h;each(x.childNodes,function(n,i){if(i>1)e.appendChild(n);});}}else e.innerHTML=h;return h;});},processHTML:function(h){var t=this,s=t.settings;if(!s.process_html)return h;if(tinymce.isGecko){h=h.replace(/<(\/?)strong>|<strong( [^>]+)>/gi,'<$1b$2>');h=h.replace(/<(\/?)em>|<em( [^>]+)>/gi,'<$1i$2>');}h=h.replace(/<a( )([^>]+)\/>|<a\/>/gi,'<a$1$2></a>');if(s.keep_values){if(h.indexOf('<script')!==-1){h=h.replace(/<script>/g,'<script type="text/javascript">');h=h.replace(/<script(|[^>]+)>(\s*<!--|\/\/\s*<\[CDATA\[)?[\r\n]*/g,'<mce:script$1><!--\n');h=h.replace(/\s*(\/\/\s*-->|\/\/\s*]]>)?<\/script>/g,'\n// --></mce:script>');h=h.replace(/<mce:script(|[^>]+)><!--\n\/\/ --><\/mce:script>/g,'<mce:script$1></mce:script>');}h=h.replace(/<([\w:]+) [^>]*(src|href|style|coords)[^>]*>/gi,function(a,n){function handle(m,b,c){var u=c;if(a.indexOf('mce_'+b)!=-1)return m;if(b=='style'){if(s.hex_colors){u=u.replace(/rgb\([^\)]+\)/g,function(v){return t.toHex(v);});}if(s.url_converter){u=u.replace(/url\([\'\"]?([^\)\'\"]+)\)/g,function(x,c){return'url('+t.encode(s.url_converter.call(s.url_converter_scope||t,t.decode(c),b,n))+')';});}}else if(b!='coords'){if(s.url_converter)u=t.encode(s.url_converter.call(s.url_converter_scope||t,t.decode(c),b,n));}return' '+b+'="'+c+'" mce_'+b+'="'+u+'"';};a=a.replace(/ (src|href|style|coords)=[\"]([^\"]+)[\"]/gi,handle);a=a.replace(/ (src|href|style|coords)=[\']([^\']+)[\']/gi,handle);return a.replace(/ (src|href|style|coords)=([^\s\"\'>]+)/gi,handle);});}return h;},getOuterHTML:function(e){var d;e=this.get(e);if(!e)return null;if(isIE)return e.outerHTML;d=(e.ownerDocument||this.doc).createElement("body");d.appendChild(e.cloneNode(true));return d.innerHTML;},setOuterHTML:function(e,h,d){var t=this;return this.run(e,function(e){var n,tp;e=t.get(e);d=d||e.ownerDocument||t.doc;if(isIE&&e.nodeType==1)e.outerHTML=h;else{tp=d.createElement("body");tp.innerHTML=h;n=tp.lastChild;while(n){t.insertAfter(n.cloneNode(true),e);n=n.previousSibling;}t.remove(e);}});},decode:function(s){var e=document.createElement("div");e.innerHTML=s;return!e.firstChild?s:e.firstChild.nodeValue;},encode:function(s){return s?(''+s).replace(/[<>&\"]/g,function(c,b){switch(c){case'&':return'&';case'"':return'"';case'<':return'<';case'>':return'>';}return c;}):s;},insertAfter:function(n,r){var t=this;r=t.get(r);return this.run(n,function(n){var p,ns;p=r.parentNode;ns=r.nextSibling;if(ns)p.insertBefore(n,ns);else p.appendChild(n);return n;});},isBlock:function(n){if(n.nodeType&&n.nodeType!==1)return false;n=n.nodeName||n;return/^(H[1-6]|HR|P|DIV|ADDRESS|PRE|FORM|TABLE|LI|OL|UL|TD|CAPTION|BLOCKQUOTE|CENTER|DL|DT|DD|DIR|FIELDSET|FORM|NOSCRIPT|NOFRAMES|MENU|ISINDEX|SAMP)$/.test(n);},replace:function(n,o,k){if(is(o,'array'))n=n.cloneNode(true);return this.run(o,function(o){if(k){each(o.childNodes,function(c){n.appendChild(c.cloneNode(true));});}return o.parentNode.replaceChild(n,o);});},toHex:function(s){var c=/^\s*rgb\s*?\(\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?\)\s*$/i.exec(s);function hex(s){s=parseInt(s).toString(16);return s.length>1?s:'0'+s;};if(c){s='#'+hex(c[1])+hex(c[2])+hex(c[3]);return s;}return s;},getClasses:function(){var t=this,cl=[],i,lo={},f=t.settings.class_filter;if(t.classes)return t.classes;function addClasses(s){each(s.imports,function(r){addClasses(r);});each(s.cssRules||s.rules,function(r){switch(r.type||1){case 1:if(r.selectorText){each(r.selectorText.split(','),function(v){v=v.replace(/^\s*|\s*$|^\s\./g,"");if(f&&!(v=f(v)))return;if(/^\.mce/.test(v)||!/^\.[\w\-]+$/.test(v))return;v=v.substring(1);if(!lo[v]){cl.push({'class':v});lo[v]=1;}});}break;case 3:addClasses(r.styleSheet);break;}});};try{each(t.doc.styleSheets,addClasses);}catch(ex){}if(cl.length>0)t.classes=cl;return cl;},run:function(e,f,s){var t=this,o;if(typeof(e)==='string')e=t.doc.getElementById(e);if(!e)return false;s=s||this;if(!e.nodeType&&(e.length||e.length===0)){o=[];each(e,function(e,i){if(e){if(typeof(e)=='string')e=t.doc.getElementById(e);o.push(f.call(s,e,i));}});return o;}return f.call(s,e);}});tinymce.DOM=new tinymce.dom.DOMUtils(document,{process_html:0});})();(function(){var each=tinymce.each,DOM=tinymce.DOM,isIE=tinymce.isIE,isWebKit=tinymce.isWebKit,Event;tinymce.create('static tinymce.dom.Event',{inits:[],events:[],add:function(o,n,f,s){var cb,t=this,el=t.events,r;if(o&&o instanceof Array){r=[];each(o,function(o){o=DOM.get(o);r.push(t.add(o,n,f,s));});return r;}o=DOM.get(o);if(!o)return;cb=function(e){e=e||window.event;if(e&&!e.target&&isIE)e.target=e.srcElement;if(!s)return f(e);return f.call(s,e);};if(n=='unload'){tinymce.unloads.unshift({func:cb});return cb;}if(n=='init'){if(t.domLoaded)cb();else t.inits.push(cb);return cb;}el.push({obj:o,name:n,func:f,cfunc:cb,scope:s});t._add(o,n,cb);return f;},remove:function(o,n,f){var t=this,a=t.events,s=false,r;if(o&&o instanceof Array){r=[];each(o,function(o){o=DOM.get(o);r.push(t.remove(o,n,f));});return r;}o=DOM.get(o);each(a,function(e,i){if(e.obj==o&&e.name==n&&(!f||(e.func==f||e.cfunc==f))){a.splice(i,1);t._remove(o,n,e.cfunc);s=true;return false;}});return s;},cancel:function(e){if(!e)return false;this.stop(e);return this.prevent(e);},stop:function(e){if(e.stopPropagation)e.stopPropagation();else e.cancelBubble=true;return false;},prevent:function(e){if(e.preventDefault)e.preventDefault();else e.returnValue=false;return false;},_unload:function(){var t=Event;each(t.events,function(e,i){t._remove(e.obj,e.name,e.cfunc);e.obj=e.cfunc=null;});t.events=[];t=null;},_add:function(o,n,f){if(o.attachEvent)o.attachEvent('on'+n,f);else if(o.addEventListener)o.addEventListener(n,f,false);else o['on'+n]=f;},_remove:function(o,n,f){if(o.detachEvent)o.detachEvent('on'+n,f);else if(o.removeEventListener)o.removeEventListener(n,f,false);else o['on'+n]=null;},_pageInit:function(){var e=Event;e._remove(window,'DOMContentLoaded',e._pageInit);e.domLoaded=true;each(e.inits,function(c){c();});e.inits=[];},_wait:function(){var t;if(window.tinyMCE_GZ&&tinyMCE_GZ.loaded)return;if(isIE&&document.location.protocol!='https:'){document.write('<script id=__ie_onload defer src=\'javascript:""\';><\/script>');DOM.get("__ie_onload").onreadystatechange=function(){if(this.readyState=="complete"){Event._pageInit();DOM.get("__ie_onload").onreadystatechange=null;}};}else{Event._add(window,'DOMContentLoaded',Event._pageInit,Event);if(isIE||isWebKit){t=setInterval(function(){if(/loaded|complete/.test(document.readyState)){clearInterval(t);Event._pageInit();}},10);}}}});Event=tinymce.dom.Event;Event._wait();tinymce.addUnload(Event._unload);})();(function(){var each=tinymce.each;tinymce.create('tinymce.dom.Element',{Element:function(id,s){var t=this,dom,el;s=s||{};t.id=id;t.dom=dom=s.dom||tinymce.DOM;t.settings=s;if(!tinymce.isIE)el=t.dom.get(t.id);each(['getPos','getRect','getParent','add','setStyle','getStyle','setStyles','setAttrib','setAttribs','getAttrib','addClass','removeClass','hasClass','getOuterHTML','setOuterHTML','remove','show','hide','isHidden','setHTML','get'],function(k){t[k]=function(){var a=arguments,o;if(tinymce.isOpera){a=[id];each(arguments,function(v){a.push(v);});}else Array.prototype.unshift.call(a,el||id);o=dom[k].apply(dom,a);t.update(k);return o;};});},on:function(n,f,s){return tinymce.dom.Event.add(this.id,n,f,s);},getXY:function(){return{x:parseInt(this.getStyle('left')),y:parseInt(this.getStyle('top'))};},getSize:function(){var n=this.dom.get(this.id);return{w:parseInt(this.getStyle('width')||n.clientWidth),h:parseInt(this.getStyle('height')||n.clientHeight)};},moveTo:function(x,y){this.setStyles({left:x,top:y});},moveBy:function(x,y){var p=this.getXY();this.moveTo(p.x+x,p.y+y);},resizeTo:function(w,h){this.setStyles({width:w,height:h});},resizeBy:function(w,h){var s=this.getSize();this.resizeTo(s.w+w,s.h+h);},update:function(k){var t=this,b,dom=t.dom;if(tinymce.isIE6&&t.settings.blocker){k=k||'';if(k.indexOf('get')===0||k.indexOf('has')===0||k.indexOf('is')===0)return;if(k=='remove'){dom.remove(t.blocker);return;}if(!t.blocker){t.blocker=dom.uniqueId();b=dom.add(t.settings.container||dom.getRoot(),'iframe',{id:t.blocker,style:'position:absolute;',frameBorder:0,src:'javascript:""'});dom.setStyle(b,'opacity',0);}else b=dom.get(t.blocker);dom.setStyle(b,'left',t.getStyle('left',1));dom.setStyle(b,'top',t.getStyle('top',1));dom.setStyle(b,'width',t.getStyle('width',1));dom.setStyle(b,'height',t.getStyle('height',1));dom.setStyle(b,'display',t.getStyle('display',1));dom.setStyle(b,'zIndex',parseInt(t.getStyle('zIndex',1)||0)-1);}}});})();(function(){var is=tinymce.is,isIE=tinymce.isIE,each=tinymce.each;tinymce.create('tinymce.dom.Selection',{Selection:function(dom,win,serializer){var t=this;t.dom=dom;t.win=win;t.serializer=serializer;tinymce.addUnload(function(){t.win=null;});},getContent:function(s){var t=this,r=t.getRng(),e=t.dom.create("body"),se=t.getSel(),wb,wa,n;s=s||{};wb=wa='';s.get=true;s.format=s.format||'html';if(s.format=='text')return t.isCollapsed()?'':(r.text||(se.toString?se.toString():''));if(r.cloneContents){n=r.cloneContents();if(n)e.appendChild(n);}else if(is(r.item)||is(r.htmlText))e.innerHTML=r.item?r.item(0).outerHTML:r.htmlText;else e.innerHTML=r.toString();if(/^\s/.test(e.innerHTML))wb=' ';if(/\s+$/.test(e.innerHTML))wa=' ';s.getInner=true;return t.isCollapsed()?'':wb+t.serializer.serialize(e,s)+wa;},setContent:function(h,s){var t=this,r=t.getRng(),d;s=s||{format:'html'};s.set=true;h=t.dom.processHTML(h);if(r.insertNode){d=t.win.document;if(tinymce.isGecko&&h.indexOf('<')==-1){r.deleteContents();r.insertNode(t.getRng().createContextualFragment(h+'<span id="__caret">_</span>'));t.select(t.dom.get('__caret'));t.getRng().deleteContents();return;}if(d.queryCommandEnabled('InsertHTML'))return d.execCommand('InsertHTML',false,h);r.deleteContents();r.insertNode(t.getRng().createContextualFragment(h));}else{if(r.item)r.item(0).outerHTML=h;else r.pasteHTML(h);}},getStart:function(){var t=this,r=t.getRng(),e;if(isIE){if(r.item)return r.item(0);r=r.duplicate();r.collapse(1);e=r.parentElement();if(e.nodeName=='BODY')return e.firstChild;return e;}else{e=r.startContainer;if(e.nodeName=='BODY')return e.firstChild;return t.dom.getParent(e,function(n){return n.nodeType==1;});}},getEnd:function(){var t=this,r=t.getRng(),e;if(isIE){if(r.item)return r.item(0);r=r.duplicate();r.collapse(0);e=r.parentElement();if(e.nodeName=='BODY')return e.lastChild;return e;}else{e=r.endContainer;if(e.nodeName=='BODY')return e.lastChild;return t.dom.getParent(e,function(n){return n.nodeType==1;});}},getBookmark:function(si){var t=this,r=t.getRng(),tr,sx,sy,vp=t.dom.getViewPort(t.win),e,sp,bp,le,c=-0xFFFFFF,s,ro=t.dom.getRoot();sx=vp.x;sy=vp.y;if(si=='simple')return{rng:r,scrollX:sx,scrollY:sy};if(isIE){if(r.item){e=r.item(0);each(t.dom.select(e.nodeName),function(n,i){if(e==n){sp=i;return false;}});return{tag:e.nodeName,index:sp,scrollX:sx,scrollY:sy};}tr=t.dom.doc.body.createTextRange();tr.moveToElementText(ro);tr.collapse(true);bp=Math.abs(tr.move('character',c));tr=r.duplicate();tr.collapse(true);sp=Math.abs(tr.move('character',c));tr=r.duplicate();tr.collapse(false);le=Math.abs(tr.move('character',c))-sp;return{start:sp-bp,length:le,scrollX:sx,scrollY:sy};}e=t.getNode();s=t.getSel();if(!s)return null;if(e&&e.nodeName=='IMG'){return{scrollX:sx,scrollY:sy};}function getPos(r,sn,en){var w=document.createTreeWalker(r,NodeFilter.SHOW_TEXT,null,false),n,p=0,d={};while((n=w.nextNode())!=null){if(n==sn)d.start=p;if(n==en){d.end=p;return d;}p+=n.nodeValue?n.nodeValue.length:0;}return null;};if(s.anchorNode==s.focusNode&&s.anchorOffset==s.focusOffset){e=getPos(ro,s.anchorNode,s.focusNode);if(!e)return{scrollX:sx,scrollY:sy};return{start:e.start+s.anchorOffset,end:e.end+s.focusOffset,scrollX:sx,scrollY:sy};}else{e=getPos(ro,r.startContainer,r.endContainer);if(!e)return{scrollX:sx,scrollY:sy};return{start:e.start+r.startOffset,end:e.end+r.endOffset,scrollX:sx,scrollY:sy};}},moveToBookmark:function(b){var t=this,r=t.getRng(),s=t.getSel(),ro=t.dom.getRoot(),sd;function getPos(r,sp,ep){var w=document.createTreeWalker(r,NodeFilter.SHOW_TEXT,null,false),n,p=0,d={};while((n=w.nextNode())!=null){p+=n.nodeValue?n.nodeValue.length:0;if(p>=sp&&!d.startNode){d.startNode=n;d.startOffset=sp-(p-n.nodeValue.length);}if(p>=ep){d.endNode=n;d.endOffset=ep-(p-n.nodeValue.length);return d;}}return null;};if(!b)return false;t.win.scrollTo(b.scrollX,b.scrollY);if(isIE){if(r=b.rng){try{r.select();}catch(ex){}return true;}t.win.focus();if(b.tag){r=ro.createControlRange();each(t.dom.select(b.tag),function(n,i){if(i==b.index)r.addElement(n);});}else{try{if(b.start<0)return true;r=s.createRange();r.moveToElementText(ro);r.collapse(true);r.moveStart('character',b.start);r.moveEnd('character',b.length);}catch(ex2){return true;}}try{r.select();}catch(ex){}return true;}if(!s)return false;if(b.rng){s.removeAllRanges();s.addRange(b.rng);}else{if(is(b.start)&&is(b.end)){try{sd=getPos(ro,b.start,b.end);if(sd){r=t.dom.doc.createRange();r.setStart(sd.startNode,sd.startOffset);r.setEnd(sd.endNode,sd.endOffset);s.removeAllRanges();s.addRange(r);}if(!tinymce.isOpera)t.win.focus();}catch(ex){}}}},select:function(n,c){var t=this,r=t.getRng(),s=t.getSel(),b,fn,ln,d=t.win.document;function first(n){return n?d.createTreeWalker(n,NodeFilter.SHOW_TEXT,null,false).nextNode():null;};function last(n){var c,o,w;if(!n)return null;w=d.createTreeWalker(n,NodeFilter.SHOW_TEXT,null,false);while(c=w.nextNode())o=c;return o;};if(isIE){try{b=d.body;if(/^(IMG|TABLE)$/.test(n.nodeName)){r=b.createControlRange();r.addElement(n);}else{r=b.createTextRange();r.moveToElementText(n);}r.select();}catch(ex){}}else{if(c){fn=first(n);ln=last(n);if(fn&&ln){r=d.createRange();r.setStart(fn,0);r.setEnd(ln,ln.nodeValue.length);}else r.selectNode(n);}else r.selectNode(n);t.setRng(r);}return n;},isCollapsed:function(){var t=this,r=t.getRng(),s=t.getSel();if(!r||r.item)return false;return!s||r.boundingWidth==0||s.isCollapsed;},collapse:function(b){var t=this,r=t.getRng(),n;if(r.item){n=r.item(0);r=this.win.document.body.createTextRange();r.moveToElementText(n);}r.collapse(!!b);t.setRng(r);},getSel:function(){var t=this,w=this.win;return w.getSelection?w.getSelection():w.document.selection;},getRng:function(){var t=this,s=t.getSel(),r;try{if(s)r=s.rangeCount>0?s.getRangeAt(0):(s.createRange?s.createRange():t.win.document.createRange());}catch(ex){}if(!r)r=isIE?t.win.document.body.createTextRange():t.win.document.createRange();return r;},setRng:function(r){var s;if(!isIE){s=this.getSel();if(s){s.removeAllRanges();s.addRange(r);}}else{try{r.select();}catch(ex){}}},setNode:function(n){var t=this;t.setContent(t.dom.getOuterHTML(n));return n;},getNode:function(){var t=this,r=t.getRng(),s=t.getSel(),e;if(!isIE){if(!r)return t.dom.getRoot();e=r.commonAncestorContainer;if(!r.collapsed){if(r.startContainer==r.endContainer||(tinymce.isWebKit&&r.startContainer==r.endContainer.parentNode)){if(r.startOffset-r.endOffset<2||tinymce.isWebKit){if(r.startContainer.hasChildNodes())e=r.startContainer.childNodes[r.startOffset];}}}return t.dom.getParent(e,function(n){return n.nodeType==1;});}return r.item?r.item(0):r.parentElement();}});})();(function(){tinymce.create('tinymce.dom.XMLWriter',{node:null,XMLWriter:function(s){function getXML(){var i=document.implementation;if(!i||!i.createDocument){try{return new ActiveXObject('MSXML2.DOMDocument');}catch(ex){}try{return new ActiveXObject('Microsoft.XmlDom');}catch(ex){}}else return i.createDocument('','',null);};this.doc=getXML();this.reset();},reset:function(){var t=this,d=t.doc;if(d.firstChild)d.removeChild(d.firstChild);t.node=d.appendChild(d.createElement("html"));},writeStartElement:function(n){var t=this;t.node=t.node.appendChild(t.doc.createElement(n));},writeAttribute:function(n,v){if(tinymce.isOpera)v=v.replace(/>/g,'|>');this.node.setAttribute(n,v);},writeEndElement:function(){this.node=this.node.parentNode;},writeFullEndElement:function(){var t=this,n=t.node;n.appendChild(t.doc.createTextNode(""));t.node=n.parentNode;},writeText:function(v){if(tinymce.isOpera)v=v.replace(/>/g,'|>');this.node.appendChild(this.doc.createTextNode(v));},writeCDATA:function(v){this.node.appendChild(this.doc.createCDATA(v));},writeComment:function(v){this.node.appendChild(this.doc.createComment(v));},getContent:function(){var h;h=this.doc.xml||new XMLSerializer().serializeToString(this.doc);h=h.replace(/<\?[^?]+\?>|<html>|<\/html>|<html\/>|<!DOCTYPE[^>]+>/g,'');h=h.replace(/ ?\/>/g,' />');if(tinymce.isOpera)h=h.replace(/\|>/g,'>');return h;}});})();(function(){var extend=tinymce.extend,each=tinymce.each,Dispatcher=tinymce.util.Dispatcher,isIE=tinymce.isIE;function getIEAtts(n){var o=[];if(n.nodeName=='OBJECT')return n.attributes;n.cloneNode(false).outerHTML.replace(/([a-z0-9\-_]+)=/gi,function(a,b){o.push({specified:1,nodeName:b});});return o;};function wildcardToRE(s){return s.replace(/([?+*])/g,'.$1');};tinymce.create('tinymce.dom.Serializer',{Serializer:function(s){var t=this;t.key=0;t.onPreProcess=new Dispatcher(t);t.onPostProcess=new Dispatcher(t);t.writer=new tinymce.dom.XMLWriter();t.settings=s=extend({dom:tinymce.DOM,valid_nodes:0,node_filter:0,attr_filter:0,invalid_attrs:/^(mce_|_moz_$)/,closed:/(br|hr|input|meta|img|link|param)/,entity_encoding:'named',entities:'160,nbsp,161,iexcl,162,cent,163,pound,164,curren,165,yen,166,brvbar,167,sect,168,uml,169,copy,170,ordf,171,laquo,172,not,173,shy,174,reg,175,macr,176,deg,177,plusmn,178,sup2,179,sup3,180,acute,181,micro,182,para,183,middot,184,cedil,185,sup1,186,ordm,187,raquo,188,frac14,189,frac12,190,frac34,191,iquest,192,Agrave,193,Aacute,194,Acirc,195,Atilde,196,Auml,197,Aring,198,AElig,199,Ccedil,200,Egrave,201,Eacute,202,Ecirc,203,Euml,204,Igrave,205,Iacute,206,Icirc,207,Iuml,208,ETH,209,Ntilde,210,Ograve,211,Oacute,212,Ocirc,213,Otilde,214,Ouml,215,times,216,Oslash,217,Ugrave,218,Uacute,219,Ucirc,220,Uuml,221,Yacute,222,THORN,223,szlig,224,agrave,225,aacute,226,acirc,227,atilde,228,auml,229,aring,230,aelig,231,ccedil,232,egrave,233,eacute,234,ecirc,235,euml,236,igrave,237,iacute,238,icirc,239,iuml,240,eth,241,ntilde,242,ograve,243,oacute,244,ocirc,245,otilde,246,ouml,247,divide,248,oslash,249,ugrave,250,uacute,251,ucirc,252,uuml,253,yacute,254,thorn,255,yuml,402,fnof,913,Alpha,914,Beta,915,Gamma,916,Delta,917,Epsilon,918,Zeta,919,Eta,920,Theta,921,Iota,922,Kappa,923,Lambda,924,Mu,925,Nu,926,Xi,927,Omicron,928,Pi,929,Rho,931,Sigma,932,Tau,933,Upsilon,934,Phi,935,Chi,936,Psi,937,Omega,945,alpha,946,beta,947,gamma,948,delta,949,epsilon,950,zeta,951,eta,952,theta,953,iota,954,kappa,955,lambda,956,mu,957,nu,958,xi,959,omicron,960,pi,961,rho,962,sigmaf,963,sigma,964,tau,965,upsilon,966,phi,967,chi,968,psi,969,omega,977,thetasym,978,upsih,982,piv,8226,bull,8230,hellip,8242,prime,8243,Prime,8254,oline,8260,frasl,8472,weierp,8465,image,8476,real,8482,trade,8501,alefsym,8592,larr,8593,uarr,8594,rarr,8595,darr,8596,harr,8629,crarr,8656,lArr,8657,uArr,8658,rArr,8659,dArr,8660,hArr,8704,forall,8706,part,8707,exist,8709,empty,8711,nabla,8712,isin,8713,notin,8715,ni,8719,prod,8721,sum,8722,minus,8727,lowast,8730,radic,8733,prop,8734,infin,8736,ang,8743,and,8744,or,8745,cap,8746,cup,8747,int,8756,there4,8764,sim,8773,cong,8776,asymp,8800,ne,8801,equiv,8804,le,8805,ge,8834,sub,8835,sup,8836,nsub,8838,sube,8839,supe,8853,oplus,8855,otimes,8869,perp,8901,sdot,8968,lceil,8969,rceil,8970,lfloor,8971,rfloor,9001,lang,9002,rang,9674,loz,9824,spades,9827,clubs,9829,hearts,9830,diams,338,OElig,339,oelig,352,Scaron,353,scaron,376,Yuml,710,circ,732,tilde,8194,ensp,8195,emsp,8201,thinsp,8204,zwnj,8205,zwj,8206,lrm,8207,rlm,8211,ndash,8212,mdash,8216,lsquo,8217,rsquo,8218,sbquo,8220,ldquo,8221,rdquo,8222,bdquo,8224,dagger,8225,Dagger,8240,permil,8249,lsaquo,8250,rsaquo,8364,euro',valid_elements:'*[*]',extended_valid_elements:0,valid_child_elements:0,invalid_elements:0,fix_table_elements:0,fix_list_elements:true,fix_content_duplication:true,convert_fonts_to_spans:false,font_size_classes:0,font_size_style_values:0,apply_source_formatting:0,indent_mode:'simple',indent_char:'\t',indent_levels:1,remove_linebreaks:1},s);t.dom=s.dom;if(s.fix_list_elements){t.onPreProcess.add(function(se,o){var nl,x,a=['ol','ul'],i,n,p,r=/^(OL|UL)$/,np;function prevNode(e,n){var a=n.split(','),i;while((e=e.previousSibling)!=null){for(i=0;i<a.length;i++){if(e.nodeName==a[i])return e;}}return null;};for(x=0;x<a.length;x++){nl=t.dom.select(a[x],o.node);for(i=0;i<nl.length;i++){n=nl[i];p=n.parentNode;if(r.test(p.nodeName)){np=prevNode(n,'LI');if(!np){np=t.dom.create('li');np.innerHTML=' ';np.appendChild(n);p.insertBefore(np,p.firstChild);}else np.appendChild(n);}}}});}if(s.fix_table_elements){t.onPreProcess.add(function(se,o){var ta=[],d=t.dom.doc;each(t.dom.select('table',o.node),function(e){var pa=t.dom.getParent(e,'H1,H2,H3,H4,H5,H6,P'),p=[],i,h;if(pa){t.dom.getParent(e,function(n){if(n!=e)p.push(n.nodeName);});h='';for(i=0;i<p.length;i++)h+='</'+p[i]+'>';h+=t.dom.getOuterHTML(e);for(i=p.length-1;i>=0;i--)h+='<'+p[i]+'>';ta.push(h);e.parentNode.replaceChild(d.createComment('mcetable:'+(ta.length-1)),e);}});t.dom.setHTML(o.node,o.node.innerHTML.replace(/<!--mcetable:([0-9]+)-->/g,function(a,b){return ta[parseInt(b)];}));});}},setEntities:function(s){var t=this,a,i,l={},re='',v;if(t.entityLookup)return;a=s.split(',');for(i=0;i<a.length;i+=2){v=a[i];if(v==34||v==38||v==60||v==62)continue;l[String.fromCharCode(a[i])]=a[i+1];v=parseInt(a[i]).toString(16);re+='\\u'+'0000'.substring(v.length)+v;}if(!re){t.settings.entity_encoding='raw';return;}t.entitiesRE=new RegExp('['+re+']','g');t.entityLookup=l;},setValidChildRules:function(s){this.childRules=null;this.addValidChildRules(s);},addValidChildRules:function(s){var t=this,inst,intr,bloc;if(!s)return;inst='A|BR|SPAN|BDO|MAP|OBJECT|IMG|TT|I|B|BIG|SMALL|EM|STRONG|DFN|CODE|Q|SAMP|KBD|VAR|CITE|ABBR|ACRONYM|SUB|SUP|#text|#comment';intr='A|BR|SPAN|BDO|OBJECT|APPLET|IMG|MAP|IFRAME|TT|I|B|U|S|STRIKE|BIG|SMALL|FONT|BASEFONT|EM|STRONG|DFN|CODE|Q|SAMP|KBD|VAR|CITE|ABBR|ACRONYM|SUB|SUP|INPUT|SELECT|TEXTAREA|LABEL|BUTTON|#text|#comment';bloc='H[1-6]|P|DIV|ADDRESS|PRE|FORM|TABLE|LI|OL|UL|TD|CAPTION|BLOCKQUOTE|CENTER|DL|DT|DD|DIR|FIELDSET|FORM|NOSCRIPT|NOFRAMES|MENU|ISINDEX|SAMP';each(s.split(','),function(s){var p=s.split(/\[|\]/),re;s='';each(p[1].split('|'),function(v){if(s)s+='|';switch(v){case'%itrans':v=intr;break;case'%itrans_na':v=intr.substring(2);break;case'%istrict':v=inst;break;case'%istrict_na':v=inst.substring(2);break;case'%btrans':v=bloc;break;case'%bstrict':v=bloc;break;}s+=v;});re=new RegExp('^('+s.toLowerCase()+')$','i');each(p[0].split('/'),function(s){t.childRules=t.childRules||{};t.childRules[s]=re;});});s='';each(t.childRules,function(v,k){if(s)s+='|';s+=k;});t.parentElementsRE=new RegExp('^('+s.toLowerCase()+')$','i');},setRules:function(s){var t=this;t._setup();t.rules={};t.wildRules=[];t.validElements={};return t.addRules(s);},addRules:function(s){var t=this,dr;if(!s)return;t._setup();each(s.split(','),function(s){var p=s.split(/\[|\]/),tn=p[0].split('/'),ra,at,wat,va=[];if(dr)at=tinymce.extend([],dr.attribs);if(p.length>1){each(p[1].split('|'),function(s){var ar={},i;at=at||[];s=s.replace(/::/g,'~');s=/^([!\-])?([\w*.?~]+|)([=:<])?(.+)?$/.exec(s);s[2]=s[2].replace(/~/g,':');if(s[1]=='!'){ra=ra||[];ra.push(s[2]);}if(s[1]=='-'){for(i=0;i<at.length;i++){if(at[i].name==s[2]){at.splice(i,1);return;}}}switch(s[3]){case'=':ar.defaultVal=s[4]||'';break;case':':ar.forcedVal=s[4];break;case'<':ar.validVals=s[4].split('?');break;}if(/[*.?]/.test(s[2])){wat=wat||[];ar.nameRE=new RegExp('^'+wildcardToRE(s[2])+'$');wat.push(ar);}else{ar.name=s[2];at.push(ar);}va.push(s[2]);});}each(tn,function(s,i){var pr=s.charAt(0),x=1,ru={};if(dr){if(dr.noEmpty)ru.noEmpty=dr.noEmpty;if(dr.fullEnd)ru.fullEnd=dr.fullEnd;if(dr.padd)ru.padd=dr.padd;}switch(pr){case'-':ru.noEmpty=true;break;case'+':ru.fullEnd=true;break;case'#':ru.padd=true;break;default:x=0;}tn[i]=s=s.substring(x);t.validElements[s]=1;if(/[*.?]/.test(tn[0])){ru.nameRE=new RegExp('^'+wildcardToRE(tn[0])+'$');t.wildRules=t.wildRules||{};t.wildRules.push(ru);}else{ru.name=tn[0];if(tn[0]=='@')dr=ru;t.rules[s]=ru;}ru.attribs=at;if(ra)ru.requiredAttribs=ra;if(wat){s='';each(va,function(v){if(s)s+='|';s+='('+wildcardToRE(v)+')';});ru.validAttribsRE=new RegExp('^'+s.toLowerCase()+'$');ru.wildAttribs=wat;}});});s='';each(t.validElements,function(v,k){if(s)s+='|';if(k!='@')s+=k;});t.validElementsRE=new RegExp('^('+wildcardToRE(s.toLowerCase())+')$');},findRule:function(n){var t=this,rl=t.rules,i,r;t._setup();r=rl[n];if(r)return r;rl=t.wildRules;for(i=0;i<rl.length;i++){if(rl[i].nameRE.test(n))return rl[i];}return null;},findAttribRule:function(ru,n){var i,wa=ru.wildAttribs;for(i=0;i<wa.length;i++){if(wa[i].nameRE.test(n))return wa[i];}return null;},serialize:function(n,o){var h,t=this;t._setup();o=o||{};o.format=o.format||'html';t.processObj=o;n=n.cloneNode(true);t.key=''+(parseInt(t.key)+1);if(!o.no_events){o.node=n;t.onPreProcess.dispatch(t,o);}t.writer.reset();t._serializeNode(n,o.getInner);o.content=t.writer.getContent();if(!o.no_events)t.onPostProcess.dispatch(t,o);t._postProcess(o);o.node=null;return tinymce.trim(o.content);},_postProcess:function(o){var t=this,s=t.settings,h=o.content,sc=[],p,l;if(o.format=='html'){p=t._protect({content:h,patterns:[/(<script[^>]*>)(.*?)(<\/script>)/g,/(<style[^>]*>)(.*?)(<\/style>)/g,/(<pre[^>]*>)(.*?)(<\/pre>)/g]});h=p.content;if(s.entity_encoding!=='raw'){if(s.entity_encoding.indexOf('named')!=-1){t.setEntities(s.entities);l=t.entityLookup;h=h.replace(t.entitiesRE,function(a){var v;if(v=l[a])a='&'+v+';';return a;});}if(s.entity_encoding.indexOf('numeric')!=-1){h=h.replace(/[\u007E-\uFFFF]/g,function(a){return'&#'+a.charCodeAt(0)+';';});}}if(o.set)h=h.replace(/<p>\s+( | |\u00a0|<br \/>)\s+<\/p>/g,'<p><br /></p>');else h=h.replace(/<p>\s+( | |\u00a0|<br \/>)\s+<\/p>/g,'<p>$1</p>');if(!o.set){if(s.remove_linebreaks){h=h.replace(/(<[^>]+>)\s+/g,'$1 ');h=h.replace(/\s+(<\/[^>]+>)/g,' $1');h=h.replace(/<(p|h[1-6]|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object) ([^>]+)>\s+/g,'<$1 $2>');h=h.replace(/<(p|h[1-6]|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object)>\s+/g,'<$1>');h=h.replace(/\s+<\/(p|h[1-6]|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object)>/g,'</$1>');}if(s.apply_source_formatting&&s.indent_mode=='simple'){h=h.replace(/<(\/?)(ul|hr|table|meta|link|tbody|tr|object|body|head|html|map)(|[^>]+)>\s*/g,'\n<$1$2$3>\n');h=h.replace(/\s*<(p|h[1-6]|div|title|style|pre|script|td|li|area)(|[^>]+)>/g,'\n<$1$2>');h=h.replace(/<\/(p|h[1-6]|div|title|style|pre|script|td|li)>\s*/g,'</$1>\n');h=h.replace(/\n\n/g,'\n');}}h=t._unprotect(h,p);}o.content=h;},_serializeNode:function(n,inn){var t=this,s=t.settings,w=t.writer,hc,el,cn,i,l,a,at,no,v,nn,ru,ar,iv;if(!s.node_filter||s.node_filter(n)){switch(n.nodeType){case 1:if(n.hasAttribute?n.hasAttribute('mce_bogus'):n.getAttribute('mce_bogus'))return;iv=false;hc=n.hasChildNodes();nn=n.getAttribute('mce_name')||n.nodeName.toLowerCase();if(isIE){if(n.scopeName!=='HTML'&&n.scopeName!=='html')nn=n.scopeName+':'+nn;}if(nn.indexOf('mce:')===0)nn=nn.substring(4);if(!t.validElementsRE.test(nn)||(t.invalidElementsRE&&t.invalidElementsRE.test(nn))||inn){iv=true;break;}if(isIE){if(s.fix_content_duplication){if(n.mce_serialized==t.key)return;n.mce_serialized=t.key;}if(nn.charAt(0)=='/')nn=nn.substring(1);}if(t.childRules){if(t.parentElementsRE.test(t.elementName)){if(!t.childRules[t.elementName].test(nn)){iv=true;break;}}t.elementName=nn;}ru=t.findRule(nn);nn=ru.name||nn;if((!hc&&ru.noEmpty)||(isIE&&!nn)){iv=true;break;}if(ru.requiredAttribs){a=ru.requiredAttribs;for(i=a.length-1;i>=0;i--){if(this.dom.getAttrib(n,a[i])!=='')break;}if(i==-1){iv=true;break;}}w.writeStartElement(nn);if(ru.attribs){for(i=0,at=ru.attribs,l=at.length;i<l;i++){a=at[i];v=t._getAttrib(n,a);if(v!==null)w.writeAttribute(a.name,v);}}if(ru.validAttribsRE){at=isIE?getIEAtts(n):n.attributes;for(i=at.length-1;i>-1;i--){no=at[i];if(no.specified){a=no.nodeName.toLowerCase();if(s.invalid_attrs.test(a)||!ru.validAttribsRE.test(a))continue;ar=t.findAttribRule(ru,a);v=t._getAttrib(n,ar,a);if(v!==null)w.writeAttribute(a,v);}}}if(!hc&&ru.padd)w.writeText('\u00a0');break;case 3:if(t.childRules&&t.parentElementsRE.test(t.elementName)){if(!t.childRules[t.elementName].test(n.nodeName))return;}return w.writeText(n.nodeValue);case 4:return w.writeCDATA(n.nodeValue);case 8:return w.writeComment(n.nodeValue);}}else if(n.nodeType==1)hc=n.hasChildNodes();if(hc){cn=n.firstChild;while(cn){t._serializeNode(cn);t.elementName=nn;cn=cn.nextSibling;}}if(!iv){if(hc||!s.closed.test(nn))w.writeFullEndElement();else w.writeEndElement();}},_protect:function(o){o.items=o.items||[];function enc(s){return s.replace(/[\r\n]/g,function(c){if(c==='\n')return'\\n';return'\\r';});};function dec(s){return s.replace(/\\[rn]/g,function(c){if(c==='\\n')return'\n';return'\r';});};each(o.patterns,function(p){o.content=dec(enc(o.content).replace(p,function(x,a,b,c){o.items.push(dec(b));return a+'<!--mce:'+(o.items.length-1)+'-->'+c;}));});return o;},_unprotect:function(h,o){h=h.replace(/\<!--mce:([0-9]+)--\>/g,function(a,b){return o.items[parseInt(b)];});o.items=[];return h;},_setup:function(){var t=this,s=this.settings;if(t.done)return;t.done=1;t.setRules(s.valid_elements);t.addRules(s.extended_valid_elements);t.addValidChildRules(s.valid_child_elements);if(s.invalid_elements)t.invalidElementsRE=new RegExp('^('+wildcardToRE(s.invalid_elements.replace(',','|').toLowerCase())+')$');if(s.attrib_value_filter)t.attribValueFilter=s.attribValueFilter;},_getAttrib:function(n,a,na){var i,v;na=na||a.name;if(a.forcedVal&&(v=a.forcedVal)){if(v==='{$uid}')return this.dom.uniqueId();return v;}v=this.dom.getAttrib(n,na);switch(na){case'rowspan':case'colspan':if(v=='1')v='';break;}if(this.attribValueFilter)v=this.attribValueFilter(na,v,n);if(a.validVals){for(i=a.validVals.length-1;i>=0;i--){if(v==a.validVals[i])break;}if(i==-1)return null;}if(v===''&&typeof(a.defaultVal)!='undefined'){v=a.defaultVal;if(v==='{$uid}')return this.dom.uniqueId();return v;}else{if(na=='class'&&this.processObj.get)v=v.replace(/\bmceItem\w+\b/g,'');}if(v==='')return null;return v;}});})();(function(){var each=tinymce.each;tinymce.create('tinymce.dom.ScriptLoader',{ScriptLoader:function(s){this.settings=s||{};this.queue=[];this.lookup={};},markDone:function(u){this.lookup[u]={state:2,url:u};},add:function(u,cb,s,pr){var t=this,lo=t.lookup,o;if(o=lo[u]){if(cb&&o.state==2)cb.call(s||this);return o;}o={state:0,url:u,func:cb,scope:s||this};if(pr)t.queue.unshift(o);else t.queue.push(o);lo[u]=o;return o;},load:function(u,cb,s){var t=this,o;function loadScript(u){if(tinymce.dom.Event.domLoaded||t.settings.strict_mode){tinymce.util.XHR.send({url:u,error:t.settings.error,async:false,success:function(co){t.eval(co);}});}else document.write('<script type="text/javascript" src="'+u+'"></script>');};if(!tinymce.is(u,'string')){each(u,function(u){loadScript(u);});if(cb)cb.call(s||t);}else{loadScript(u);if(cb)cb.call(s||t);}},loadQueue:function(cb,s){var t=this;if(!t.queueLoading){t.queueLoading=1;t.queueCallbacks=[];t.loadScripts(t.queue,function(){t.queueLoading=0;if(cb)cb.call(s||t);each(t.queueCallbacks,function(o){o.func.call(o.scope);});});}else if(cb)t.queueCallbacks.push({func:cb,scope:s||t});},eval:function(co){var w=window;if(!w.execScript){try{eval.call(w,co);}catch(ex){eval(co,w);}}else w.execScript(co);},loadScripts:function(sc,cb,s){var t=this,lo=t.lookup;function done(o){o.state=2;if(o.func)o.func.call(o.scope||t);};function allDone(){var l;l=sc.length;each(sc,function(o){o=lo[o.url];if(o.state===2){done(o);l--;}else load(o);});if(l===0&&cb){cb.call(s||t);cb=0;}};function load(o){if(o.state>0)return;o.state=1;tinymce.util.XHR.send({url:o.url,error:t.settings.error,success:function(co){t.eval(co);done(o);allDone();}});};each(sc,function(o){var u=o.url;if(!lo[u]){lo[u]=o;t.queue.push(o);}else o=lo[u];if(o.state>0)return;if(!tinymce.dom.Event.domLoaded&&!t.settings.strict_mode){var ix,ol='';if(cb||o.func){o.state=1;ix=tinymce.dom.ScriptLoader._addOnLoad(function(){done(o);allDone();});if(tinymce.isIE)ol=' onreadystatechange="';else ol=' onload="';ol+='tinymce.dom.ScriptLoader._onLoad(this,\''+u+'\','+ix+');"';}document.write('<script type="text/javascript" src="'+u+'"'+ol+'></script>');if(!o.func)done(o);}else load(o);});allDone();},'static':{_addOnLoad:function(f){var t=this;t._funcs=t._funcs||[];t._funcs.push(f);return t._funcs.length-1;},_onLoad:function(e,u,ix){if(!tinymce.isIE||e.readyState=='complete')this._funcs[ix].call(this);}}});tinymce.ScriptLoader=new tinymce.dom.ScriptLoader();})();(function(){var DOM=tinymce.DOM,is=tinymce.is;tinymce.create('tinymce.ui.Control',{Control:function(id,s){this.id=id;this.settings=s=s||{};this.rendered=false;this.onRender=new tinymce.util.Dispatcher(this);this.classPrefix='';this.scope=s.scope||this;this.disabled=0;this.active=0;},setDisabled:function(s){var e;if(s!=this.disabled){e=DOM.get(this.id);if(e&&this.settings.unavailable_prefix){if(s){this.prevTitle=e.title;e.title=this.settings.unavailable_prefix+": "+e.title;}else e.title=this.prevTitle;}this.setState('Disabled',s);this.setState('Enabled',!s);this.disabled=s;}},isDisabled:function(){return this.disabled;},setActive:function(s){if(s!=this.active){this.setState('Active',s);this.active=s;}},isActive:function(){return this.active;},setState:function(c,s){var n=DOM.get(this.id);c=this.classPrefix+c;if(s)DOM.addClass(n,c);else DOM.removeClass(n,c);},isRendered:function(){return this.rendered;},renderHTML:function(){},renderTo:function(n){DOM.setHTML(n,this.renderHTML());},postRender:function(){var t=this,b;if(is(t.disabled)){b=t.disabled;t.disabled=-1;t.setDisabled(b);}if(is(t.active)){b=t.active;t.active=-1;t.setActive(b);}},destroy:function(){DOM.remove(this.id);}});})();tinymce.create('tinymce.ui.Container:tinymce.ui.Control',{Container:function(id,s){this.parent(id,s);this.controls=[];this.lookup={};},add:function(c){this.lookup[c.id]=c;this.controls.push(c);return c;},get:function(n){return this.lookup[n];}});tinymce.create('tinymce.ui.Separator:tinymce.ui.Control',{renderHTML:function(){return tinymce.DOM.createHTML('span',{'class':'mceSeparator'});}});(function(){var is=tinymce.is,DOM=tinymce.DOM,each=tinymce.each,walk=tinymce.walk;tinymce.create('tinymce.ui.MenuItem:tinymce.ui.Control',{MenuItem:function(id,s){this.parent(id,s);this.classPrefix='mceMenuItem';},setSelected:function(s){this.setState('Selected',s);this.selected=s;},isSelected:function(){return this.selected;},postRender:function(){var t=this;t.parent();if(is(t.selected))t.setSelected(t.selected);}});})();(function(){var is=tinymce.is,DOM=tinymce.DOM,each=tinymce.each,walk=tinymce.walk;tinymce.create('tinymce.ui.Menu:tinymce.ui.MenuItem',{Menu:function(id,s){var t=this;t.parent(id,s);t.items={};t.collapsed=false;t.menuCount=0;t.onAddItem=new tinymce.util.Dispatcher(this);},expand:function(d){var t=this;if(d){walk(t,function(o){if(o.expand)o.expand();},'items',t);}t.collapsed=false;},collapse:function(d){var t=this;if(d){walk(t,function(o){if(o.collapse)o.collapse();},'items',t);}t.collapsed=true;},isCollapsed:function(){return this.collapsed;},add:function(o){if(!o.settings)o=new tinymce.ui.MenuItem(o.id||DOM.uniqueId(),o);this.onAddItem.dispatch(this,o);return this.items[o.id]=o;},addSeparator:function(){return this.add({separator:true});},addMenu:function(o){if(!o.collapse)o=this.createMenu(o);this.menuCount++;return this.add(o);},hasMenus:function(){return this.menuCount!==0;},remove:function(o){delete this.items[o.id];},removeAll:function(){var t=this;walk(t,function(o){if(o.removeAll)o.removeAll();o.destroy();},'items',t);t.items={};},createMenu:function(o){var m=new tinymce.ui.Menu(o.id||DOM.uniqueId(),o);m.onAddItem.add(this.onAddItem.dispatch,this.onAddItem);return m;}});})();(function(){var is=tinymce.is,DOM=tinymce.DOM,each=tinymce.each,Event=tinymce.dom.Event,Element=tinymce.dom.Element;tinymce.create('tinymce.ui.DropMenu:tinymce.ui.Menu',{DropMenu:function(id,s){s=s||{};s.container=s.container||document.body;s.offset_x=s.offset_x||0;s.offset_y=s.offset_y||0;s.vp_offset_x=s.vp_offset_x||0;s.vp_offset_y=s.vp_offset_y||0;if(is(s.icons)&&!s.icons)s['class']+=' noIcons';this.parent(id,s);this.onHideMenu=new tinymce.util.Dispatcher(this);this.classPrefix='mceMenu';},createMenu:function(s){var t=this,cs=t.settings,m;s.container=s.container||cs.container;s.parent=t;s.constrain=s.constrain||cs.constrain;s['class']=s['class']||cs['class'];s.vp_offset_x=s.vp_offset_x||cs.vp_offset_x;s.vp_offset_y=s.vp_offset_y||cs.vp_offset_y;m=new tinymce.ui.DropMenu(s.id||DOM.uniqueId(),s);m.onAddItem.add(t.onAddItem.dispatch,t.onAddItem);return m;},update:function(){var t=this,s=t.settings,tb=DOM.get('menu_'+t.id+'_tbl'),co=DOM.get('menu_'+t.id+'_co'),tw,th;tw=s.max_width?Math.min(tb.clientWidth,s.max_width):tb.clientWidth;th=s.max_height?Math.min(tb.clientHeight,s.max_height):tb.clientHeight;if(!DOM.boxModel)t.element.setStyles({width:tw+2,height:th+2});else t.element.setStyles({width:tw,height:th});if(s.max_width)DOM.setStyle(co,'width',tw);if(s.max_height){DOM.setStyle(co,'height',th);if(tb.clientHeight<s.max_height)DOM.setStyle(co,'overflow','hidden');}},showMenu:function(x,y,px){var t=this,s=t.settings,co,vp=DOM.getViewPort(),w,h,mx,my,ot=2,dm,tb;t.collapse(1);if(t.isMenuVisible)return;if(!t.rendered){co=DOM.add(t.settings.container,t.renderNode());each(t.items,function(o){o.postRender();});t.element=new Element('menu_'+t.id,{blocker:1,container:s.container});}else co=DOM.get('menu_'+t.id);DOM.setStyles(co,{left:-0xFFFF,top:-0xFFFF});DOM.show(co);t.update();x+=s.offset_x||0;y+=s.offset_y||0;vp.w-=4;vp.h-=4;if(s.constrain){w=co.clientWidth-ot;h=co.clientHeight-ot;mx=vp.x+vp.w;my=vp.y+vp.h;if((x+s.vp_offset_x+w)>mx)x=px?px-w:Math.max(0,(mx-s.vp_offset_x)-w);if((y+s.vp_offset_y+h)>my)y=Math.max(0,(my-s.vp_offset_y)-h);}DOM.setStyles(co,{left:x,top:y});t.element.update();t.isMenuVisible=1;t.mouseClickFunc=Event.add(co,'click',function(e){var m;e=e.target;if(e&&(e=DOM.getParent(e,'TR'))&&!DOM.hasClass(e,'mceMenuItemSub')){m=t.items[e.id];if(m.isDisabled())return;if(m.settings.onclick)m.settings.onclick(e);dm=t;while(dm){if(dm.hideMenu)dm.hideMenu();dm=dm.settings.parent;}return Event.cancel(e);}});if(t.hasMenus()){t.mouseOverFunc=Event.add(co,'mouseover',function(e){var m,r,mi;e=e.target;if(e&&(e=DOM.getParent(e,'TR'))){m=t.items[e.id];if(t.lastMenu)t.lastMenu.collapse(1);if(m.isDisabled())return;if(e&&DOM.hasClass(e,'mceMenuItemSub')){r=DOM.getRect(e);m.showMenu((r.x+r.w-ot),r.y-ot,r.x);t.lastMenu=m;DOM.addClass(DOM.get(m.id).firstChild,'mceMenuItemActive');}}});}},hideMenu:function(c){var t=this,co=DOM.get('menu_'+t.id),e;if(!t.isMenuVisible)return;Event.remove(co,'mouseover',t.mouseOverFunc);Event.remove(co,'click',t.mouseClickFunc);DOM.hide(co);t.isMenuVisible=0;if(!c)t.collapse(1);if(t.element)t.element.hide();if(e=DOM.get(t.id))DOM.removeClass(e.firstChild,'mceMenuItemActive');t.onHideMenu.dispatch(t);},add:function(o){var t=this,co;o=t.parent(o);if(t.isRendered&&(co=DOM.get('menu_'+t.id)))t._add(DOM.select('tbody',co)[0],o);return o;},collapse:function(d){this.parent(d);this.hideMenu(1);},remove:function(o){DOM.remove(o.id);return this.parent(o);},destroy:function(){var t=this,co=DOM.get('menu_'+t.id);Event.remove(co,'mouseover',t.mouseOverFunc);Event.remove(co,'click',t.mouseClickFunc);if(t.element)t.element.remove();DOM.remove(co);},renderNode:function(){var t=this,s=t.settings,n,tb,co,w;w=DOM.create('div',{id:'menu_'+t.id,'class':s['class'],'style':'position:absolute;left:0;top:0;z-index:150'});co=DOM.add(w,'div',{id:'menu_'+t.id+'_co','class':'mceMenu'+(s['class']?' '+s['class']:'')});t.element=new Element('menu_'+t.id,{blocker:1,container:s.container});if(s.menu_line)DOM.add(co,'span',{'class':'mceMenuLine'});n=DOM.add(co,'table',{id:'menu_'+t.id+'_tbl',border:0,cellPadding:0,cellSpacing:0});tb=DOM.add(n,'tbody');each(t.items,function(o){t._add(tb,o);});t.rendered=true;return w;},_add:function(tb,o){var n,s=o.settings,a,ro,it;if(s.separator){ro=DOM.add(tb,'tr',{id:o.id,'class':'mceMenuItemSeparator'});DOM.add(ro,'td',{'class':'mceMenuItemSeparator'});if(n=ro.previousSibling)DOM.addClass(n,'last');return;}n=ro=DOM.add(tb,'tr',{id:o.id,'class':'mceMenuItem mceMenuItemEnabled'});n=it=DOM.add(n,'td');n=a=DOM.add(n,'a',{href:'javascript:;',onclick:"return false;",onmousedown:'return false;'});DOM.addClass(it,s['class']);DOM.add(n,'span',{'class':'icon'+(s.icon?' '+s.icon:'')});n=DOM.add(n,s.element||'span',{'class':'text',title:o.settings.title},o.settings.title);if(o.settings.style)DOM.setAttrib(n,'style',o.settings.style);if(tb.childNodes.length==1)DOM.addClass(ro,'first');if((n=ro.previousSibling)&&DOM.hasClass(n,'mceMenuItemSeparator'))DOM.addClass(ro,'first');if(o.collapse)DOM.addClass(ro,'mceMenuItemSub');if(n=ro.previousSibling)DOM.removeClass(n,'last');DOM.addClass(ro,'last');}});})();(function(){var DOM=tinymce.DOM;tinymce.create('tinymce.ui.Button:tinymce.ui.Control',{Button:function(id,s){this.parent(id,s);this.classPrefix='mceButton';},renderHTML:function(){var s=this.settings,h='<a id="'+this.id+'" href="javascript:;" class="mceButton mceButtonEnabled '+s['class']+'" onmousedown="return false;" onclick="return false;" title="'+DOM.encode(s.title)+'">';if(s.image)h+='<img class="icon" src="'+s.image+'" /></a>';else h+='<span class="icon '+s['class']+'"></span></a>';return h;},postRender:function(){var t=this,s=t.settings;tinymce.dom.Event.add(t.id,'click',function(e){if(!t.isDisabled())return s.onclick.call(s.scope,e);});}});})();(function(){var DOM=tinymce.DOM,Event=tinymce.dom.Event,each=tinymce.each,Dispatcher=tinymce.util.Dispatcher;tinymce.create('tinymce.ui.ListBox:tinymce.ui.Control',{ListBox:function(id,s){var t=this;t.parent(id,s);t.items=[];t.onChange=new Dispatcher(t);t.onPostRender=new Dispatcher(t);t.onAdd=new Dispatcher(t);t.onRenderMenu=new tinymce.util.Dispatcher(this);t.classPrefix='mceListBox';},select:function(v){var t=this,e,fv;if(v!=t.selectedValue){e=DOM.get(t.id+'_text');t.selectedValue=v;each(t.items,function(o){if(o.value==v){DOM.setHTML(e,DOM.encode(o.title));fv=1;return false;}});if(!fv){DOM.setHTML(e,DOM.encode(t.settings.title));DOM.addClass(e,'title');e=0;return;}else DOM.removeClass(e,'title');}e=0;},add:function(n,v,o){var t=this;o=o||{};o=tinymce.extend(o,{title:n,value:v});t.items.push(o);t.onAdd.dispatch(t,o);},getLength:function(){return this.items.length;},renderHTML:function(){var h='',t=this,s=t.settings;h='<table id="'+t.id+'" cellpadding="0" cellspacing="0" class="mceListBox mceListBoxEnabled'+(s['class']?(' '+s['class']):'')+'"><tbody><tr>';h+='<td>'+DOM.createHTML('a',{id:t.id+'_text',href:'javascript:;','class':'text',onclick:"return false;",onmousedown:'return false;'},DOM.encode(t.settings.title))+'</td>';h+='<td>'+DOM.createHTML('a',{id:t.id+'_open',href:'javascript:;','class':'open',onclick:"return false;",onmousedown:'return false;'},'<span></span>')+'</td>';h+='</tr></tbody></table>';return h;},showMenu:function(){var t=this,p1,p2,e=DOM.get(this.id),m;if(t.isDisabled()||t.items.length==0)return;if(!t.isMenuRendered){t.renderMenu();t.isMenuRendered=true;}p1=DOM.getPos(this.settings.menu_container);p2=DOM.getPos(e);m=t.menu;m.settings.offset_x=p2.x;m.settings.offset_y=p2.y;if(t.oldID)m.items[t.oldID].setSelected(0);each(t.items,function(o){if(o.value===t.selectedValue){m.items[o.id].setSelected(1);t.oldID=o.id;}});m.showMenu(0,e.clientHeight);Event.add(document,'mousedown',t.hideMenu,t);DOM.addClass(t.id,'mceListBoxSelected');},hideMenu:function(e){var t=this;if(!e||!DOM.getParent(e.target,function(n){return DOM.hasClass(n,'mceMenu');})){DOM.removeClass(t.id,'mceListBoxSelected');Event.remove(document,'mousedown',t.hideMenu,t);if(t.menu)t.menu.hideMenu();}},renderMenu:function(){var t=this,m;m=t.settings.control_manager.createDropMenu(t.id+'_menu',{menu_line:1,'class':'mceListBoxMenu noIcons',max_width:150,max_height:150});m.onHideMenu.add(t.hideMenu,t);m.add({title:t.settings.title,'class':'mceMenuItemTitle'}).setDisabled(1);each(t.items,function(o){o.id=DOM.uniqueId();o.onclick=function(){if(t.settings.onselect(o.value)!==false)t.select(o.value);};m.add(o);});t.onRenderMenu.dispatch(t,m);t.menu=m;},postRender:function(){var t=this;Event.add(t.id,'click',t.showMenu,t);if(tinymce.isIE6||!DOM.boxModel){Event.add(t.id,'mouseover',function(){if(!DOM.hasClass(t.id,'mceListBoxDisabled'))DOM.addClass(t.id,'mceListBoxHover');});Event.add(t.id,'mouseout',function(){if(!DOM.hasClass(t.id,'mceListBoxDisabled'))DOM.removeClass(t.id,'mceListBoxHover');});}t.onPostRender.dispatch(t,DOM.get(t.id));}});})();(function(){var DOM=tinymce.DOM,Event=tinymce.dom.Event,each=tinymce.each,Dispatcher=tinymce.util.Dispatcher;tinymce.create('tinymce.ui.NativeListBox:tinymce.ui.ListBox',{NativeListBox:function(id,s){this.parent(id,s);this.classPrefix='mceNativeListBox';},setDisabled:function(s){DOM.get(this.id).disabled=s;},isDisabled:function(){return DOM.get(this.id).disabled;},select:function(v){var e=DOM.get(this.id),ol=e.options;v=''+(v||'');e.selectedIndex=0;each(ol,function(o,i){if(o.value==v){e.selectedIndex=i;return false;}});},add:function(n,v,a){var o,t=this;a=a||{};a.value=v;if(t.isRendered())DOM.add(DOM.get(this.id),'option',a,n);o={title:n,value:v,attribs:a};t.items.push(o);t.onAdd.dispatch(t,o);},getLength:function(){return DOM.get(this.id).options.length-1;},renderHTML:function(){var h,t=this;h=DOM.createHTML('option',{value:''},'-- '+t.settings.title+' --');each(t.items,function(it){h+=DOM.createHTML('option',{value:it.value},it.title);});h=DOM.createHTML('select',{id:t.id,'class':'mceNativeListBox'},h);return h;},postRender:function(){var t=this,ch;t.rendered=true;function onChange(e){var v=e.target.options[e.target.selectedIndex].value;t.onChange.dispatch(t,v);if(t.settings.onselect)t.settings.onselect(v);};Event.add(t.id,'change',onChange);Event.add(t.id,'keydown',function(e){var bf;Event.remove(t.id,'change',ch);bf=Event.add(t.id,'blur',function(){Event.add(t.id,'change',onChange);Event.remove(t.id,'blur',bf);});if(e.keyCode==13||e.keyCode==32){onChange(e);return Event.cancel(e);}});t.onPostRender.dispatch(t,DOM.get(t.id));}});})();(function(){var DOM=tinymce.DOM,Event=tinymce.dom.Event,each=tinymce.each;tinymce.create('tinymce.ui.MenuButton:tinymce.ui.Button',{MenuButton:function(id,s){this.parent(id,s);this.onRenderMenu=new tinymce.util.Dispatcher(this);s.menu_container=s.menu_container||document.body;},showMenu:function(){var t=this,p1,p2,e=DOM.get(t.id),m;if(t.isDisabled())return;if(!t.isMenuRendered){t.renderMenu();t.isMenuRendered=true;}p1=DOM.getPos(t.settings.menu_container);p2=DOM.getPos(e);m=t.menu;m.settings.offset_x=p2.x;m.settings.offset_y=p2.y;m.settings.vp_offset_x=p2.x;m.settings.vp_offset_y=p2.y;m.showMenu(0,e.clientHeight);Event.add(document,'mousedown',t.hideMenu,t);t.setState('Selected',1);},renderMenu:function(){var t=this,m;m=t.settings.control_manager.createDropMenu(t.id+'_menu',{menu_line:1,'class':this.classPrefix+'Menu',icons:t.settings.icons});m.onHideMenu.add(t.hideMenu,t);t.onRenderMenu.dispatch(t,m);t.menu=m;},hideMenu:function(e){var t=this;if(!e||!DOM.getParent(e.target,function(n){return DOM.hasClass(n,'mceMenu');})){t.setState('Selected',0);Event.remove(document,'mousedown',t.hideMenu,t);if(t.menu)t.menu.hideMenu();}},postRender:function(){var t=this,s=t.settings;Event.add(t.id,'click',function(){if(!t.isDisabled()){if(s.onclick)s.onclick(t.value);t.showMenu();}});}});})();(function(){var DOM=tinymce.DOM,Event=tinymce.dom.Event,each=tinymce.each;tinymce.create('tinymce.ui.SplitButton:tinymce.ui.MenuButton',{SplitButton:function(id,s){this.parent(id,s);this.classPrefix='mceSplitButton';},renderHTML:function(){var h,t=this,s=t.settings,h1;h='<tbody><tr>';if(s.image)h1=DOM.createHTML('img ',{src:s.image,'class':'action '+s['class']});else h1=DOM.createHTML('span',{'class':'action '+s['class']});h+='<td>'+DOM.createHTML('a',{id:t.id+'_action',href:'javascript:;','class':'action '+s['class'],onclick:"return false;",onmousedown:'return false;',title:s.title},h1)+'</td>';h1=DOM.createHTML('span',{'class':'open '+s['class']});h+='<td>'+DOM.createHTML('a',{id:t.id+'_open',href:'javascript:;','class':'open '+s['class'],onclick:"return false;",onmousedown:'return false;',title:s.title},h1)+'</td>';h+='</tr></tbody>';return DOM.createHTML('table',{id:t.id,'class':'mceSplitButton mceSplitButtonEnabled '+s['class'],cellpadding:'0',cellspacing:'0',onmousedown:'return false;',title:s.title},h);},postRender:function(){var t=this,s=t.settings;if(s.onclick){Event.add(t.id+'_action','click',function(){if(!t.isDisabled())s.onclick(t.value);});}Event.add(t.id+'_open','click',t.showMenu,t);if(tinymce.isIE6||!DOM.boxModel){Event.add(t.id,'mouseover',function(){if(!DOM.hasClass(t.id,'mceSplitButtonDisabled'))DOM.addClass(t.id,'mceSplitButtonHover');});Event.add(t.id,'mouseout',function(){if(!DOM.hasClass(t.id,'mceSplitButtonDisabled'))DOM.removeClass(t.id,'mceSplitButtonHover');});}}});})();(function(){var DOM=tinymce.DOM,Event=tinymce.dom.Event,is=tinymce.is,each=tinymce.each;tinymce.create('tinymce.ui.ColorSplitButton:tinymce.ui.SplitButton',{ColorSplitButton:function(id,s){var t=this;t.parent(id,s);t.settings=s=tinymce.extend({colors:'000000,993300,333300,003300,003366,000080,333399,333333,800000,FF6600,808000,008000,008080,0000FF,666699,808080,FF0000,FF9900,99CC00,339966,33CCCC,3366FF,800080,999999,FF00FF,FFCC00,FFFF00,00FF00,00FFFF,00CCFF,993366,C0C0C0,FF99CC,FFCC99,FFFF99,CCFFCC,CCFFFF,99CCFF,CC99FF,FFFFFF',grid_width:8,default_color:'#888888'},t.settings);t.value=s.default_color;},showMenu:function(){var t=this,r,p,e;if(t.isDisabled())return;if(!t.isMenuRendered){t.renderMenu();t.isMenuRendered=true;}e=DOM.get(t.id);DOM.show(t.id+'_menu');DOM.addClass(e,'mceSplitButtonSelected');p2=DOM.getPos(e);DOM.setStyles(t.id+'_menu',{left:p2.x,top:p2.y+e.clientHeight,zIndex:150});e=0;Event.add(document,'mousedown',t.hideMenu,t);},hideMenu:function(e){var t=this;if(!e||!DOM.getParent(e.target,function(n){return DOM.hasClass(n,'mceSplitButtonMenu');})){DOM.removeClass(t.id,'mceSplitButtonSelected');Event.remove(document,'mousedown',t.hideMenu,t);DOM.hide(t.id+'_menu');}},renderMenu:function(){var t=this,m,i=0,s=t.settings,n,tb,tr,w;w=DOM.add(s.menu_container,'div',{id:t.id+'_menu','class':s['menu_class']+' '+s['class'],style:'position:absolute;left:0;top:-1000px;'});m=DOM.add(w,'div',{'class':s['class']+' mceSplitButtonMenu'});DOM.add(m,'span',{'class':'mceMenuLine'});n=DOM.add(m,'table',{'class':'mceColorSplitMenu'});tb=DOM.add(n,'tbody');i=0;each(is(s.colors,'array')?s.colors:s.colors.split(','),function(c){c=c.replace(/^#/,'');if(!i--){tr=DOM.add(tb,'tr');i=s.grid_width-1;}n=DOM.add(tr,'td');n=DOM.add(n,'a',{href:'javascript:;',style:{backgroundColor:'#'+c}});Event.add(n,'mousedown',function(){t.setColor('#'+c);});});if(s.more_colors_func){n=DOM.add(tb,'tr');n=DOM.add(n,'td',{colspan:s.grid_width,'class':'morecolors'});n=DOM.add(n,'a',{href:'javascript:;',onclick:'return false;','class':'morecolors'},s.more_colors_title);Event.add(n,'click',function(e){s.more_colors_func.call(s.more_colors_scope||this);return Event.cancel(e);});}DOM.addClass(m,'mceColorSplitMenu');return w;},setColor:function(c){var t=this,p,s=this.settings,co=s.menu_container,po,cp,id=t.id+'_preview';if(!(p=DOM.get(id))){DOM.setStyle(t.id+'_action','position','relative');p=DOM.add(t.id+'_action','div',{id:id,'class':'mceColorPreview'});}p.style.backgroundColor=c;t.value=c;t.hideMenu();s.onselect(c);}});})();tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container',{renderHTML:function(){var t=this,h='',c='mceToolbarEnd',co,dom=tinymce.DOM,s=t.settings;h+=dom.createHTML('td',{'class':'mceToolbarStart'},dom.createHTML('span',null,'<!-- IE -->'));tinymce.each(t.controls,function(c){h+='<td>'+c.renderHTML()+'</td>';});co=t.controls[t.controls.length-1].constructor;if(co===tinymce.ui.Button)c+=' mceToolbarEndButton';else if(co===tinymce.ui.SplitButton)c+=' mceToolbarEndSplitButton';else if(co===tinymce.ui.ListBox)c+=' mceToolbarEndListBox';h+=dom.createHTML('td',{'class':c},dom.createHTML('span',null,'<!-- IE -->'));return dom.createHTML('table',{id:t.id,'class':'mceToolbar'+(s['class']?' '+s['class']:''),cellpadding:'0',cellspacing:'0',align:t.settings.align||''},'<tbody><tr>'+h+'</tr></tbody>');}});(function(){var Dispatcher=tinymce.util.Dispatcher,each=tinymce.each;tinymce.create('tinymce.AddOnManager',{items:[],urls:{},lookup:{},onAdd:new Dispatcher(this),get:function(n){return this.lookup[n];},requireLangPack:function(n){var u,s;if(tinymce.EditorManager.settings){u=this.urls[n]+'/langs/'+tinymce.EditorManager.settings.language+'.js';s=tinymce.EditorManager.settings;if(s){if(!tinymce.dom.Event.domLoaded&&!s.strict_mode)tinymce.ScriptLoader.load(u);else tinymce.ScriptLoader.add(u);}}},add:function(id,o){this.items.push(o);this.lookup[id]=o;this.onAdd.dispatch(this,id,o);return o;},load:function(n,u,cb,s){if(u.indexOf('/')!=0&&u.indexOf('://')==-1)u=tinymce.baseURL+'/'+u;this.urls[n]=u.substring(0,u.lastIndexOf('/'));tinymce.ScriptLoader.add(u,cb,s);}});tinymce.PluginManager=new tinymce.AddOnManager();tinymce.ThemeManager=new tinymce.AddOnManager();}());(function(){var each=tinymce.each,extend=tinymce.extend,DOM=tinymce.DOM,Event=tinymce.dom.Event,ThemeManager=tinymce.ThemeManager,PluginManager=tinymce.PluginManager;tinymce.create('static tinymce.EditorManager',{editors:{},i18n:{},activeEditor:null,init:function(s){var t=this,pl,sl=tinymce.ScriptLoader;function execCallback(se,n,s){var f=se[n];if(!f)return;if(tinymce.is(f,'string')){s=f.replace(/\.\w+$/,'');s=s?tinymce.resolve(s):0;f=tinymce.resolve(f);}return f.apply(s||this,Array.prototype.slice.call(arguments,2));};s=extend({theme:"simple",language:"en",strict_loading_mode:document.contentType=='application/xhtml+xml'},s);t.settings=s;if(!Event.domLoaded&&!s.strict_loading_mode){if(s.language)sl.add(tinymce.baseURL+'/langs/'+s.language+'.js');if(s.theme&&s.theme.charAt(0)!='-')ThemeManager.load(s.theme,'themes/'+s.theme+'/editor_template'+tinymce.suffix+'.js');if(s.plugins){pl=s.plugins.split(',');if(tinymce.inArray(pl,'compat2x')!=-1)PluginManager.load('compat2x','plugins/compat2x/editor_plugin'+tinymce.suffix+'.js');each(pl,function(v){if(v&&v.charAt(0)!='-'){if(!tinymce.isWebKit&&v=='safari')return;PluginManager.load(v,'plugins/'+v+'/editor_plugin'+tinymce.suffix+'.js');}});}sl.loadQueue();}Event.add(document,'init',function(){var l,co;execCallback(s,'onpageload');if(s.browsers){l=false;each(s.browsers.split(','),function(v){switch(v){case'ie':case'msie':if(tinymce.isIE)l=true;break;case'gecko':if(tinymce.isGecko)l=true;break;case'safari':case'webkit':if(tinymce.isWebKit)l=true;break;case'opera':if(tinymce.isOpera)l=true;break;}});if(!l)return;}switch(s.mode){case"exact":l=s.elements||'';each(l.split(','),function(v){new tinymce.Editor(v,s).render();});break;case"textareas":function hasClass(n,c){return new RegExp('\\b'+c+'\\b','g').test(n.className);};each(DOM.select('textarea'),function(v){if(s.editor_deselector&&hasClass(v,s.editor_deselector))return;if(!s.editor_selector||hasClass(v,s.editor_selector))new tinymce.Editor(v.id=(v.id||v.name||(v.id=DOM.uniqueId())),s).render();});break;}if(s.oninit){l=co=0;each(t.editors,function(ed){co++;if(!ed.initialized){ed.onInit.add(function(){l++;if(l==co)execCallback(s,'oninit');});}else l++;if(l==co)execCallback(s,'oninit');});}});},get:function(id){return this.editors[id];},getInstanceById:function(id){return this.get(id);},add:function(e){this.editors[e.id]=e;this._setActive(e);return e;},remove:function(e){var t=this;if(!t.editors[e.id])return null;delete t.editors[e.id];if(t.activeEditor==e){each(t.editors,function(e){t._setActive(e);return false;});}e._destroy();return e;},execCommand:function(c,u,v){var t=this,ed=t.get(v);switch(c){case"mceFocus":ed.focus();return true;case"mceAddEditor":case"mceAddControl":new tinymce.Editor(v,t.settings).render();return true;case"mceAddFrameControl":return true;case"mceRemoveEditor":case"mceRemoveControl":ed.remove();return true;case'mceToggleEditor':if(!ed){t.execCommand('mceAddControl',0,v);return true;}if(ed.isHidden())ed.show();else ed.hide();return true;}if(t.activeEditor)return t.activeEditor.execCommand(c,u,v);return false;},execInstanceCommand:function(id,c,u,v){var ed=this.get(id);if(ed)return ed.execCommand(c,u,v);return false;},triggerSave:function(){each(this.editors,function(e){e.save();});},addI18n:function(p,o){var lo,i18n=this.i18n;if(!tinymce.is(p,'string')){each(p,function(o,lc){each(o,function(o,g){each(o,function(o,k){if(g==='common')i18n[lc+'.'+k]=o;else i18n[lc+'.'+g+'.'+k]=o;});});});}else{each(o,function(o,k){i18n[p+'.'+k]=o;});}},_setActive:function(e){this.selectedInstance=this.activeEditor=e;}});tinymce.documentBaseURL=window.location.href.replace(/[\?#].*$/,'').replace(/[\/\\][^\/]+$/,'');if(!/[\/\\]$/.test(tinymce.documentBaseURL))tinymce.documentBaseURL+='/';tinymce.baseURL=new tinymce.util.URI(tinymce.documentBaseURL).toAbsolute(tinymce.baseURL);tinymce.EditorManager.baseURI=new tinymce.util.URI(tinymce.baseURL);})();var tinyMCE=window.tinyMCE=tinymce.EditorManager;(function(){var DOM=tinymce.DOM,Event=tinymce.dom.Event,extend=tinymce.extend,Dispatcher=tinymce.util.Dispatcher;var each=tinymce.each,isGecko=tinymce.isGecko,isIE=tinymce.isIE,isWebKit=tinymce.isWebKit;var is=tinymce.is,ThemeManager=tinymce.ThemeManager,PluginManager=tinymce.PluginManager,EditorManager=tinymce.EditorManager;var inArray=tinymce.inArray,grep=tinymce.grep;tinymce.create('tinymce.Editor',{Editor:function(id,s){var t=this;t.id=t.editorId=id;t.execCommands={};t.queryStateCommands={};t.queryValueCommands={};t.plugins={};each(['onPreInit','onBeforeRenderUI','onPostRender','onInit','onRemove','onActivate','onDeactivate','onClick','onEvent','onMouseUp','onMouseDown','onDblClick','onKeyDown','onKeyUp','onKeyPress','onContextMenu','onSubmit','onReset','onPaste','onPreProcess','onPostProcess','onBeforeSetContent','onBeforeGetContent','onSetContent','onGetContent','onLoadContent','onSaveContent','onNodeChange','onChange','onBeforeExecCommand','onExecCommand','onUndo','onRedo','onVisualAid','onSetProgressState'],function(e){t[e]=new Dispatcher(t);});t.settings=s=extend({id:id,language:'en',docs_language:'en',theme:'simple',skin:'default',delta_width:0,delta_height:0,popup_css:'',plugins:'',document_base_url:tinymce.documentBaseURL,add_form_submit_trigger:1,submit_patch:1,add_unload_trigger:1,convert_urls:1,relative_urls:1,remove_script_host:1,table_inline_editing:0,object_resizing:1,cleanup:1,accessibility_focus:1,custom_shortcuts:1,custom_undo_redo_keyboard_shortcuts:1,custom_undo_redo_restore_selection:1,custom_undo_redo:1,doctype:'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">',visual_table_class:'mceItemTable',visual:1,inline_styles:true,convert_fonts_to_spans:true,font_size_style_values:'xx-small,x-small,small,medium,large,x-large,xx-large',apply_source_formatting:1,directionality:'ltr',forced_root_block:'p',valid_elements:'@[id|class|style|title|dir<ltr?rtl|lang|xml::lang|onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup],a[rel|rev|charset|hreflang|tabindex|accesskey|type|name|href|target|title|class|onfocus|onblur],strong/b,em/i,strike,u,#p[align],-ol[type|compact],-ul[type|compact],-li,br,img[longdesc|usemap|src|border|alt=|title|hspace|vspace|width|height|align],-sub,-sup,-blockquote,-table[border=0|cellspacing|cellpadding|width|frame|rules|height|align|summary|bgcolor|background|bordercolor],-tr[rowspan|width|height|align|valign|bgcolor|background|bordercolor],tbody,thead,tfoot,#td[colspan|rowspan|width|height|align|valign|bgcolor|background|bordercolor|scope],#th[colspan|rowspan|width|height|align|valign|scope],caption,-div,-span,-pre,address,-h1,-h2,-h3,-h4,-h5,-h6,hr[size|noshade],-font[face|size|color],dd,dl,dt,cite,abbr,acronym,del[datetime|cite],ins[datetime|cite],object[classid|width|height|codebase|*],param[name|value|_value],embed[type|width|height|src|*],script[type],map[name],area[shape|coords|href|alt|target]',hidden_input:1,padd_empty_editor:1,render_ui:1,init_theme:1,indentation:'30px'},s);t.documentBaseURI=new tinymce.util.URI(s.document_base_url||tinymce.documentBaseURL,{base_uri:tinyMCE.baseURI});t.baseURI=EditorManager.baseURI;t.execCallback('setup',t);},render:function(){var t=this,s=t.settings,id=t.id,sl=tinymce.ScriptLoader;if(!t.getElement())return;if(s.strict_loading_mode){sl.settings.strict_mode=s.strict_loading_mode;tinymce.DOM.settings.strict=1;}if(!/TEXTAREA|INPUT/i.test(t.getElement().nodeName)&&s.hidden_input&&DOM.getParent(id,'form'))DOM.insertAfter(DOM.create('input',{type:'hidden',name:id}),id);t.windowManager=new tinymce.WindowManager(t);if(s.encoding=='xml'){t.onGetContent.add(function(ed,o){if(o.get)o.content=DOM.encode(o.content);});}if(s.add_form_submit_trigger){t.onSubmit.addToTop(function(){if(t.initialized){t.save();t.isNotDirty=1;}});}Event.add(document,'unload',function(){if(t.initialized&&!t.destroyed&&s.add_unload_trigger)t.save({format:'raw',no_events:true});});tinymce.addUnload(t._destroy,t);if(s.submit_patch){t.onBeforeRenderUI.add(function(){var n=t.getElement().form;if(!n)return;if(n._mceOldSubmit)return;if(!n.submit.nodeType){t.formElement=n;n._mceOldSubmit=n.submit;n.submit=function(){EditorManager.triggerSave();t.isNotDirty=1;return this._mceOldSubmit(this);};}n=null;});}function loadScripts(){sl.add(tinymce.baseURL+'/langs/'+s.language+'.js');if(s.theme.charAt(0)!='-')ThemeManager.load(s.theme,'themes/'+s.theme+'/editor_template'+tinymce.suffix+'.js');each(s.plugins.split(','),function(p){if(p&&p.charAt(0)!='-'){if(!isWebKit&&p=='safari')return;PluginManager.load(p,'plugins/'+p+'/editor_plugin'+tinymce.suffix+'.js');}});sl.loadQueue(function(){if(s.ask){function ask(){t.windowManager.confirm(t.getLang('edit_confirm'),function(s){if(s)t.init();else Event.remove(t.id,'focus',ask);});};Event.add(t.id,'focus',ask);return;}if(!t.removed)t.init();});};if(s.plugins.indexOf('compat2x')!=-1){PluginManager.load('compat2x','plugins/compat2x/editor_plugin'+tinymce.suffix+'.js');sl.loadQueue(loadScripts);}else loadScripts();},init:function(){var n,t=this,s=t.settings,w,h,e=t.getElement(),o,ti;EditorManager.add(t);s.theme=s.theme.replace(/-/,'');o=ThemeManager.get(s.theme);t.theme=new o();if(t.theme.init&&s.init_theme)t.theme.init(t,ThemeManager.urls[s.theme]||tinymce.documentBaseURL.replace(/\/$/,''));each(s.plugins.replace(/\-/g,'').split(','),function(p){var c=PluginManager.get(p),u=PluginManager.urls[p]||tinymce.documentBaseURL.replace(/\/$/,''),po;if(c){po=new c(t,u);t.plugins[p]=po;if(po.init)po.init(t,u);}});s.popup_css=t.baseURI.toAbsolute(s.popup_css||"themes/"+s.theme+"/skins/"+s.skin+"/dialog.css");if(s.popup_css_add)s.popup_css+=','+s.popup_css_add;t.controlManager=new tinymce.ControlManager(t);t.undoManager=new tinymce.UndoManager(t);t.undoManager.onAdd.add(function(um,l){return t.onChange.dispatch(t,l,um);});t.undoManager.onUndo.add(function(um,l){return t.onUndo.dispatch(t,l,um);});t.undoManager.onRedo.add(function(um,l){return t.onRedo.dispatch(t,l,um);});if(s.custom_undo_redo){t.onExecCommand.add(function(ed,cmd){if(cmd!='Undo'&&cmd!='Redo'&&cmd!='mceRepaint')t.undoManager.add();});}t.onExecCommand.add(function(ed,c){if(!/^(FontName|FontSize)$/.test(c))t.nodeChanged();});if(isGecko){function repaint(){t.execCommand('mceRepaint');};t.onUndo.add(repaint);t.onRedo.add(repaint);t.onSetContent.add(repaint);}t.onBeforeRenderUI.dispatch(t,t.controlManager);if(s.render_ui){w=s.width||e.style.width||e.clientWidth;h=s.height||e.style.height||e.clientHeight;t.orgDisplay=e.style.display;if((''+w).indexOf('%')==-1)w=Math.max(parseInt(w)+(o.deltaWidth||0),100);if((''+h).indexOf('%')==-1)h=Math.max(parseInt(h)+(o.deltaHeight||0),100);o=t.theme.renderUI({targetNode:e,width:w,height:h,deltaWidth:s.delta_width,deltaHeight:s.delta_height});t.editorContainer=o.editorContainer;}DOM.setStyles(o.sizeContainer||o.editorContainer,{width:w,height:h});h=(o.iframeHeight||h)+((h+'').indexOf('%')==-1?(o.deltaHeight||0):'');if(h<100)h=100;n=DOM.add(o.iframeContainer,'iframe',{id:s.id+"_ifr",src:'javascript:""',frameBorder:'0',style:{width:'100%',height:h}});t.contentAreaContainer=o.iframeContainer;DOM.get(o.editorContainer).style.display=t.orgDisplay;DOM.get(s.id).style.display='none';if(tinymce.isOldWebKit){Event.add(n,'load',t.setupIframe,t);n.src=tinymce.baseURL+'/plugins/safari/blank.htm';}else{t.setupIframe();e=n=o=null;}},setupIframe:function(){var t=this,s=t.settings,e=DOM.get(s.id),d=t.getDoc();d.open();d.write(s.doctype+'<html><head xmlns="http://www.w3.org/1999/xhtml"><base href="'+t.documentBaseURI.getURI()+'" /><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /></head><body id="tinymce" class="mceContentBody"></body></html>');d.close();if(!isIE){try{d.designMode='On';}catch(ex){}}if(isIE)t.getBody().contentEditable=true;t.dom=new tinymce.DOM.DOMUtils(t.getDoc(),{keep_values:true,url_converter:t.convertURL,url_converter_scope:t,hex_colors:s.force_hex_style_colors,class_filter:s.class_filter,update_styles:1});t.serializer=new tinymce.dom.Serializer({entity_encoding:s.entity_encoding,entities:s.entities,valid_elements:s.verify_html===false?'*[*]':s.valid_elements,extended_valid_elements:s.extended_valid_elements,valid_child_elements:s.valid_child_elements,invalid_elements:s.invalid_elements,fix_table_elements:s.fix_table_elements,fix_list_elements:s.fix_list_elements,fix_content_duplication:s.fix_content_duplication,convert_fonts_to_spans:s.convert_fonts_to_spans,font_size_classes:s.font_size_classes,font_size_style_values:s.font_size_style_values,apply_source_formatting:s.apply_source_formatting,remove_linebreaks:s.remove_linebreaks,dom:t.dom});t.selection=new tinymce.dom.Selection(t.dom,t.getWin(),t.serializer);t.forceBlocks=new tinymce.ForceBlocks(t,{forced_root_block:s.forced_root_block});t.editorCommands=new tinymce.EditorCommands(t);t.serializer.onPreProcess.add(function(se,o){return t.onPreProcess.dispatch(t,o,se);});t.serializer.onPostProcess.add(function(se,o){return t.onPostProcess.dispatch(t,o,se);});t.onPreInit.dispatch(t);if(!s.gecko_spellcheck)t.getBody().spellcheck=0;t._addEvents();t.controlManager.onPostRender.dispatch(t,t.controlManager);t.onPostRender.dispatch(t);if(s.directionality)t.getBody().dir=s.directionality;if(s.nowrap)t.getBody().style.whiteSpace="nowrap";if(s.auto_resize)t.onNodeChange.add(t.resizeToContent,t);if(s.handle_node_change_callback){t.onNodeChange.add(function(ed,cm,n){t.execCallback('handle_node_change_callback',t.id,n,-1,-1,true,t.selection.isCollapsed());});}if(s.save_callback){t.onSaveContent.add(function(ed,o){var h=t.execCallback('save_callback',t.id,o.content,t.getBody());if(h)o.content=h;});}if(s.onchange_callback){t.onChange.add(function(ed,l){t.execCallback('onchange_callback',t,l);});}if(s.convert_newlines_to_brs){t.onBeforeSetContent.add(function(ed,o){if(o.initial)o.content=o.content.replace(/\r?\n/g,'<br />');});}if(s.fix_nesting&&isIE){t.onBeforeSetContent.add(function(ed,o){o.content=t._fixNesting(o.content);});}if(s.preformatted){t.onPostProcess.add(function(ed,o){o.content=o.content.replace(/^\s*<pre.*?>/,'');o.content=o.content.replace(/<\/pre>\s*$/,'');if(o.set)o.content='<pre class="mceItemHidden">'+o.content+'</pre>';});}if(s.verify_css_classes){t.serializer.attribValueFilter=function(n,v){var s,cl;if(n=='class'){if(!t.classesRE){cl=t.dom.getClasses();if(cl.length>0){s='';each(cl,function(o){s+=(s?'|':'')+o['class'];});t.classesRE=new RegExp('('+s+')','gi');}}return!t.classesRE||/(\bmceItem\w+\b|\bmceTemp\w+\b)/g.test(v)||t.classesRE.test(v)?v:'';}return v;};}if(s.convert_fonts_to_spans)t._convertFonts();if(s.inline_styles)t._convertInlineElements();if(s.cleanup_callback){t.onBeforeSetContent.add(function(ed,o){o.content=t.execCallback('cleanup_callback','insert_to_editor',o.content,o);});t.onPreProcess.add(function(ed,o){if(o.set)t.execCallback('cleanup_callback','insert_to_editor_dom',o.node,o);if(o.get)t.execCallback('cleanup_callback','get_from_editor_dom',o.node,o);});t.onPostProcess.add(function(ed,o){if(o.set)o.content=t.execCallback('cleanup_callback','insert_to_editor',o.content,o);if(o.get)o.content=t.execCallback('cleanup_callback','get_from_editor',o.content,o);});}if(s.save_callback){t.onGetContent.add(function(ed,o){if(o.save)o.content=t.execCallback('save_callback',t.id,o.content,t.getBody());});}if(s.handle_event_callback){t.onEvent.add(function(ed,e,o){if(t.execCallback('handle_event_callback',e,ed,o)===false)Event.cancel(e);});}t.onSetContent.add(function(){t.addVisual(t.getBody());});if(s.padd_empty_editor){t.onPostProcess.add(function(ed,o){o.content=o.content.replace(/^<p>( |#160;|\s)<\/p>$/,'');});}if(isGecko){try{d.designMode='Off';d.designMode='On';}catch(ex){}}setTimeout(function(){if(t.removed)return;t.load({initial:true,format:(s.cleanup_on_startup?'html':'raw')});t.startContent=t.getContent({format:'raw'});t.undoManager.add({initial:true});t.initialized=true;t.onInit.dispatch(t);t.execCallback('setupcontent_callback',t.id,t.getBody(),t.getDoc());t.execCallback('init_instance_callback',t);t.focus(true);t.nodeChanged({initial:1});if(s.content_css){tinymce.each(s.content_css.split(','),function(u){t.dom.loadCSS(t.documentBaseURI.toAbsolute(u));});}if(s.auto_focus){setTimeout(function(){var ed=EditorManager.get(s.auto_focus);ed.selection.select(ed.getBody(),1);ed.selection.collapse(1);ed.getWin().focus();},100);}},1);e=null;},focus:function(sf){var oed,t=this;if(!sf){t.getWin().focus();}if(EditorManager.activeEditor!=t){if((oed=EditorManager.activeEditor)!=null)oed.onDeactivate.dispatch(oed,t);t.onActivate.dispatch(t,oed);}EditorManager._setActive(t);},execCallback:function(n){var t=this,f=t.settings[n],s;if(!f)return;if(t.callbackLookup&&(s=t.callbackLookup[n])){f=s.func;s=s.scope;}if(is(f,'string')){s=f.replace(/\.\w+$/,'');s=s?tinymce.resolve(s):0;f=tinymce.resolve(f);t.callbackLookup=t.callbackLookup||{};t.callbackLookup[n]={func:f,scope:s};}return f.apply(s||t,Array.prototype.slice.call(arguments,1));},translate:function(s){var c=this.settings.language,i18n=EditorManager.i18n;if(!s)return'';return i18n[c+'.'+s]||s.replace(/{\#([^}]+)\}/g,function(a,b){return i18n[c+'.'+b]||'{#'+b+'}';});},getLang:function(n,dv){return EditorManager.i18n[this.settings.language+'.'+n]||(is(dv)?dv:'{#'+n+'}');},getParam:function(n,dv){return is(this.settings[n])?this.settings[n]:dv;},nodeChanged:function(o){var t=this,s=t.selection,n=s.getNode()||this.getBody();this.onNodeChange.dispatch(t,o?o.controlManager||t.controlManager:t.controlManager,isIE&&n.ownerDocument!=t.getDoc()?this.getBody():n,s.isCollapsed(),o);},addButton:function(n,s){var t=this;t.buttons=t.buttons||{};t.buttons[n]=s;},addCommand:function(n,f,s){this.execCommands[n]={func:f,scope:s||this};},addQueryStateHandler:function(n,f,s){this.queryStateCommands[n]={func:f,scope:s||this};},addQueryValueHandler:function(n,f,s){this.queryValueCommands[n]={func:f,scope:s||this};},addShortcut:function(pa,desc,cmd_func,sc){var t=this,c;if(!t.settings.custom_shortcuts)return false;t.shortcuts=t.shortcuts||{};if(is(cmd_func,'string')){c=cmd_func;cmd_func=function(){t.execCommand(c,false,null);};}if(is(cmd_func,'object')){c=cmd_func;cmd_func=function(){t.execCommand(c[0],c[1],c[2]);};}each(pa.split(','),function(pa){var o={func:cmd_func,scope:sc||this,desc:desc,alt:false,ctrl:false,shift:false};each(pa.split('+'),function(v){switch(v){case'alt':case'ctrl':case'shift':o[v]=true;break;default:o.charCode=v.charCodeAt(0);o.keyCode=v.toUpperCase().charCodeAt(0);}});t.shortcuts[(o.ctrl?'ctrl':'')+','+(o.alt?'alt':'')+','+(o.shift?'shift':'')+','+o.keyCode]=o;});return true;},execCommand:function(cmd,ui,val,a){var t=this,s=0,o;if(!/^(mceAddUndoLevel|mceEndUndoLevel|mceBeginUndoLevel|mceRepaint|SelectAll)$/.test(cmd)&&(!a||!a.skip_focus))t.focus();o={};t.onBeforeExecCommand.dispatch(t,cmd,ui,val,o);if(o.terminate)return false;if(t.execCallback('execcommand_callback',t.id,t.selection.getNode(),cmd,ui,val)){t.onExecCommand.dispatch(t,cmd,ui,val);return true;}if(o=t.execCommands[cmd]){s=o.func.call(o.scope,ui,val);t.onExecCommand.dispatch(t,cmd,ui,val);return s;}each(t.plugins,function(p){if(p.execCommand&&p.execCommand(cmd,ui,val)){t.onExecCommand.dispatch(t,cmd,ui,val);s=1;return false;}});if(s)return true;if(t.theme.execCommand&&t.theme.execCommand(cmd,ui,val)){t.onExecCommand.dispatch(t,cmd,ui,val);return true;}if(t.editorCommands.execCommand(cmd,ui,val)){t.onExecCommand.dispatch(t,cmd,ui,val);return true;}t.getDoc().execCommand(cmd,ui,val);t.onExecCommand.dispatch(t,cmd,ui,val);},queryCommandState:function(c){var t=this,o;if(t._isHidden())return;if(o=t.queryStateCommands[c])return o.func.call(o.scope);o=t.editorCommands.queryCommandState(c);if(o!==-1)return o;return this.getDoc().queryCommandState(c);},queryCommandValue:function(c){var t=this,o;if(t._isHidden())return;if(o=t.queryValueCommands[c])return o.func.call(o.scope);o=t.editorCommands.queryCommandValue(c);if(is(o))return o;return this.getDoc().queryCommandValue(c);},show:function(){var t=this;DOM.show(t.getContainer());DOM.hide(t.id);t.load();},hide:function(){var t=this,s=t.settings,d=t.getDoc();if(isIE&&d)d.execCommand('SelectAll');DOM.hide(t.getContainer());DOM.setStyle(s.id,'display',t.orgDisplay);t.save();},isHidden:function(){return!DOM.isHidden(this.id);},setProgressState:function(b,ti,o){this.onSetProgressState.dispatch(this,b,ti,o);return b;},remove:function(){var t=this;t.removed=1;t.hide();DOM.remove(t.getContainer());t.execCallback('remove_instance_callback',t);t.onRemove.dispatch(t);EditorManager.remove(t);},resizeToContent:function(){var t=this;DOM.setStyle(t.id+"_ifr",'height',t.getBody().scrollHeight);},load:function(o){var t=this,e=t.getElement(),h;o=o||{};o.load=true;h=t.setContent(is(e.value)?e.value:e.innerHTML,o);o.element=e;if(!o.no_events)t.onLoadContent.dispatch(t,o);o.element=e=null;return h;},save:function(o){var t=this,e=t.getElement(),h,f;if(!t.initialized)return;o=o||{};o.save=true;o.element=e;h=o.content=t.getContent(o);if(!o.no_events)t.onSaveContent.dispatch(t,o);h=o.content;if(!/TEXTAREA|INPUT/i.test(e.nodeName)){e.innerHTML=h;if(f=DOM.getParent(t.id,'form')){each(f.elements,function(e){if(e.name==t.id){e.value=h;return false;}});}}else e.value=h;o.element=e=null;return h;},setContent:function(h,o){var t=this;o=o||{};o.format=o.format||'html';o.set=true;o.content=h;if(!o.no_events)t.onBeforeSetContent.dispatch(t,o);if(!tinymce.isIE&&(h.length===0||/^\s+$/.test(h))){o.content=t.dom.setHTML(t.getBody(),'<br mce_bogus="1" />',1);o.format='raw';}o.content=t.dom.setHTML(t.getBody(),tinymce.trim(o.content));if(o.format!='raw'&&t.settings.cleanup){o.getInner=true;o.content=t.dom.setHTML(t.getBody(),t.serializer.serialize(t.getBody(),o));}if(!o.no_events)t.onSetContent.dispatch(t,o);return o.content;},getContent:function(o){var t=this,h;o=o||{};o.format=o.format||'html';o.get=true;if(!o.no_events)t.onBeforeGetContent.dispatch(t,o);if(o.format!='raw'&&t.settings.cleanup){o.getInner=true;h=t.serializer.serialize(t.getBody(),o);}else h=t.getBody().innerHTML;h=h.replace(/^\s*|\s*$/g,'');o={content:h};t.onGetContent.dispatch(t,o);return o.content;},isDirty:function(){var t=this;return tinymce.trim(t.startContent)!=tinymce.trim(t.getContent({format:'raw',no_events:1}))&&!t.isNotDirty;},getContainer:function(){var t=this;if(!t.container)t.container=DOM.get(t.editorContainer||t.id+'_parent');return t.container;},getContentAreaContainer:function(){return this.contentAreaContainer;},getElement:function(){return DOM.get(this.settings.content_element||this.id);},getWin:function(){var t=this,e;if(!t.contentWindow){e=DOM.get(t.id+"_ifr");if(e)t.contentWindow=e.contentWindow;}return t.contentWindow;},getDoc:function(){var t=this,w;if(!t.contentDocument){w=this.getWin();if(w)t.contentDocument=w.document;}return t.contentDocument;},getBody:function(){return this.bodyElement||this.getDoc().body;},convertURL:function(u,n,e){var t=this,s=t.settings;if(s.urlconverter_callback)return t.execCallback('urlconverter_callback',u,e,true,n);if(!s.convert_urls||(e&&e.nodeName=='LINK'))return u;if(s.relative_urls)return t.documentBaseURI.toRelative(u);u=t.documentBaseURI.toAbsolute(u,s.remove_script_host);return u;},addVisual:function(e){var t=this,s=t.settings;e=e||t.getBody();if(!is(t.hasVisual))t.hasVisual=s.visual;each(t.dom.select('table,a',e),function(e){var v;switch(e.nodeName){case'TABLE':v=t.dom.getAttrib(e,'border');if(!v||v=='0'){if(t.hasVisual)t.dom.addClass(e,s.visual_table_class);else t.dom.removeClass(e,s.visual_table_class);}return;case'A':v=t.dom.getAttrib(e,'name');if(v){if(t.hasVisual)t.dom.addClass(e,'mceItemAnchor');else t.dom.removeClass(e,'mceItemAnchor');}return;}});t.onVisualAid.dispatch(t,e,t.hasVisual);},_addEvents:function(){var t=this,i,s=t.settings,lo={mouseup:'onMouseUp',mousedown:'onMouseDown',click:'onClick',keyup:'onKeyUp',keydown:'onKeyDown',keypress:'onKeyPress',submit:'onSubmit',reset:'onReset',contextmenu:'onContextMenu',dblclick:'onDblClick',paste:'onPaste'};function eventHandler(e,o){var ty=e.type;if(t.removed)return;if(t.onEvent.dispatch(t,e,o)!==false){t[lo[e.fakeType||e.type]].dispatch(t,e,o);}};each(lo,function(v,k){switch(k){case'contextmenu':if(tinymce.isOpera){Event.add(t.getDoc(),'mousedown',function(e){if(e.ctrlKey){e.fakeType='contextmenu';eventHandler(e);}});}else Event.add(t.getDoc(),k,eventHandler);break;case'paste':Event.add(t.getBody(),k,function(e){var tx,h,el,r;if(e.clipboardData)tx=e.clipboardData.getData('text/plain');else if(tinymce.isIE)tx=t.getWin().clipboardData.getData('Text');eventHandler(e,{text:tx,html:h});});break;case'submit':case'reset':Event.add(t.getElement().form||DOM.getParent(t.id,'form'),k,eventHandler);break;default:Event.add(s.content_editable?t.getBody():t.getDoc(),k,eventHandler);}});Event.add(s.content_editable?t.getBody():(isGecko?t.getDoc():t.getWin()),'focus',function(e){t.focus(true);});if(tinymce.isGecko){Event.add(t.getDoc(),'DOMNodeInserted',function(e){var v;e=e.target;if(e.nodeType===1&&e.nodeName==='IMG'&&(v=e.getAttribute('mce_src')))e.src=t.documentBaseURI.toAbsolute(v);});}if(isGecko){function setOpts(){var t=this,d=t.getDoc(),s=t.settings;if(isGecko){if(t._isHidden()){try{d.designMode='On';}catch(ex){}}try{d.execCommand("styleWithCSS",0,false);}catch(ex){if(!t._isHidden())d.execCommand("useCSS",0,true);}if(!s.table_inline_editing)try{d.execCommand('enableInlineTableEditing',false,false);}catch(ex){}if(!s.object_resizing)try{d.execCommand('enableObjectResizing',false,false);}catch(ex){}}};t.onBeforeExecCommand.add(setOpts);t.onMouseDown.add(setOpts);}t.onMouseUp.add(t.nodeChanged);t.onClick.add(t.nodeChanged);t.onKeyUp.add(function(ed,e){if((e.keyCode>=33&&e.keyCode<=36)||(e.keyCode>=37&&e.keyCode<=40)||e.keyCode==13||e.keyCode==45||e.keyCode==46||e.keyCode==8||e.ctrlKey)t.nodeChanged();});t.onReset.add(function(){t.setContent(t.startContent,{format:'raw'});});if(t.getParam('tab_focus')){function tabCancel(ed,e){if(e.keyCode===9)return Event.cancel(e);};function tabHandler(ed,e){var v,f,el;function find(d){f=DOM.getParent(ed.id,'form'),el=f.elements;if(f){each(f.elements,function(e,i){if(e.id==ed.id){i=i+d;if(i<0||i>el.length)return;el=el[i];}});}return el;};if(e.keyCode===9){v=ed.getParam('tab_focus').split(',');if(v.length==1){v[1]=v[0];v[0]=':prev';}if(e.shiftKey){if(v[0]==':prev')el=find(-1);else el=DOM.get(v[0]);}else{if(v[1]==':next')el=find(1);else el=DOM.get(v[1]);}if(el){if(ed=EditorManager.get(el.id||el.name))ed.focus();else window.setTimeout(function(){window.focus();el.focus();},10);return Event.cancel(e);}}};t.onKeyUp.add(tabCancel);if(isGecko){t.onKeyPress.add(tabHandler);t.onKeyDown.add(tabCancel);}else t.onKeyDown.add(tabHandler);}if(s.custom_shortcuts){if(s.custom_undo_redo_keyboard_shortcuts){t.addShortcut('ctrl+z',t.getLang('undo_desc'),'Undo');t.addShortcut('ctrl+y',t.getLang('redo_desc'),'Redo');}if(isGecko){t.addShortcut('ctrl+b',t.getLang('bold_desc'),'Bold');t.addShortcut('ctrl+i',t.getLang('italic_desc'),'Italic');t.addShortcut('ctrl+u',t.getLang('underline_desc'),'Underline');}for(i=1;i<=6;i++)t.addShortcut('ctrl+'+i,'',['FormatBlock',false,'<h'+i+'>']);t.addShortcut('ctrl+7','',['FormatBlock',false,'<p>']);t.addShortcut('ctrl+8','',['FormatBlock',false,'<div>']);t.addShortcut('ctrl+9','',['FormatBlock',false,'<address>']);function find(e){var v=null;if(!e.altKey&&!e.ctrlKey&&!e.metaKey)return v;each(t.shortcuts,function(o){if(o.ctrl!=e.ctrlKey&&(!tinymce.isMac||o.ctrl==e.metaKey))return;if(o.alt!=e.altKey)return;if(o.shift!=e.shiftKey)return;if(e.keyCode==o.keyCode||(e.charCode&&e.charCode==o.charCode)){v=o;return false;}});return v;};t.onKeyUp.add(function(ed,e){var o=find(e);if(o)return Event.cancel(e);});t.onKeyPress.add(function(ed,e){var o=find(e);if(o)return Event.cancel(e);});t.onKeyDown.add(function(ed,e){var o=find(e);if(o){o.func.call(o.scope);return Event.cancel(e);}});}if(tinymce.isIE){Event.add(t.getDoc(),'controlselect',function(e){var re=t.resizeInfo,cb;e=e.target;if(re)Event.remove(re.node,re.ev,re.cb);if(!t.dom.hasClass(e,'mceItemNoResize')){ev='resizeend';cb=Event.add(e,ev,function(e){var v;e=e.target;if(v=t.dom.getStyle(e,'width')){t.dom.setAttrib(e,'width',v.replace(/[^0-9%]+/g,''));t.dom.setStyle(e,'width','');}if(v=t.dom.getStyle(e,'height')){t.dom.setAttrib(e,'height',v.replace(/[^0-9%]+/g,''));t.dom.setStyle(e,'height','');}});}else{ev='resizestart';cb=Event.add(e,'resizestart',Event.cancel,Event);}re=t.resizeInfo={node:e,ev:ev,cb:cb};});t.onKeyDown.add(function(ed,e){switch(e.keyCode){case 8:if(t.selection.getRng().item){t.selection.getRng().item(0).removeNode();return Event.cancel(e);}}});}if(tinymce.isOpera){t.onClick.add(function(ed,e){Event.prevent(e);});}if(s.custom_undo_redo){function addUndo(){t.undoManager.typing=0;t.undoManager.add();};if(tinymce.isIE){Event.add(t.getWin(),'blur',function(e){var n;if(t.selection){n=t.selection.getNode();if(!t.removed&&n.ownerDocument&&n.ownerDocument!=t.getDoc())addUndo();}});}else{Event.add(t.getDoc(),'blur',function(){if(t.selection&&!t.removed)addUndo();});}t.onMouseDown.add(addUndo);t.onKeyUp.add(function(ed,e){if((e.keyCode>=33&&e.keyCode<=36)||(e.keyCode>=37&&e.keyCode<=40)||e.keyCode==13||e.keyCode==45||e.ctrlKey){t.undoManager.typing=0;t.undoManager.add();}});t.onKeyDown.add(function(ed,e){if((e.keyCode>=33&&e.keyCode<=36)||(e.keyCode>=37&&e.keyCode<=40)||e.keyCode==13||e.keyCode==45){if(t.undoManager.typing){t.undoManager.add();t.undoManager.typing=0;}return;}if(!t.undoManager.typing){t.undoManager.add();t.undoManager.typing=1;}});}},_destroy:function(){var t=this;if(t.formElement){t.formElement.submit=t.formElement._mceOldSubmit;t.formElement._mceOldSubmit=null;}t.contentAreaContainer=t.formElement=t.container=t.contentDocument=t.contentWindow=null;if(t.selection)t.selection=t.selection.win=t.selection.dom=t.selection.dom.doc=null;t.destroyed=1;},_convertInlineElements:function(){var t=this,s=t.settings,dom=t.dom;function convert(ed,o){if(!s.inline_styles)return;if(o.get){each(t.dom.select('table,u,strike',o.node),function(n){switch(n.nodeName){case'TABLE':if(v=dom.getAttrib(n,'height')){dom.setStyle(n,'height',v);dom.setAttrib(n,'height','');}break;case'U':dom.replace(dom.create('span',{style:'text-decoration: underline;'}),n,1);break;case'STRIKE':dom.replace(dom.create('span',{style:'text-decoration: line-through;'}),n,1);break;}});}else if(o.set){each(t.dom.select('table,span',o.node),function(n){if(n.nodeName=='TABLE'){if(v=dom.getStyle(n,'height'))dom.setAttrib(n,'height',v.replace(/[^0-9%]+/g,''));}else{if(n.style.textDecoration=='underline')dom.replace(dom.create('u'),n,1);else if(n.style.textDecoration=='line-through')dom.replace(dom.create('strike'),n,1);}});}};t.onPreProcess.add(convert);if(!s.cleanup_on_startup){t.onInit.add(function(){convert(t,{node:t.getBody(),set:1});});}},_convertFonts:function(){var t=this,s=t.settings,dom=t.dom,sl,cl,fz,fzn,v,i;fz=[8,10,12,14,18,24,36];fzn=['xx-small','x-small','small','medium','large','x-large','xx-large'];if(sl=s.font_size_style_values)sl=sl.split(',');if(cl=s.font_size_classes)cl=cl.split(',');t.onPreProcess.add(function(ed,o){if(!s.inline_styles)return;if(o.set){if(tinymce.isWebKit)return;each(t.dom.select('span',o.node),function(n){var f=dom.create('font',{color:dom.toHex(dom.getStyle(n,'color')),face:dom.getStyle(n,'fontFamily')});if(sl){i=inArray(sl,dom.getStyle(n,'fontSize'));if(i!=-1)dom.setAttrib(f,'size',''+(i+1||1));}else if(cl){i=inArray(cl,dom.getAttrib(n,'class'));v=dom.getStyle(n,'fontSize');if(i==-1&&v.indexOf('pt')>0)i=inArray(fz,parseInt(v));if(i==-1)i=inArray(fzn,v);if(i!=-1)dom.setAttrib(f,'size',''+(i+1||1));}if(f.color||f.face||f.size)dom.replace(f,n,1);});}else if(o.get){each(t.dom.select('font',o.node),function(n){var sp=dom.create('span',{style:{fontFamily:dom.getAttrib(n,'face'),color:dom.getAttrib(n,'color'),backgroundColor:n.style.backgroundColor}});if(n.size){if(sl)dom.setStyle(sp,'fontSize',sl[parseInt(n.size)-1]);else dom.setAttrib(sp,'class',cl[parseInt(n.size)-1]);}dom.replace(sp,n,1);});}});},_isHidden:function(){var s;if(!isGecko)return 0;s=this.selection.getSel();return(!s||!s.rangeCount||s.rangeCount==0);},_fixNesting:function(s){var d=[],i;s=s.replace(/<(\/)?([^\s>]+)[^>]*?>/g,function(a,b,c){var e;if(b==='/'){if(!d.length)return'';if(c!==d[d.length-1].tag){for(i=d.length-1;i>=0;i--){if(d[i].tag===c){d[i].close=1;break;}}return'';}else{d.pop();if(d.length&&d[d.length-1].close){a=a+'</'+d[d.length-1].tag+'>';d.pop();}}}else{if(/^(br|hr|input|meta|img|link|param)$/i.test(c))return a;if(/\/>$/.test(a))return a;d.push({tag:c});}return a;});for(i=d.length-1;i>=0;i--)s+='</'+d[i].tag+'>';return s;}});})();(function(){var each=tinymce.each,isIE=tinymce.isIE,isGecko=tinymce.isGecko,isOpera=tinymce.isOpera,isWebKit=tinymce.isWebKit;tinymce.create('tinymce.EditorCommands',{EditorCommands:function(ed){this.editor=ed;},execCommand:function(cmd,ui,val){var t=this,ed=t.editor,f;switch(cmd){case'Cut':case'Copy':case'Paste':try{ed.getDoc().execCommand(cmd,ui,val);}catch(ex){if(isGecko){ed.windowManager.confirm(ed.getLang('clipboard_msg'),function(s){if(s)window.open('http://www.mozilla.org/editor/midasdemo/securityprefs.html','mceExternal');});}else ed.windowManager.alert(ed.getLang('clipboard_no_support'));}return true;case'mceResetDesignMode':case'mceBeginUndoLevel':return true;case'unlink':t.UnLink();return true;case'JustifyLeft':case'JustifyCenter':case'JustifyRight':case'JustifyFull':t.mceJustify(cmd,cmd.substring(7).toLowerCase());return true;case'mceEndUndoLevel':case'mceAddUndoLevel':ed.undoManager.add();return true;default:f=this[cmd];if(f){f.call(this,ui,val);return true;}}return false;},Indent:function(){var ed=this.editor,d=ed.dom,s=ed.selection,e,iv,iu;iv=ed.settings.indentation;iu=/[a-z%]+$/i.exec(iv);iv=parseInt(iv);if(ed.settings.inline_styles&&(!this.queryStateInsertUnorderedList()&&!this.queryStateInsertOrderedList())){each(this._getSelectedBlocks(),function(e){d.setStyle(e,'paddingLeft',(parseInt(e.style.paddingLeft||0)+iv)+iu);});return;}ed.getDoc().execCommand('Indent',false,null);if(isIE){d.getParent(s.getNode(),function(n){if(n.nodeName=='BLOCKQUOTE'){n.dir=n.style.cssText='';}});}},Outdent:function(){var ed=this.editor,d=ed.dom,s=ed.selection,e,v,iv,iu;iv=ed.settings.indentation;iu=/[a-z%]+$/i.exec(iv);iv=parseInt(iv);if(ed.settings.inline_styles&&(!this.queryStateInsertUnorderedList()&&!this.queryStateInsertOrderedList())){each(this._getSelectedBlocks(),function(e){v=Math.max(0,parseInt(e.style.paddingLeft||0)-iv);d.setStyle(e,'paddingLeft',v?v+iu:'');});return;}ed.getDoc().execCommand('Outdent',false,null);},mceSetAttribute:function(u,v){var ed=this.editor,d=ed.dom,e;if(e=d.getParent(ed.selection.getNode(),d.isBlock))d.setAttrib(e,v.name,v.value);},mceSetContent:function(u,v){this.editor.setContent(v);},mceToggleVisualAid:function(){var ed=this.editor;ed.hasVisual=!ed.hasVisual;ed.addVisual();},mceReplaceContent:function(u,v){var s=this.editor.selection;s.setContent(v.replace(/\{\$selection\}/g,s.getContent({format:'text'})));},mceInsertLink:function(u,v){var ed=this.editor,e=ed.dom.getParent(ed.selection.getNode(),'A');if(tinymce.is(v,'string'))v={href:v};function set(e){each(v,function(v,k){ed.dom.setAttrib(e,k,v);});};if(!e){ed.execCommand('CreateLink',false,'javascript:mctmp(0);');each(ed.dom.select('a'),function(e){if(e.href=='javascript:mctmp(0);')set(e);});}else{if(v.href)set(e);else ed.dom.remove(e,1);}},UnLink:function(){var ed=this.editor,s=ed.selection;if(s.isCollapsed())s.select(s.getNode());ed.getDoc().execCommand('unlink',false,null);s.collapse(0);},FontName:function(u,v){var t=this,ed=t.editor,s=ed.selection,e;if(!v){if(s.isCollapsed())s.select(s.getNode());t.RemoveFormat();}else ed.getDoc().execCommand('FontName',false,v);},queryCommandValue:function(c){var f=this['queryValue'+c];if(f)return f.call(this,c);return false;},queryCommandState:function(cmd){var f;switch(cmd){case'JustifyLeft':case'JustifyCenter':case'JustifyRight':case'JustifyFull':return this.queryStateJustify(cmd,cmd.substring(7).toLowerCase());default:if(f=this['queryState'+cmd])return f.call(this,cmd);}return-1;},queryValueFontSize:function(){var ed=this.editor,v=0,p;if(isOpera||isWebKit){if(p=ed.dom.getParent(ed.selection.getNode(),'FONT'))v=p.size;return v;}return ed.getDoc().queryCommandValue('FontSize');},queryValueFontName:function(){var ed=this.editor,v=0,p;if(p=ed.dom.getParent(ed.selection.getNode(),'FONT'))v=p.face;if(!v)v=ed.getDoc().queryCommandValue('FontName');return v;},mceJustify:function(c,v){var ed=this.editor,se=ed.selection,n=se.getNode(),nn=n.nodeName,bl,nb,dom=ed.dom,rm;if(ed.settings.inline_styles&&this.queryStateJustify(c,v))rm=1;bl=dom.getParent(n,ed.dom.isBlock);if(nn=='IMG'){if(v=='full')return;if(rm){dom.setStyle(n,'float','');this.mceRepaint();return;}if(v=='center'){if(!bl||bl.childNodes.length>1){nb=dom.create('p');nb.appendChild(n.cloneNode(false));if(bl)dom.insertAfter(nb,bl);else dom.insertAfter(nb,n);dom.remove(n);n=nb.firstChild;bl=nb;}dom.setStyle(bl,'textAlign',v);dom.setStyle(n,'float','');}else dom.setStyle(n,'float',v);this.mceRepaint();return;}if(ed.settings.inline_styles&&ed.settings.forced_root_block){if(rm)v='';each(this._getSelectedBlocks(dom.getParent(se.getStart(),dom.isBlock),dom.getParent(se.getEnd(),dom.isBlock)),function(e){dom.setAttrib(e,'align','');dom.setStyle(e,'textAlign',v=='full'?'justify':v);});return;}else if(!rm)ed.getDoc().execCommand(c,false,null);if(ed.settings.inline_styles){if(rm){dom.getParent(ed.selection.getNode(),function(n){if(n.style&&n.style.textAlign)dom.setStyle(n,'textAlign','');});return;}each(dom.select('*'),function(n){var v=n.align;if(v){if(v=='full')v='justify';dom.setStyle(n,'textAlign',v);dom.setAttrib(n,'align','');}});}},mceSetCSSClass:function(u,v){this.mceSetStyleInfo(0,{command:'setattrib',name:'class',value:v});},getSelectedElement:function(){var t=this,ed=t.editor,dom=ed.dom,se=ed.selection,r=se.getRng(),r1,r2,sc,ec,so,eo,e,sp,ep,re;if(se.isCollapsed()||r.item)return se.getNode();re=ed.settings.merge_styles_invalid_parents;if(tinymce.is(re,'string'))re=new RegExp(re,'i');if(isIE){r1=r.duplicate();r1.collapse(true);sc=r1.parentElement();r2=r.duplicate();r2.collapse(false);ec=r2.parentElement();if(sc!=ec){r1.move('character',1);sc=r1.parentElement();}if(sc==ec){r1=r.duplicate();r1.moveToElementText(sc);if(r1.compareEndPoints('StartToStart',r)==0&&r1.compareEndPoints('EndToEnd',r)==0)return re&&re.test(sc.nodeName)?null:sc;}}else{function getParent(n){return dom.getParent(n,function(n){return n.nodeType==1;});};sc=r.startContainer;ec=r.endContainer;so=r.startOffset;eo=r.endOffset;if(!r.collapsed){if(sc==ec){if(so-eo<2){if(sc.hasChildNodes()){sp=sc.childNodes[so];return re&&re.test(sp.nodeName)?null:sp;}}}}if(sc.nodeType!=3||ec.nodeType!=3)return null;if(so==0){sp=getParent(sc);if(sp&&sp.firstChild!=sc)sp=null;}if(so==sc.nodeValue.length){e=sc.nextSibling;if(e&&e.nodeType==1)sp=sc.nextSibling;}if(eo==0){e=ec.previousSibling;if(e&&e.nodeType==1)ep=e;}if(eo==ec.nodeValue.length){ep=getParent(ec);if(ep&&ep.lastChild!=ec)ep=null;}if(sp==ep)return re&&sp&&re.test(sp.nodeName)?null:sp;}return null;},InsertHorizontalRule:function(){if(isGecko||isIE)this.editor.selection.setContent('<hr />');else this.editor.getDoc().execCommand('InsertHorizontalRule',false,'');},RemoveFormat:function(){var t=this,ed=t.editor,s=ed.selection,b;if(isWebKit)s.setContent(s.getContent({format:'raw'}).replace(/(<(span|b|i|strong|em|strike) [^>]+>|<(span|b|i|strong|em|strike)>|<\/(span|b|i|strong|em|strike)>|)/g,''),{format:'raw'});else ed.getDoc().execCommand('RemoveFormat',false,null);t.mceSetStyleInfo(0,{command:'removeformat'});ed.addVisual();},mceSetStyleInfo:function(u,v){var t=this,ed=t.editor,d=ed.getDoc(),dom=ed.dom,e,b,s=ed.selection,nn=v.wrapper||'span',b=s.getBookmark(),re;function set(n,e){if(n.nodeType==1){switch(v.command){case'setattrib':return dom.setAttrib(n,v.name,v.value);case'setstyle':return dom.setStyle(n,v.name,v.value);case'removeformat':return dom.setAttrib(n,'class','');}}};re=ed.settings.merge_styles_invalid_parents;if(tinymce.is(re,'string'))re=new RegExp(re,'i');if(e=t.getSelectedElement())set(e,1);else{d.execCommand('FontName',false,'__');each(isWebKit?dom.select('span'):dom.select('font'),function(n){var sp,e;if(dom.getAttrib(n,'face')=='__'||n.style.fontFamily==='__'){sp=dom.create(nn,{mce_new:'1'});set(sp);each(n.childNodes,function(n){sp.appendChild(n.cloneNode(true));});dom.replace(sp,n);}});}each(dom.select(nn).reverse(),function(n){var p=n.parentNode;dom.setAttrib(n,'mce_new','');if(!dom.getAttrib(n,'mce_new')){p=dom.getParent(n,function(n){return n.nodeType==1&&dom.getAttrib(n,'mce_new');});if(p)dom.remove(n,1);}});each(dom.select(nn).reverse(),function(n){var p=n.parentNode;if(!p)return;if(p.nodeName==nn.toUpperCase()&&p.childNodes.length==1)return dom.remove(p,1);if(n.nodeType==1&&(!re||!re.test(p.nodeName))&&p.childNodes.length==1){set(p);dom.setAttrib(n,'class','');}});each(dom.select(nn).reverse(),function(n){if(!dom.getAttrib(n,'class')&&!dom.getAttrib(n,'style'))return dom.remove(n,1);});s.moveToBookmark(b);},queryStateJustify:function(c,v){var ed=this.editor,n=ed.selection.getNode(),dom=ed.dom;if(n&&n.nodeName=='IMG')return dom.getStyle(n,'float')==v;n=dom.getParent(ed.selection.getStart(),function(n){return n.nodeType==1&&n.style.textAlign;});if(v=='full')v='justify';if(ed.settings.inline_styles)return(n&&n.style.textAlign==v);return ed.getDoc().queryCommandState(c);},HiliteColor:function(ui,val){var t=this,ed=t.editor,d=ed.getDoc();function set(s){if(!isGecko)return;try{d.execCommand("styleWithCSS",0,s);}catch(ex){d.execCommand("useCSS",0,!s);}};if(isGecko||isOpera){set(true);d.execCommand('hilitecolor',false,val);set(false);}else d.execCommand('BackColor',false,val);},Undo:function(){var ed=this.editor;if(ed.settings.custom_undo_redo){ed.undoManager.undo();ed.nodeChanged();}else ed.getDoc().execCommand('Undo',false,null);},Redo:function(){var ed=this.editor;if(ed.settings.custom_undo_redo){ed.undoManager.redo();ed.nodeChanged();}else ed.getDoc().execCommand('Redo',false,null);},FormatBlock:function(ui,val){var t=this,ed=t.editor;val=ed.settings.forced_root_block?(val||'<p>'):val;t.mceRemoveNode();if(val.indexOf('<')==-1)val='<'+val+'>';if(tinymce.isGecko)val=val.replace(/<(div|blockquote|code|dt|dd|dl|samp)>/gi,'$1');ed.getDoc().execCommand('FormatBlock',false,val);},mceCleanup:function(){var ed=this.editor,s=ed.selection,b=s.getBookmark();ed.setContent(ed.getContent());s.moveToBookmark(b);},mceRemoveNode:function(ui,val){var ed=this.editor,s=ed.selection,b,n=val||s.getNode();if(n==ed.getBody())return;b=s.getBookmark();ed.dom.remove(n,1);s.moveToBookmark(b);ed.nodeChanged();},mceSelectNodeDepth:function(ui,val){var ed=this.editor,s=ed.selection,c=0;ed.dom.getParent(s.getNode(),function(n){if(n.nodeType==1&&c++==val){s.select(n);ed.nodeChanged();return false;}},ed.getBody());},mceSelectNode:function(u,v){this.editor.selection.select(v);},mceInsertContent:function(ui,val){this.editor.selection.setContent(val);},mceInsertRawHTML:function(ui,val){var ed=this.editor;ed.execCommand('mceInsertContent',false,'tiny_mce_marker');ed.setContent(ed.getContent().replace(/tiny_mce_marker/g,val));},mceRepaint:function(){var s,b,e=this.editor;if(tinymce.isGecko){try{s=e.selection;b=s.getBookmark(true);if(s.getSel())s.getSel().selectAllChildren(e.getBody());s.collapse(true);s.moveToBookmark(b);}catch(ex){}}},queryStateUnderline:function(){var ed=this.editor,n;if(n&&n.nodeName=='A')return false;return ed.getDoc().queryCommandState('Underline');},queryStateOutdent:function(){var ed=this.editor,n;if(ed.settings.inline_styles){if((n=ed.dom.getParent(ed.selection.getStart(),ed.dom.isBlock))&&parseInt(n.style.paddingLeft)>0)return true;if((n=ed.dom.getParent(ed.selection.getEnd(),ed.dom.isBlock))&&parseInt(n.style.paddingLeft)>0)return true;}else return!!ed.dom.getParent(ed.selection.getNode(),'BLOCKQUOTE');return this.queryStateInsertUnorderedList()||this.queryStateInsertOrderedList();},queryStateInsertUnorderedList:function(){return this.editor.dom.getParent(this.editor.selection.getNode(),'UL');},queryStateInsertOrderedList:function(){return this.editor.dom.getParent(this.editor.selection.getNode(),'OL');},queryStatemceBlockQuote:function(){return!!this.editor.dom.getParent(this.editor.selection.getStart(),function(n){return n.nodeName==='BLOCKQUOTE';});},mceBlockQuote:function(){var t=this,s=t.editor.selection,b=s.getBookmark(),bq,dom=t.editor.dom;function findBQ(e){return dom.getParent(e,function(n){return n.nodeName==='BLOCKQUOTE';});};if(findBQ(s.getStart())){each(t._getSelectedBlocks(findBQ(s.getStart()),findBQ(s.getEnd())),function(e){if(e.nodeName=='BLOCKQUOTE')dom.remove(e,1);});t.editor.selection.moveToBookmark(b);return;}each(t._getSelectedBlocks(findBQ(s.getStart()),findBQ(s.getEnd())),function(e){var n;if(e.nodeName=='BLOCKQUOTE'&&!bq){bq=e;return;}if(!bq){bq=dom.create('blockquote');e.parentNode.insertBefore(bq,e);}if(e.nodeName=='BLOCKQUOTE'&&bq){n=e.firstChild;while(n){bq.appendChild(n.cloneNode(true));n=n.nextSibling;}dom.remove(e);return;}bq.appendChild(dom.remove(e));});t.editor.selection.moveToBookmark(b);},_getSelectedBlocks:function(st,en){var ed=this.editor,dom=ed.dom,s=ed.selection,sb,eb,n,bl=[];sb=dom.getParent(st||s.getStart(),dom.isBlock);eb=dom.getParent(en||s.getEnd(),dom.isBlock);if(sb)bl.push(sb);if(sb&&eb&&sb!=eb){n=sb;while((n=n.nextSibling)&&n!=eb){if(dom.isBlock(n))bl.push(n);}}if(eb&&sb!=eb)bl.push(eb);return bl;}});})();tinymce.create('tinymce.UndoManager',{index:0,data:null,typing:0,UndoManager:function(ed){var t=this,Dispatcher=tinymce.util.Dispatcher;t.editor=ed;t.data=[];t.onAdd=new Dispatcher(this);t.onUndo=new Dispatcher(this);t.onRedo=new Dispatcher(this);},add:function(l){var t=this,i,ed=t.editor,b,s=ed.settings,la;l=l||{};l.content=l.content||ed.getContent({format:'raw',no_events:1});l.content=l.content.replace(/^\s*|\s*$/g,'');la=t.data[t.index>0?t.index-1:0];if(!l.initial&&la&&l.content==la.content)return null;if(s.custom_undo_redo_levels){if(t.data.length>s.custom_undo_redo_levels){for(i=0;i<t.data.length-1;i++)t.data[i]=t.data[i+1];t.data.length--;t.index=t.data.length;}}if(s.custom_undo_redo_restore_selection)l.bookmark=b=l.bookmark||ed.selection.getBookmark();if(t.index<t.data.length&&t.data[t.index].initial)t.index++;t.data.length=t.index+1;t.data[t.index++]=l;if(l.initial)t.index=0;if(t.data.length==2&&t.data[0].initial)t.data[0].bookmark=b;t.onAdd.dispatch(t,l);ed.isNotDirty=0;return l;},undo:function(){var t=this,ed=t.editor,l=l,i;if(t.typing){t.add();t.typing=0;}if(t.index>0){if(t.index==t.data.length&&t.index>1){i=t.index;t.typing=0;if(!t.add())t.index=i;--t.index;}l=t.data[--t.index];ed.setContent(l.content,{format:'raw'});ed.selection.moveToBookmark(l.bookmark);t.onUndo.dispatch(t,l);}return l;},redo:function(){var t=this,ed=t.editor,l=null;if(t.index<t.data.length-1){l=t.data[++t.index];ed.setContent(l.content,{format:'raw'});ed.selection.moveToBookmark(l.bookmark);t.onRedo.dispatch(t,l);}return l;},clear:function(){var t=this;t.data=[];t.index=0;t.typing=0;t.add({initial:true});},hasUndo:function(){return this.index!=0||this.typing;},hasRedo:function(){return this.index<this.data.length-1;}});(function(){var Event,isIE,isGecko,isOpera,each,extend;Event=tinymce.dom.Event;isIE=tinymce.isIE;isGecko=tinymce.isGecko;isOpera=tinymce.isOpera;each=tinymce.each;extend=tinymce.extend;tinymce.create('tinymce.ForceBlocks',{ForceBlocks:function(ed){var t=this,s;t.editor=ed;t.dom=ed.dom;t.settings=s=extend({element:'P',forced_root_block:'p',force_p_newlines:true},ed.settings);ed.onPreInit.add(t.setup,t);function padd(ed,o){if(isOpera)o.content=o.content.replace(/(\u00a0| | )<\/p>/gi,'</p>');o.content=o.content.replace(/<p( )([^>]+)><\/p>|<p( )([^>]+)\/>|<p( )([^>]+)>\s+<\/p>|<p><\/p>|<p\/>|<p>\s+<\/p>/gi,'<p$1$2$3$4$5$6>\u00a0</p>');if(!isIE&&o.set){o.content=o.content.replace(/<p( )([^>]+)>[\s\u00a0]+<\/p>|<p>[\s\u00a0]+<\/p>/gi,'<p$1$2><br /></p>');}else{o.content=o.content.replace(/<p( )([^>]+)>\s*<br \/>\s*<\/p>|<p>\s*<br \/>\s*<\/p>/gi,'<p$1$2>\u00a0</p>');o.content=o.content.replace(/\s*<br \/>\s*<\/p>/gi,'</p>');}};ed.onBeforeSetContent.add(padd);ed.onPostProcess.add(padd);if(s.forced_root_block){ed.onInit.add(t.forceRoots,t);ed.onSetContent.add(t.forceRoots,t);ed.onBeforeGetContent.add(t.forceRoots,t);}},setup:function(){var t=this,ed=t.editor,s=t.settings;if(s.forced_root_block){ed.onKeyUp.add(t.forceRoots,t);ed.onPreProcess.add(t.forceRoots,t);}if(s.force_br_newlines){if(isIE){ed.onKeyPress.add(function(ed,e){var n,s=ed.selection;if(e.keyCode==13){s.setContent('<br id="__" /> ',{format:'raw'});n=ed.dom.get('__');n.removeAttribute('id');s.select(n);s.collapse();return Event.cancel(e);}});}return;}if(!isIE&&s.force_p_newlines){ed.onPreProcess.add(function(ed,o){each(ed.dom.select('br',o.node),function(n){var p=n.parentNode;if(p&&p.nodeName=='p'&&(p.childNodes.length==1||p.lastChild==n))p.replaceChild(ed.getDoc().createTextNode('\u00a0'),n);});});ed.onKeyPress.add(function(ed,e){if(e.keyCode==13&&!e.shiftKey){if(!t.insertPara(e))Event.cancel(e);}});if(isGecko){ed.onKeyDown.add(function(ed,e){if((e.keyCode==8||e.keyCode==46)&&!e.shiftKey)t.backspaceDelete(e,e.keyCode==8);});}}},find:function(n,t,s){var ed=this.editor,w=ed.getDoc().createTreeWalker(n,4,null,false),c=-1;while(n=w.nextNode()){c++;if(t==0&&n==s)return c;if(t==1&&c==s)return n;}return-1;},forceRoots:function(ed,e){var t=this,ed=t.editor,b=ed.getBody(),d=ed.getDoc(),se=ed.selection,s=se.getSel(),r=se.getRng(),si=-2,ei,so,eo,tr,c=-0xFFFFFF;var nx,bl,bp,sp,le,nl=b.childNodes,i;if(e&&e.keyCode==13)return true;for(i=nl.length-1;i>=0;i--){nx=nl[i];if(nx.nodeType==3||!t.dom.isBlock(nx)){if(!bl){if(nx.nodeType!=3||/[^\s]/g.test(nx.nodeValue)){if(si==-2&&r){if(!isIE){so=r.startOffset;eo=r.endOffset;si=t.find(b,0,r.startContainer);ei=t.find(b,0,r.endContainer);}else{tr=d.body.createTextRange();tr.moveToElementText(b);tr.collapse(1);bp=tr.move('character',c)*-1;tr=r.duplicate();tr.collapse(1);sp=tr.move('character',c)*-1;tr=r.duplicate();tr.collapse(0);le=(tr.move('character',c)*-1)-sp;si=sp-bp;ei=le;}}bl=ed.dom.create(t.settings.forced_root_block);bl.appendChild(nx.cloneNode(1));nx.parentNode.replaceChild(bl,nx);}}else{if(bl.hasChildNodes())bl.insertBefore(nx,bl.firstChild);else bl.appendChild(nx);}}else bl=null;}if(si!=-2){if(!isIE){bl=d.getElementsByTagName(t.settings.element)[0];r=d.createRange();if(si!=-1)r.setStart(t.find(b,1,si),so);else r.setStart(bl,0);if(ei!=-1)r.setEnd(t.find(b,1,ei),eo);else r.setEnd(bl,0);if(s){s.removeAllRanges();s.addRange(r);}}else{try{r=s.createRange();r.moveToElementText(b);r.collapse(1);r.moveStart('character',si);r.moveEnd('character',ei);r.select();}catch(ex){}}}},getParentBlock:function(n){var d=this.dom;return d.getParent(n,d.isBlock);},insertPara:function(e){var t=this,ed=t.editor,d=ed.getDoc(),se=t.settings,s=ed.selection.getSel(),r=s.getRangeAt(0),b=d.body;var rb,ra,dir,sn,so,en,eo,sb,eb,bn,bef,aft,sc,ec,n;function isEmpty(n){n=n.innerHTML;n=n.replace(/<(img|hr|table)/gi,'-');n=n.replace(/<[^>]+>/g,'');return n.replace(/[ \t\r\n]+/g,'')=='';};rb=d.createRange();rb.setStart(s.anchorNode,s.anchorOffset);rb.collapse(true);ra=d.createRange();ra.setStart(s.focusNode,s.focusOffset);ra.collapse(true);dir=rb.compareBoundaryPoints(rb.START_TO_END,ra)<0;sn=dir?s.anchorNode:s.focusNode;so=dir?s.anchorOffset:s.focusOffset;en=dir?s.focusNode:s.anchorNode;eo=dir?s.focusOffset:s.anchorOffset;if(sn==b&&en==b&&b.firstChild&&ed.dom.isBlock(b.firstChild)){sn=en=sn.firstChild;so=eo=0;rb=d.createRange();rb.setStart(sn,0);ra=d.createRange();ra.setStart(en,0);}sn=sn.nodeName=="BODY"?sn.firstChild:sn;en=en.nodeName=="BODY"?en.firstChild:en;sb=t.getParentBlock(sn);eb=t.getParentBlock(en);bn=sb?sb.nodeName:se.element;if(t.dom.getParent(sb,function(n){return/OL|UL|PRE/.test(n.nodeName);}))return true;if(sb&&(sb.nodeName=='CAPTION'||/absolute|relative|static/gi.test(sb.style.position))){bn=se.element;sb=null;}if(eb&&(eb.nodeName=='CAPTION'||/absolute|relative|static/gi.test(eb.style.position))){bn=se.element;eb=null;}if(/(TD|TABLE|TH|CAPTION)/.test(bn)||(sb&&bn=="DIV"&&/left|right/gi.test(sb.style.cssFloat))){bn=se.element;sb=eb=null;}bef=(sb&&sb.nodeName==bn)?sb.cloneNode(0):ed.dom.create(bn);aft=(eb&&eb.nodeName==bn)?eb.cloneNode(0):ed.dom.create(bn);aft.removeAttribute('id');if(/^(H[1-6])$/.test(bn)&&sn.nodeValue&&so==sn.nodeValue.length)aft=ed.dom.create(se.element);n=sc=sn;do{if(n==b||n.nodeType==9||t.dom.isBlock(n)||/(TD|TABLE|TH|CAPTION)/.test(n.nodeName))break;sc=n;}while((n=n.previousSibling?n.previousSibling:n.parentNode));n=ec=en;do{if(n==b||n.nodeType==9||t.dom.isBlock(n)||/(TD|TABLE|TH|CAPTION)/.test(n.nodeName))break;ec=n;}while((n=n.nextSibling?n.nextSibling:n.parentNode));if(sc.nodeName==bn)rb.setStart(sc,0);else rb.setStartBefore(sc);rb.setEnd(sn,so);bef.appendChild(rb.cloneContents()||d.createTextNode(''));try{ra.setEndAfter(ec);}catch(ex){}ra.setStart(en,eo);aft.appendChild(ra.cloneContents()||d.createTextNode(''));r=d.createRange();if(!sc.previousSibling&&sc.parentNode.nodeName==bn){r.setStartBefore(sc.parentNode);}else{if(rb.startContainer.nodeName==bn&&rb.startOffset==0)r.setStartBefore(rb.startContainer);else r.setStart(rb.startContainer,rb.startOffset);}if(!ec.nextSibling&&ec.parentNode.nodeName==bn)r.setEndAfter(ec.parentNode);else r.setEnd(ra.endContainer,ra.endOffset);r.deleteContents();if(bef.firstChild&&bef.firstChild.nodeName==bn)bef.innerHTML=bef.firstChild.innerHTML;if(aft.firstChild&&aft.firstChild.nodeName==bn)aft.innerHTML=aft.firstChild.innerHTML;if(isEmpty(bef))bef.innerHTML='<br />';if(isEmpty(aft))aft.innerHTML=isOpera?' ':'<br />';if(isOpera){r.insertNode(bef);r.insertNode(aft);}else{r.insertNode(aft);r.insertNode(bef);}aft.normalize();bef.normalize();r=d.createRange();r.selectNodeContents(aft);r.collapse(1);s.removeAllRanges();s.addRange(r);if(tinymce.isWebKit)ed.getWin().scrollTo(0,ed.dom.getPos(aft).y);else aft.scrollIntoView(0);return false;},backspaceDelete:function(e,bs){var t=this,ed=t.editor,b=ed.getBody(),n,se=ed.selection,r=se.getRng(),sc=r.startContainer,n;if(sc&&ed.dom.isBlock(sc)&&bs){if(sc.childNodes.length==1&&sc.firstChild.nodeName=='BR'){n=sc.previousSibling;if(n){ed.dom.remove(sc);se.select(n,1);se.collapse(0);return Event.cancel(e);}}}function handler(e){e=e.target;if(e&&e.parentNode&&e.nodeName=='BR'&&t.getParentBlock(e)){ed.dom.remove(e);Event.remove(b,'DOMNodeInserted',handler);}};Event._add(b,'DOMNodeInserted',handler);window.setTimeout(function(){Event._remove(b,'DOMNodeInserted',handler);},1);}});})();(function(){var DOM=tinymce.DOM,Event=tinymce.dom.Event,each=tinymce.each,extend=tinymce.extend;tinymce.create('tinymce.ControlManager',{ControlManager:function(ed,s){var t=this,i;s=s||{};t.editor=ed;t.controls={};t.onAdd=new tinymce.util.Dispatcher(t);t.onPostRender=new tinymce.util.Dispatcher(t);t.prefix=s.prefix||ed.id+'_';t.onPostRender.add(function(){each(t.controls,function(c){c.postRender();});});},get:function(id){return this.controls[this.prefix+id]||this.controls[id];},setActive:function(id,s){var c=null;if(c=this.get(id))c.setActive(s);return c;},setDisabled:function(id,s){var c=null;if(c=this.get(id))c.setDisabled(s);return c;},add:function(c){var t=this;if(c){t.controls[c.id]=c;t.onAdd.dispatch(c,t);}return c;},createControl:function(n){var c,t=this,ed=t.editor;each(ed.plugins,function(p){if(p.createControl){c=p.createControl(n,t);if(c)return false;}});switch(n){case"|":case"separator":return t.createSeparator();}if(!c&&ed.buttons&&(c=ed.buttons[n]))return t.createButton(n,c);return t.add(c);},createDropMenu:function(id,s){var t=this,ed=t.editor,c;s=extend({'class':'mceDropDown'},s);s['class']=s['class']+' '+ed.getParam('skin')+'Skin';id=t.prefix+id;c=t.controls[id]=new tinymce.ui.DropMenu(id,s);c.onAddItem.add(function(c,o){var s=o.settings;s.title=ed.getLang(s.title,s.title);if(!s.onclick){s.onclick=function(v){ed.execCommand(s.cmd,s.ui||false,v||s.value);};}});ed.onRemove.add(function(){c.destroy();});return t.add(c);},createListBox:function(id,s){var t=this,ed=t.editor,cmd,c;if(t.get(id))return null;s.title=ed.translate(s.title);s.scope=s.scope||ed;if(!s.onselect){s.onselect=function(v){ed.execCommand(s.cmd,s.ui||false,v||s.value);};}s=extend({title:s.title,'class':id,scope:s.scope,control_manager:t},s);id=t.prefix+id;if(ed.settings.use_native_selects)c=new tinymce.ui.NativeListBox(id,s);else c=new tinymce.ui.ListBox(id,s);t.controls[id]=c;if(tinymce.isWebKit){c.onPostRender.add(function(c,n){Event.add(n,'mousedown',function(){ed.bookmark=ed.selection.getBookmark('simple');});Event.add(n,'focus',function(){ed.selection.moveToBookmark(ed.bookmark);ed.bookmark=null;});});}if(c.hideMenu)ed.onMouseDown.add(c.hideMenu,c);return t.add(c);},createButton:function(id,s){var t=this,ed=t.editor,o,c;if(t.get(id))return null;s.title=ed.translate(s.title);s.scope=s.scope||ed;if(!s.onclick&&!s.menu_button){s.onclick=function(){ed.execCommand(s.cmd,s.ui||false,s.value);};}s=extend({title:s.title,'class':id,unavailable_prefix:ed.getLang('unavailable',''),scope:s.scope,control_manager:t},s);id=t.prefix+id;if(s.menu_button){c=new tinymce.ui.MenuButton(id,s);ed.onMouseDown.add(c.hideMenu,c);}else c=new tinymce.ui.Button(id,s);return t.add(c);},createMenuButton:function(id,s){s=s||{};s.menu_button=1;return this.createButton(id,s);},createSplitButton:function(id,s){var t=this,ed=t.editor,cmd,c;if(t.get(id))return null;s.title=ed.translate(s.title);s.scope=s.scope||ed;if(!s.onclick){s.onclick=function(v){ed.execCommand(s.cmd,s.ui||false,v||s.value);};}if(!s.onselect){s.onselect=function(v){ed.execCommand(s.cmd,s.ui||false,v||s.value);};}s=extend({title:s.title,'class':id,scope:s.scope,control_manager:t},s);id=t.prefix+id;c=t.add(new tinymce.ui.SplitButton(id,s));ed.onMouseDown.add(c.hideMenu,c);return c;},createColorSplitButton:function(id,s){var t=this,ed=t.editor,cmd,c;if(t.get(id))return null;s.title=ed.translate(s.title);s.scope=s.scope||ed;if(!s.onclick){s.onclick=function(v){ed.execCommand(s.cmd,s.ui||false,v||s.value);};}if(!s.onselect){s.onselect=function(v){ed.execCommand(s.cmd,s.ui||false,v||s.value);};}s=extend({title:s.title,'class':id,'menu_class':ed.getParam('skin')+'Skin',scope:s.scope,more_colors_title:ed.getLang('more_colors')},s);id=t.prefix+id;c=new tinymce.ui.ColorSplitButton(id,s);ed.onMouseDown.add(c.hideMenu,c);return t.add(c);},createToolbar:function(id,s){var c,t=this;id=t.prefix+id;c=new tinymce.ui.Toolbar(id,s);if(t.get(id))return null;return t.add(c);},createSeparator:function(){return new tinymce.ui.Separator();}});})();(function(){var Dispatcher=tinymce.util.Dispatcher,each=tinymce.each,isIE=tinymce.isIE,isOpera=tinymce.isOpera;tinymce.create('tinymce.WindowManager',{WindowManager:function(ed){var t=this;t.editor=ed;t.onOpen=new Dispatcher(t);t.onClose=new Dispatcher(t);t.params={};t.features={};},open:function(s,p){var t=this,f='',x,y,mo=t.editor.settings.dialog_type=='modal',w,sw,sh,vp=tinymce.DOM.getViewPort();s=s||{};p=p||{};sw=isOpera?vp.w:screen.width;sh=isOpera?vp.h:screen.height;s.name=s.name||'mc_'+new Date().getTime();s.width=parseInt(s.width||320);s.height=parseInt(s.height||240);s.resizable=true;s.left=s.left||parseInt(sw/ 2.0) - (s.width /2.0);s.top=s.top||parseInt(sh/ 2.0) - (s.height /2.0);p.inline=false;p.mce_width=s.width;p.mce_height=s.height;if(mo){if(isIE){s.center=true;s.help=false;s.dialogWidth=s.width+'px';s.dialogHeight=s.height+'px';s.scroll=s.scrollbars||false;}else s.modal=s.alwaysRaised=s.dialog=s.centerscreen=s.dependent=true;}each(s,function(v,k){if(tinymce.is(v,'boolean'))v=v?'yes':'no';if(!/^(name|url)$/.test(k)){if(isIE&&mo)f+=(f?';':'')+k+':'+v;else f+=(f?',':'')+k+'='+v;}});t.features=s;t.params=p;t.onOpen.dispatch(t,s,p);try{if(isIE&&mo){w=1;window.showModalDialog(s.url||s.file,window,f);}else w=window.open(s.url||s.file,s.name,f);}catch(ex){}if(!w)alert(t.editor.getLang('popup_blocked'));},close:function(w){w.close();this.onClose.dispatch(this);},createInstance:function(cl){var a=arguments,i,f=tinymce.resolve(cl),s='';for(i=1;i<a.length;i++)s+=(i>1?',':'')+'a['+i+']';return eval('(new f('+s+'))');},confirm:function(t,cb,s){cb.call(s||this,confirm(this._decode(this.editor.getLang(t,t))));},alert:function(t,cb,s){alert(this._decode(t));if(cb)cb.call(s||this);},_decode:function(s){return tinymce.DOM.decode(s).replace(/\\n/g,'\n');}});}()); -
trunk/wp-includes/js/tinymce/tiny_mce_config.php
r6689 r6694 26 26 $valid_elements = apply_filters('mce_valid_elements', $valid_elements); 27 27 28 28 $invalid_elements = apply_filters('mce_invalid_elements', ''); 29 29 30 $plugins = array( 'safari', 'inlinepopups', 'autosave', 'spellchecker', 'paste', 'wordpress', ' wphelp', 'media', 'fullscreen' );30 $plugins = array( 'safari', 'inlinepopups', 'autosave', 'spellchecker', 'paste', 'wordpress', 'media', 'fullscreen' ); 31 31 $plugins = apply_filters('mce_plugins', $plugins); 32 32 $plugins = implode($plugins, ','); 33 33 34 $mce_buttons = apply_filters('mce_buttons', array('bold', 'italic', 'strikethrough', ' separator', 'bullist', 'numlist', 'outdent', 'indent', 'separator', 'justifyleft', 'justifycenter', 'justifyright', 'separator', 'link', 'unlink', 'image', 'wp_more', 'separator', 'spellchecker', 'separator', 'wp_help', 'wp_adv', 'wp_adv_start', 'wp_adv_end'));34 $mce_buttons = apply_filters('mce_buttons', array('bold', 'italic', 'strikethrough', '|', 'bullist', 'numlist', 'outdent', 'indent', '|', 'justifyleft', 'justifycenter', 'justifyright', '|', 'link', 'unlink', 'image', 'wp_more', '|', 'spellchecker', '|', 'wp_help', 'wp_adv' )); 35 35 $mce_buttons = implode($mce_buttons, ','); 36 36 37 $mce_buttons_2 = apply_filters('mce_buttons_2', array('formatselect', 'underline', 'justifyfull', 'forecolor', 'media', 'separator', 'pastetext', 'pasteword', 'separator', 'removeformat', 'cleanup', 'separator', 'charmap', 'separator', 'undo', 'redo', 'fullscreen')); 37 38 $mce_buttons_2 = apply_filters('mce_buttons_2', array('formatselect', 'underline', 'justifyfull', 'forecolor', '|', 'pastetext', 'pasteword', '|', 'removeformat', 'cleanup', '|', 'media', 'charmap', 'blockquote', '|', 'undo', 'redo', 'fullscreen' )); 38 39 $mce_buttons_2 = implode($mce_buttons_2, ','); 39 40 40 41 $mce_buttons_3 = apply_filters('mce_buttons_3', array()); 41 42 $mce_buttons_3 = implode($mce_buttons_3, ','); 43 44 $mce_buttons_4 = apply_filters('mce_buttons_4', array()); 45 $mce_buttons_4 = implode($mce_buttons_4, ','); 42 46 43 47 $mce_browsers = apply_filters('mce_browsers', array('msie', 'gecko', 'opera', 'safari')); 44 48 $mce_browsers = implode($mce_browsers, ','); 45 49 46 $mce_popups_css = get_option('siteurl') . '/wp-includes/js/tinymce/plugins/wordpress/popups.css'; 47 $mce_css = get_option('siteurl') . '/wp-includes/js/tinymce/plugins/wordpress/wordpress.css'; 50 $mce_css = get_option('siteurl') . '/wp-includes/js/tinymce/wordpress.css'; 48 51 $mce_css = apply_filters('mce_css', $mce_css); 49 if ( $_SERVER['HTTPS'] == 'on' ) {52 if ( $_SERVER['HTTPS'] == 'on' ) 50 53 $mce_css = str_replace('http://', 'https://', $mce_css); 51 $mce_popups_css = str_replace('http://', 'https://', $mce_popups_css);52 }53 54 54 55 $mce_locale = ( '' == get_locale() ) ? 'en' : strtolower(get_locale()); 55 56 ?> 56 57 57 /*58 wpEditorInit = function() {59 // Activate tinyMCE if it's the user's default editor60 if ( ( 'undefined' == typeof wpTinyMCEConfig ) || 'tinymce' == wpTinyMCEConfig.defaultEditor )61 tinyMCE.execCommand('mceAddControl', false, 'content');62 };63 */64 65 wpEditorInit = function() {66 if ( ( 'undefined' != typeof wpTinyMCEConfig ) && 'tinymce' != wpTinyMCEConfig.defaultEditor )67 tinyMCE.get('content').hide();68 }69 70 58 initArray = { 71 mode : "exact", 72 elements : "content", 73 // editor_selector : "mceEditor", 74 oninit : "wpEditorInit", 75 width : "100%", 59 mode : "none", 60 onpageload : "wpEditorInit", 61 width : "100%", 76 62 theme : "advanced", 77 skin : " o2k7",63 skin : "wp_theme", 78 64 theme_advanced_buttons1 : "<?php echo $mce_buttons; ?>", 79 65 theme_advanced_buttons2 : "<?php echo $mce_buttons_2; ?>", 80 66 theme_advanced_buttons3 : "<?php echo $mce_buttons_3; ?>", 67 theme_advanced_buttons4 : "<?php echo $mce_buttons_4; ?>", 81 68 language : "<?php echo $mce_locale; ?>", 82 69 theme_advanced_toolbar_location : "top", … … 95 82 remove_linebreaks : false, 96 83 fix_list_elements : true, 84 fix_table_elements : true, 97 85 gecko_spellcheck : true, 98 86 entities : "38,amp,60,lt,62,gt", 99 button_tile_map : false, 87 accessibility_focus : false, 88 tab_focus : ":next", 100 89 content_css : "<?php echo $mce_css; ?>", 101 valid_elements : "<?php echo $valid_elements; ?>", 102 invalid_elements : "<?php echo $invalid_elements; ?>", 103 save_callback : 'TinyMCE_wordpressPlugin.saveCallback', 104 imp_version : "<?php echo intval($_GET['ver']); ?>", 90 <?php if ( $valid_elements ) echo 'valid_elements : "' . $valid_elements . '",' . "\n"; ?> 91 <?php if ( $invalid_elements ) echo 'invalid_elements : "' . $invalid_elements . '",' . "\n"; ?> 92 save_callback : "switchEditors.saveCallback", 105 93 <?php do_action('mce_options'); ?> 106 94 plugins : "<?php echo $plugins; ?>" … … 113 101 ?> 114 102 115 tinyMCE .init(initArray);103 tinyMCE_GZ.init(initArray); -
trunk/wp-includes/js/tinymce/tiny_mce_gzip.php
r6632 r6694 1 1 <?php 2 2 /** 3 * $Id: tiny_mce_gzip.php 158 2006-12-21 14:32:19Z spocke $3 * $Id: tiny_mce_gzip.php 315 2007-10-25 14:03:43Z spocke $ 4 4 * 5 5 * @author Moxiecode 6 * @copyright Copyright 2005-2006, Moxiecode Systems AB, All rights reserved.6 * @copyright Copyright © 2005-2006, Moxiecode Systems AB, All rights reserved. 7 7 * 8 8 * This file compresses the TinyMCE JavaScript using GZip and … … 10 10 * Notice: This script defaults the button_tile_map option to true for extra performance. 11 11 */ 12 13 //error_reporting(E_ALL); 14 @require_once('../../../wp-config.php'); // For get_bloginfo(). 12 15 13 @require_once('../../../wp-config.php'); // For get_bloginfo(). 14 ?> 15 var scriptURL = '<?php echo get_bloginfo('wpurl') . '/' . WPINC; ?>/js/tinymce/tiny_mce.js'; 16 document.write('<sc'+'ript language="javascript" type="text/javascript" src="' + scriptURL + '"></script>'); 17 <?php 18 exit; // tiny_mce_gzip.php needs changes, but also it's much easier to test the js when it's not in one big file 19 16 // Headers 17 $expiresOffset = 3600 * 24 * 10; // Cache for 10 days in browser cache 18 header("Content-type: text/javascript"); 19 header("Vary: Accept-Encoding"); // Handle proxies 20 header("Expires: " . gmdate("D, d M Y H:i:s", time() + $expiresOffset) . " GMT"); 21 22 if ( isset($_GET['load']) ) { 23 24 function getParam( $name, $def = false ) { 25 if ( ! isset($_GET[$name]) ) 26 return $def; 27 28 return preg_replace( "/[^0-9a-z\-_,]+/i", "", $_GET[$name] ); // Remove anything but 0-9,a-z,-_ 29 } 30 31 function getFileContents($path) { 32 $path = realpath($path); 33 34 if ( !$path || !@is_file($path) ) 35 return ''; 36 37 if ( function_exists('file_get_contents') ) 38 return @file_get_contents($path); 39 40 $content = ''; 41 $fp = @fopen( $path, 'r' ); 42 if (!$fp) 43 return ''; 44 45 while ( ! feof($fp) ) 46 $content .= fgets($fp); 47 48 fclose($fp); 49 50 return $content; 51 } 52 53 function putFileContents( $path, $content ) { 54 if ( function_exists('file_put_contents') ) 55 return @file_put_contents($path, $content); 56 57 $fp = @fopen($path, 'wb'); 58 if ($fp) { 59 fwrite($fp, $content); 60 fclose($fp); 61 } 62 } 63 64 20 65 // Get input 21 $plugins = explode(',', getParam("plugins", "")); 22 $languages = explode(',', getParam("languages", "")); 23 $themes = explode(',', getParam("themes", "")); 24 $diskCache = getParam("diskcache", "") == "true"; 25 $isJS = getParam("js", "") == "true"; 26 $compress = getParam("compress", "true") == "true"; 27 $suffix = getParam("suffix", "_src") == "_src" ? "_src" : ""; 28 $cachePath = realpath("."); // Cache path, this is where the .gz files will be stored 29 $expiresOffset = 3600 * 24 * 10; // Cache for 10 days in browser cache 30 $content = ""; 66 $plugins = explode( ',', getParam('plugins', '') ); 67 $languages = explode( ',', getParam('languages', '') ); 68 $themes = explode( ',', getParam('themes', '') ); 69 $diskCache = getParam( 'diskcache', '' ) == 'true'; 70 $isJS = getParam( 'js', '' ) == 'true'; 71 $compress = getParam( 'compress', 'true' ) == 'true'; 72 $core = getParam( 'core', 'true' ) == 'true'; 73 $suffix = getParam( 'suffix', '_src' ) == '_src' ? '_src' : ''; 74 $cachePath = realpath('.'); // Cache path, this is where the .gz files will be stored 75 76 $content = ''; 31 77 $encodings = array(); 32 78 $supportsGzip = false; 33 $enc = ""; 34 $cacheKey = ""; 35 36 // Custom extra javascripts to pack 37 $custom = array(/* 38 "some custom .js file", 39 "some custom .js file" 40 */); 41 42 // WP 43 $index = getParam("index", -1); 44 $theme = getParam("theme", ""); 79 $enc = ''; 80 $cacheKey = ''; 81 82 // WP. Language handling could be improved... Concat all translated langs files and store in /wp-content/languages as .mo? 83 $theme = getParam( 'theme', 'advanced' ); 45 84 $themes = array($theme); 46 $language = getParam("language", "en");47 if ( empty($language) ) 48 $language = 'en';49 $languages = array($language);50 85 86 $language = getParam( 'language', 'en' ); 87 $languages = array($language); 88 89 if ( $language != strtolower($language) ) 51 90 $languages[] = strtolower($language); 52 if ( $language != substr($language, 0, 2) ) 91 92 if ( $language != substr($language, 0, 2) ) 53 93 $languages[] = substr($language, 0, 2); 54 $diskCache = false; 94 95 $diskCache = false; 55 96 $isJS = true; 56 97 $suffix = ''; 57 98 58 // Headers 59 header("Content-Type: text/javascript; charset=" . get_bloginfo('charset')); 60 header("Vary: Accept-Encoding"); // Handle proxies 61 header("Expires: " . gmdate("D, d M Y H:i:s", time() + $expiresOffset) . " GMT"); 99 // Custom extra javascripts to pack 100 // WP - add a hook for external plugins to be compressed too? 101 $custom = array(/* 102 'some custom .js file', 103 'some custom .js file' 104 */); 62 105 63 106 // Is called directly then auto init with default settings 64 if ( !$isJS) {65 echo getFileContents( "tiny_mce_gzip.js");66 echo "tinyMCE_GZ.init({});";107 if ( ! $isJS ) { 108 echo getFileContents('tiny_mce_gzip.js'); 109 echo 'tinyMCE_GZ.init({});'; 67 110 die(); 68 111 } 69 112 70 71 if ( $diskCache) {72 if ( !$cachePath)73 die( "alert('Real path failed.');");74 75 $cacheKey = getParam( "plugins", "") . getParam("languages", "") . getParam("themes", "");76 77 foreach ( $custom as $file)113 // Setup cache info 114 if ( $diskCache ) { 115 if ( ! $cachePath ) 116 die('Real path failed.'); 117 118 $cacheKey = getParam( 'plugins', '' ) . getParam( 'languages', '' ) . getParam( 'themes', '' ) . $suffix; 119 120 foreach ( $custom as $file ) 78 121 $cacheKey .= $file; 79 122 80 123 $cacheKey = md5($cacheKey); 81 124 82 if ( $compress)83 $cacheFile = $cachePath . "/tiny_mce_" . $cacheKey . ".gz";125 if ( $compress ) 126 $cacheFile = $cachePath . '/tiny_mce_' . $cacheKey . '.gz'; 84 127 else 85 $cacheFile = $cachePath . "/tiny_mce_" . $cacheKey . ".js";128 $cacheFile = $cachePath . '/tiny_mce_' . $cacheKey . '.js'; 86 129 } 87 130 88 131 // Check if it supports gzip 89 if ( isset($_SERVER['HTTP_ACCEPT_ENCODING']))90 $encodings = explode( ',', strtolower(preg_replace("/\s+/", "", $_SERVER['HTTP_ACCEPT_ENCODING'])));91 92 if ( (in_array('gzip', $encodings) || in_array('x-gzip', $encodings) || isset($_SERVER['---------------'])) && function_exists('ob_gzhandler') && !ini_get('zlib.output_compression') && ini_get('output_handler') != 'ob_gzhandler') {93 $enc = in_array( 'x-gzip', $encodings) ? "x-gzip" : "gzip";132 if ( isset($_SERVER['HTTP_ACCEPT_ENCODING']) ) 133 $encodings = explode( ',', strtolower( preg_replace('/\s+/', '', $_SERVER['HTTP_ACCEPT_ENCODING']) ) ); 134 135 if ( ( in_array('gzip', $encodings) || in_array('x-gzip', $encodings) || isset($_SERVER['---------------']) ) && function_exists('ob_gzhandler') && !ini_get('zlib.output_compression') ) { 136 $enc = in_array( 'x-gzip', $encodings ) ? 'x-gzip' : 'gzip'; 94 137 $supportsGzip = true; 95 138 } 96 139 97 140 // Use cached file disk cache 98 if ( $diskCache && $supportsGzip && file_exists($cacheFile)) {99 if ( $compress)100 header( "Content-Encoding: ". $enc);141 if ( $diskCache && $supportsGzip && file_exists($cacheFile) ) { 142 if ( $compress ) 143 header('Content-Encoding: ' . $enc); 101 144 102 145 echo getFileContents($cacheFile); … … 104 147 } 105 148 106 if ($index > -1) { 107 // Write main script and patch some things 108 if ( $index == 0 ) { 109 // Add core 110 $content .= wp_compact_tinymce_js(getFileContents("tiny_mce" . $suffix . ".js")); 111 $content .= 'TinyMCE.prototype.orgLoadScript = TinyMCE.prototype.loadScript;'; 112 $content .= 'TinyMCE.prototype.loadScript = function() {};var realTinyMCE = tinyMCE;'; 113 } else 114 $content .= 'tinyMCE = realTinyMCE;'; 115 116 // Patch loading functions 117 //$content .= "tinyMCE_GZ.start();"; 118 119 // Do init based on index 120 $content .= "tinyMCE.init(tinyMCECompressed.configs[" . $index . "]);"; 121 122 // Load external plugins 123 if ( $index == 0 ) 124 $content .= "tinyMCECompressed.loadPlugins();"; 149 // Add core 150 if ( $core == 'true' ) { 151 $content .= getFileContents('tiny_mce' . $suffix . '.js'); 152 153 // Patch loading functions 154 $content .= 'tinyMCE_GZ.start();'; 155 } 125 156 126 157 // Add core languages 127 158 $lang_content = ''; 128 foreach ($languages as $lang) 129 $lang_content .= getFileContents("langs/" . $lang . ".js"); 130 if ( empty($lang_content) ) 131 $lang_content .= getFileContents("langs/en.js"); 132 $content .= $lang_content; 159 foreach ( $languages as $lang ) 160 $lang_content .= getFileContents('langs/' . $lang . '.js'); 161 162 if ( empty($lang_content) && file_exists('langs/en.js') ) 163 $lang_content .= getFileContents('langs/en.js'); 164 165 $content .= $lang_content; 133 166 134 167 // Add themes 135 foreach ( $themes as $theme) {136 $content .= wp_compact_tinymce_js(getFileContents( "themes/" . $theme . "/editor_template" . $suffix . ".js"));168 foreach ( $themes as $theme ) { 169 $content .= getFileContents( 'themes/' . $theme . '/editor_template' . $suffix . '.js'); 137 170 138 171 $lang_content = ''; 139 foreach ($languages as $lang) 140 $lang_content .= getFileContents("themes/" . $theme . "/langs/" . $lang . ".js"); 141 if ( empty($lang_content) ) 142 $lang_content .= getFileContents("themes/" . $theme . "/langs/en.js"); 143 $content .= $lang_content; 172 foreach ( $languages as $lang ) 173 $lang_content .= getFileContents( 'themes/' . $theme . '/langs/' . $lang . '.js' ); 174 175 if ( empty($lang_content) && file_exists( 'themes/' . $theme . '/langs/en.js' ) ) 176 $lang_content .= getFileContents( 'themes/' . $theme . '/langs/en.js' ); 177 178 $content .= $lang_content; 144 179 } 145 180 146 181 // Add plugins 147 foreach ( $plugins as $plugin) {148 $content .= getFileContents( "plugins/" . $plugin . "/editor_plugin" . $suffix . ".js");182 foreach ( $plugins as $plugin ) { 183 $content .= getFileContents('plugins/' . $plugin . '/editor_plugin' . $suffix . '.js'); 149 184 150 185 $lang_content = ''; 151 foreach ($languages as $lang) 152 $lang_content .= getFileContents("plugins/" . $plugin . "/langs/" . $lang . ".js"); 153 if ( empty($lang_content) ) 154 $lang_content .= getFileContents("plugins/" . $plugin . "/langs/en.js"); 155 $content .= $lang_content; 186 foreach ( $languages as $lang ) 187 $lang_content .= getFileContents( 'plugins/' . $plugin . '/langs/' . $lang . '.js' ); 188 189 if ( empty($lang_content) && file_exists( 'plugins/' . $plugin . '/langs/en.js' ) ) 190 $lang_content .= getFileContents( 'plugins/' . $plugin . '/langs/en.js' ); 191 192 $content .= $lang_content; 156 193 } 157 194 158 195 // Add custom files 159 foreach ( $custom as $file)196 foreach ( $custom as $file ) 160 197 $content .= getFileContents($file); 161 198 162 // Reset tinyMCE compressor engine163 $content .= "tinyMCE = tinyMCECompressed;";164 165 199 // Restore loading functions 166 //$content .= "tinyMCE_GZ.end();"; 200 if ( $core == 'true' ) 201 $content .= 'tinyMCE_GZ.end();'; 167 202 168 203 // Generate GZIP'd content 169 if ( $supportsGzip) {170 if ( $compress) {171 header( "Content-Encoding: ". $enc);172 $cacheData = gzencode( $content, 9, FORCE_GZIP);204 if ( $supportsGzip ) { 205 if ( $compress ) { 206 header('Content-Encoding: ' . $enc); 207 $cacheData = gzencode( $content, 9, FORCE_GZIP ); 173 208 } else 174 209 $cacheData = $content; 175 210 176 211 // Write gz file 177 if ( $diskCache && $cacheKey != "")178 putFileContents( $cacheFile, $cacheData);212 if ( $diskCache && $cacheKey != '' ) 213 putFileContents( $cacheFile, $cacheData ); 179 214 180 215 // Stream to client … … 185 220 } 186 221 187 die;222 exit; 188 223 } 189 190 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 191 192 function getParam($name, $def = false) { 193 if (!isset($_GET[$name])) 194 return $def; 195 196 return preg_replace("/[^0-9a-z\-_,]+/i", "", $_GET[$name]); // Remove anything but 0-9,a-z,-_ 197 } 198 199 function getFileContents($path) { 200 $path = realpath($path); 201 202 if (!$path || !@is_file($path)) 203 return ""; 204 205 if (function_exists("file_get_contents")) 206 return @file_get_contents($path); 207 208 $content = ""; 209 $fp = @fopen($path, "r"); 210 if (!$fp) 211 return ""; 212 213 while (!feof($fp)) 214 $content .= fgets($fp); 215 216 fclose($fp); 217 218 return $content; 219 } 220 221 function putFileContents($path, $content) { 222 if (function_exists("file_put_contents")) 223 return @file_put_contents($path, $content); 224 225 $fp = @fopen($path, "wb"); 226 if ($fp) { 227 fwrite($fp, $content); 228 fclose($fp); 224 ?> 225 226 var tinyMCEPreInit = {suffix : ''}; 227 228 var tinyMCE_GZ = { 229 settings : { 230 themes : '', 231 plugins : '', 232 languages : '', 233 disk_cache : false, 234 page_name : 'tiny_mce_gzip.php', 235 debug : false, 236 suffix : '' 237 }, 238 239 opt : {}, 240 241 init : function(arr, cb) { 242 var t = this, n, s, nl = document.getElementsByTagName('script'); 243 244 t.opt = arr; 245 246 t.settings.themes = arr.theme; 247 t.settings.plugins = arr.plugins; 248 t.settings.languages = arr.language; 249 s = t.settings; 250 t.cb = cb || ''; 251 252 for (i=0; i<nl.length; i++) { 253 n = nl[i]; 254 255 if (n.src && n.src.indexOf('tiny_mce') != -1) 256 t.baseURL = n.src.substring(0, n.src.lastIndexOf('/')); 229 257 } 230 } 231 232 // WP specific 233 function wp_compact_tinymce_js($text) { 234 // This function was custom-made for TinyMCE 2.0, not expected to work with any other JS. 235 236 // Strip comments 237 $text = preg_replace("!(^|\s+)//.*$!m", '', $text); 238 $text = preg_replace("!/\*.*?\*/!s", '', $text); 239 240 // Strip leading tabs, carriage returns and unnecessary line breaks. 241 $text = preg_replace("!^\t+!m", '', $text); 242 $text = str_replace("\r", '', $text); 243 $text = preg_replace("!(^|{|}|;|:|\))\n!m", '\\1', $text); 244 245 return "$text\n"; 246 } 247 ?> 248 249 function TinyMCECompressed() { 250 this.configs = new Array(); 251 this.loadedFiles = new Array(); 252 this.externalPlugins = new Array(); 253 this.loadAdded = false; 254 this.isLoaded = false; 255 } 256 257 TinyMCECompressed.prototype.init = function(settings) { 258 var elements = document.getElementsByTagName('script'); 259 var scriptURL = ""; 260 261 for (var i=0; i<elements.length; i++) { 262 if (elements[i].src && elements[i].src.indexOf("tiny_mce_gzip.php") != -1) { 263 scriptURL = elements[i].src; 264 break; 265 } 266 } 267 268 settings["theme"] = typeof(settings["theme"]) != "undefined" ? settings["theme"] : "default"; 269 settings["plugins"] = typeof(settings["plugins"]) != "undefined" ? settings["plugins"] : ""; 270 settings["language"] = typeof(settings["language"]) != "undefined" ? settings["language"] : "en"; 271 settings["button_tile_map"] = typeof(settings["button_tile_map"]) != "undefined" ? settings["button_tile_map"] : true; 272 this.configs[this.configs.length] = settings; 273 this.settings = settings; 274 275 scriptURL += (scriptURL.indexOf('?') == -1) ? '?' : '&'; 276 scriptURL += "theme=" + escape(this.getOnce(settings["theme"])) + "&language=" + escape(this.getOnce(settings["language"])) + "&plugins=" + escape(this.getOnce(settings["plugins"])) + "&lang=" + settings["language"] + "&index=" + escape(this.configs.length-1); 277 document.write('<sc'+'ript language="javascript" type="text/javascript" src="' + scriptURL + '"></script>'); 278 279 if (!this.loadAdded) { 280 tinyMCE.addEvent(window, "DOMContentLoaded", TinyMCECompressed.prototype.onLoad); 281 tinyMCE.addEvent(window, "load", TinyMCECompressed.prototype.onLoad); 282 this.loadAdded = true; 283 } 284 } 285 286 TinyMCECompressed.prototype.onLoad = function() { 287 if (tinyMCE.isLoaded) 288 return true; 289 290 tinyMCE = realTinyMCE; 291 TinyMCE_Engine.prototype.onLoad(); 292 tinyMCE._addUnloadEvents(); 293 294 tinyMCE.isLoaded = true; 295 } 296 297 TinyMCECompressed.prototype.addEvent = function(o, n, h) { 298 if (o.attachEvent) 299 o.attachEvent("on" + n, h); 300 else 301 o.addEventListener(n, h, false); 302 } 303 304 TinyMCECompressed.prototype.getOnce = function(str) { 305 var ar = str.replace(/\s+/g, '').split(','); 306 307 for (var i=0; i<ar.length; i++) { 308 if (ar[i] == '' || ar[i].charAt(0) == '-') { 309 ar[i] = null; 310 continue; 311 } 312 313 // Skip load 314 for (var x=0; x<this.loadedFiles.length; x++) { 315 if (this.loadedFiles[x] == ar[i]) 316 ar[i] = null; 317 } 318 319 this.loadedFiles[this.loadedFiles.length] = ar[i]; 320 } 321 322 // Glue 323 str = ""; 324 for (var i=0; i<ar.length; i++) { 325 if (ar[i] == null) 326 continue; 327 328 str += ar[i]; 329 330 if (i != ar.length-1) 331 str += ","; 332 } 333 334 return str; 258 tinyMCEPreInit.base = t.baseURL; 259 260 if (!t.coreLoaded) 261 t.loadScripts(1, s.themes, s.plugins, s.languages); 262 }, 263 264 loadScripts : function(co, th, pl, la, cb, sc) { 265 var t = this, x, w = window, q, c = 0, ti, s = t.settings; 266 267 function get(s) { 268 x = 0; 269 270 try { 271 x = new ActiveXObject(s); 272 } catch (s) { 273 } 274 275 return x; 276 }; 277 278 // Build query string 279 q = 'load=true&js=true&diskcache=' + (s.disk_cache ? 'true' : 'false') + '&core=' + (co ? 'true' : 'false') + '&suffix=' + escape(s.suffix) + '&themes=' + escape(th) + '&plugins=' + escape(pl) + '&languages=' + escape(la); 280 281 if (co) 282 t.coreLoaded = 1; 283 284 // Easier to debug with this... 285 // document.write('<sc'+'ript language="javascript" type="text/javascript" src="' + t.baseURL + '/' + s.page_name + '?' + q + '"></script>'); 286 287 // Send request 288 x = w.XMLHttpRequest ? new XMLHttpRequest() : get('Msxml2.XMLHTTP') || get('Microsoft.XMLHTTP'); 289 x.overrideMimeType && x.overrideMimeType('text/javascript'); 290 x.open('GET', t.baseURL + '/' + s.page_name + '?' + q, !!cb); 291 // x.setRequestHeader('Content-Type', 'text/javascript'); 292 x.send(''); 293 294 // Handle asyncronous loading 295 if (cb) { 296 // Wait for response 297 ti = w.setInterval(function() { 298 if (x.readyState == 4 || c++ > 10000) { 299 w.clearInterval(ti); 300 301 if (c < 10000 && x.status == 200) { 302 t.loaded = 1; 303 t.eval(x.responseText); 304 tinymce.dom.Event.domLoaded = true; 305 // cb.call(sc || t, x); 306 } 307 308 ti = x = null; 309 } 310 }, 10); 311 } else 312 t.eval(x.responseText); 313 }, 314 315 start : function() { 316 var t = this, each = tinymce.each, s = t.settings, sl, ln = s.languages.split(','); 317 318 tinymce.suffix = s.suffix; 319 320 // Extend script loader 321 tinymce.create('tinymce.compressor.ScriptLoader:tinymce.dom.ScriptLoader', { 322 loadScripts : function(sc, cb, s) { 323 var ti = this, th = [], pl = [], la = []; 324 325 each(sc, function(o) { 326 var u = o.url; 327 328 if ((!ti.lookup[u] || ti.lookup[u].state != 2) && u.indexOf(t.baseURL) === 0) { 329 // Collect theme 330 if (u.indexOf('editor_template') != -1) { 331 th.push(/\/themes\/([^\/]+)/.exec(u)[1]); 332 load(u, 1); 333 } 334 335 // Collect plugin 336 if (u.indexOf('editor_plugin') != -1) { 337 pl.push(/\/plugins\/([^\/]+)/.exec(u)[1]); 338 load(u, 1); 339 } 340 341 // Collect language 342 if (u.indexOf('/langs/') != -1) { 343 la.push(/\/langs\/([^.]+)/.exec(u)[1]); 344 load(u, 1); 345 } 346 } 347 }); 348 349 if (th.length + pl.length + la.length > 0) { 350 if (sl.settings.strict_mode) { 351 // Async 352 t.loadScripts(0, th.join(','), pl.join(','), la.join(','), cb, s); 353 return; 354 } else 355 t.loadScripts(0, th.join(','), pl.join(','), la.join(','), cb, s); 356 } 357 358 return ti.parent(sc, cb, s); 359 } 360 }); 361 362 sl = tinymce.ScriptLoader = new tinymce.compressor.ScriptLoader(); 363 364 function load(u, sp) { 365 var o; 366 367 if (!sp) 368 u = t.baseURL + u; 369 370 o = {url : u, state : 2}; 371 sl.queue.push(o); 372 sl.lookup[o.url] = o; 373 }; 374 375 // Add core languages 376 each (ln, function(c) { 377 if (c) 378 load('/langs/' + c + '.js'); 379 }); 380 381 // Add themes with languages 382 each(s.themes.split(','), function(n) { 383 if (n) { 384 load('/themes/' + n + '/editor_template' + s.suffix + '.js'); 385 386 each (ln, function(c) { 387 if (c) 388 load('/themes/' + n + '/langs/' + c + '.js'); 389 }); 390 } 391 }); 392 393 // Add plugins with languages 394 each(s.plugins.split(','), function(n) { 395 if (n) { 396 load('/plugins/' + n + '/editor_plugin' + s.suffix + '.js'); 397 398 each (ln, function(c) { 399 if (c) 400 load('/plugins/' + n + '/langs/' + c + '.js'); 401 }); 402 } 403 }); 404 }, 405 406 end : function() { 407 tinyMCE.init(this.opt); 408 }, 409 410 eval : function(co) { 411 var w = window; 412 413 // Evaluate script 414 if (!w.execScript) { 415 try { 416 eval.call(w, co); 417 } catch (ex) { 418 eval(co, w); // Firefox 3.0a8 419 } 420 } else 421 w.execScript(co); // IE 422 } 335 423 }; 336 337 TinyMCECompressed.prototype.loadPlugins = function() {338 var i, ar;339 340 TinyMCE.prototype.loadScript = TinyMCE.prototype.orgLoadScript;341 tinyMCE = realTinyMCE;342 343 ar = tinyMCECompressed.externalPlugins;344 for (i=0; i<ar.length; i++)345 tinyMCE.loadPlugin(ar[i].name, ar[i].url);346 347 TinyMCE.prototype.loadScript = function() {};348 };349 350 TinyMCECompressed.prototype.loadPlugin = function(n, u) {351 this.externalPlugins[this.externalPlugins.length] = {name : n, url : u};352 };353 354 TinyMCECompressed.prototype.importPluginLanguagePack = function(n, v) {355 tinyMCE = realTinyMCE;356 TinyMCE.prototype.loadScript = TinyMCE.prototype.orgLoadScript;357 tinyMCE.importPluginLanguagePack(n, v);358 };359 360 TinyMCECompressed.prototype.addPlugin = function(n, p) {361 tinyMCE = realTinyMCE;362 tinyMCE.addPlugin(n, p);363 };364 365 var tinyMCE = new TinyMCECompressed();366 var tinyMCECompressed = tinyMCE; -
trunk/wp-includes/js/tinymce/tiny_mce_popup.js
r6632 r6694 47 47 }, 48 48 49 execCommand : function(cmd, ui, val ) {49 execCommand : function(cmd, ui, val, a) { 50 50 this.restoreSelection(); 51 return this.editor.execCommand(cmd, ui, val );51 return this.editor.execCommand(cmd, ui, val, a || {skip_focus : 1}); 52 52 }, 53 53 … … 94 94 document.getElementById(element_id).value = c; 95 95 96 if (tinymce.is(document.getElementById(element_id).onchange, 'function'))96 try { 97 97 document.getElementById(element_id).onchange(); 98 } catch (ex) { 99 // Try fire event, ignore errors 100 } 98 101 } 99 102 }); -
trunk/wp-includes/js/tinymce/wp-mce-help.php
r6641 r6694 10 10 <?php wp_admin_css(); ?> 11 11 <style type="text/css"> 12 #wphead { 13 padding-top: 5px; 12 body { 13 background-color: #eaf3ea; 14 } 15 #wphead { 16 padding-top: 2px; 14 17 padding-left: 15px; 15 18 font-size: 80%; 19 border-top: 0; 20 background-color: #eaf3ea; 16 21 } 17 22 #adminmenu { … … 19 24 padding-left: 15px; 20 25 font-size: 80%; 26 background-color: #eaf3ea; 21 27 } 22 28 #user_info { … … 39 45 padding: 5px 20px 10px; 40 46 background-color: #fff; 47 border-left: 1px solid #c6d9e9; 48 border-bottom: 1px solid #c6d9e9; 41 49 } 42 50 * html { … … 114 122 t = d('tab'+i.toString()); 115 123 if ( n == i ) { 116 c.className = ' vizible';124 c.className = ''; 117 125 t.className = 'current'; 118 126 } else { … … 137 145 <div class="zerosize"></div> 138 146 <div id="wphead"><h1><?php echo get_bloginfo('blogtitle'); ?></h1></div> 139 <div id="user_info"><p><strong><?php _e('Rich Editor Help') ?></strong></p></div> 147 140 148 <ul id="adminmenu"> 141 149 <li><a id="tab1" href="javascript:flipTab(1)" title="<?php _e('Basics of Rich Editing') ?>" accesskey="1" class="current"><?php _e('Basics') ?></a></li> … … 190 198 191 199 <div id="buttoncontainer"> 192 <a href="http://www.moxiecode.com" target="_new"><img src=" http://tinymce.moxiecode.com/images/gotmoxie.png" alt="<?php _e('Got Moxie?') ?>" border="0" /></a>193 <a href="http://sourceforge.net/projects/tinymce/" target="_blank"><img src=" http://sourceforge.net/sflogo.php?group_id=103281" alt="<?php _e('Hosted By Sourceforge') ?>" border="0" /></a>194 <a href="http://www.freshmeat.net/projects/tinymce" target="_blank"><img src=" http://tinymce.moxiecode.com/images/fm.gif" alt="<?php _e('Also on freshmeat') ?>" border="0" /></a>200 <a href="http://www.moxiecode.com" target="_new"><img src="themes/advanced/img/gotmoxie.png" alt="<?php _e('Got Moxie?') ?>" border="0" /></a> 201 <a href="http://sourceforge.net/projects/tinymce/" target="_blank"><img src="themes/advanced/img/sflogo.png" alt="<?php _e('Hosted By Sourceforge') ?>" border="0" /></a> 202 <a href="http://www.freshmeat.net/projects/tinymce" target="_blank"><img src="themes/advanced/img/fm.gif" alt="<?php _e('Also on freshmeat') ?>" border="0" /></a> 195 203 </div> 196 204 197 205 </div> 198 206 </div> 207 208 <div class="mceActionPanel"> 209 <div style="margin: 8px auto; text-align: center;padding-bottom: 10px;"> 210 <input type="button" id="cancel" name="cancel" value="<?php _e('Close'); ?>" title="<?php _e('Close'); ?>" onclick="tinyMCEPopup.close();" /> 211 </div> 199 212 </div> 200 213 -
trunk/wp-includes/script-loader.php
r6692 r6694 31 31 32 32 // Modify this version when tinyMCE plugins are changed 33 $this->add( 'tiny_mce', '/wp-includes/js/tinymce/tiny_mce_gzip.php', false, '200801 05' );33 $this->add( 'tiny_mce', '/wp-includes/js/tinymce/tiny_mce_gzip.php', false, '20080129' ); 34 34 35 35 $mce_config = apply_filters('tiny_mce_config_url', '/wp-includes/js/tinymce/tiny_mce_config.php'); 36 $this->add( 'wp_tiny_mce', $mce_config, array('tiny_mce'), '200801 05' );36 $this->add( 'wp_tiny_mce', $mce_config, array('tiny_mce'), '20080129' ); 37 37 38 38 $this->add( 'prototype', '/wp-includes/js/prototype.js', false, '1.6');
Note: See TracChangeset
for help on using the changeset viewer.