2006-03-30 02:50:33 -05:00
/* file:jscripts/tiny_mce/classes/TinyMCE_Engine.class.js */
function TinyMCE _Engine ( ) {
2005-12-04 22:04:25 -05:00
this . majorVersion = "2" ;
2006-03-30 02:50:33 -05:00
this . minorVersion = "0.5.1" ;
this . releaseDate = "2006-03-22" ;
2005-12-04 22:04:25 -05:00
this . instances = new Array ( ) ;
2006-03-30 02:50:33 -05:00
this . switchClassCache = new Array ( ) ;
2005-12-04 22:04:25 -05:00
this . windowArgs = new Array ( ) ;
this . loadedFiles = new Array ( ) ;
this . configs = new Array ( ) ;
this . currentConfig = 0 ;
this . eventHandlers = new Array ( ) ;
// Browser check
var ua = navigator . userAgent ;
this . isMSIE = ( navigator . appName == "Microsoft Internet Explorer" ) ;
this . isMSIE5 = this . isMSIE && ( ua . indexOf ( 'MSIE 5' ) != - 1 ) ;
this . isMSIE5 _0 = this . isMSIE && ( ua . indexOf ( 'MSIE 5.0' ) != - 1 ) ;
this . isGecko = ua . indexOf ( 'Gecko' ) != - 1 ;
this . isSafari = ua . indexOf ( 'Safari' ) != - 1 ;
this . isOpera = ua . indexOf ( 'Opera' ) != - 1 ;
this . isMac = ua . indexOf ( 'Mac' ) != - 1 ;
this . isNS7 = ua . indexOf ( 'Netscape/7' ) != - 1 ;
this . isNS71 = ua . indexOf ( 'Netscape/7.1' ) != - 1 ;
this . dialogCounter = 0 ;
2006-03-30 02:50:33 -05:00
this . plugins = new Array ( ) ;
this . themes = new Array ( ) ;
this . menus = new Array ( ) ;
this . loadedPlugins = new Array ( ) ;
this . buttonMap = new Array ( ) ;
this . isLoaded = false ;
2005-12-04 22:04:25 -05:00
// Fake MSIE on Opera and if Opera fakes IE, Gecko or Safari cancel those
if ( this . isOpera ) {
this . isMSIE = true ;
this . isGecko = false ;
this . isSafari = false ;
}
// TinyMCE editor id instance counter
this . idCounter = 0 ;
} ;
2006-03-30 02:50:33 -05:00
TinyMCE _Engine . prototype = {
init : function ( settings ) {
var theme ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
this . settings = settings ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Check if valid browser has execcommand support
if ( typeof ( document . execCommand ) == 'undefined' )
return ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Get script base path
if ( ! tinyMCE . baseURL ) {
var elements = document . getElementsByTagName ( 'script' ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
for ( var i = 0 ; i < elements . length ; i ++ ) {
if ( elements [ i ] . src && ( elements [ i ] . src . indexOf ( "tiny_mce.js" ) != - 1 || elements [ i ] . src . indexOf ( "tiny_mce_dev.js" ) != - 1 || elements [ i ] . src . indexOf ( "tiny_mce_src.js" ) != - 1 || elements [ i ] . src . indexOf ( "tiny_mce_gzip" ) != - 1 ) ) {
var src = elements [ i ] . src ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
tinyMCE . srcMode = ( src . indexOf ( '_src' ) != - 1 || src . indexOf ( '_dev' ) != - 1 ) ? '_src' : '' ;
tinyMCE . gzipMode = src . indexOf ( '_gzip' ) != - 1 ;
src = src . substring ( 0 , src . lastIndexOf ( '/' ) ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( settings . exec _mode == "src" || settings . exec _mode == "normal" )
tinyMCE . srcMode = settings . exec _mode == "src" ? '_src' : '' ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
tinyMCE . baseURL = src ;
break ;
}
2005-12-04 22:04:25 -05:00
}
}
2006-03-30 02:50:33 -05:00
// Get document base path
this . documentBasePath = document . location . href ;
if ( this . documentBasePath . indexOf ( '?' ) != - 1 )
this . documentBasePath = this . documentBasePath . substring ( 0 , this . documentBasePath . indexOf ( '?' ) ) ;
this . documentURL = this . documentBasePath ;
this . documentBasePath = this . documentBasePath . substring ( 0 , this . documentBasePath . lastIndexOf ( '/' ) ) ;
// If not HTTP absolute
if ( tinyMCE . baseURL . indexOf ( '://' ) == - 1 && tinyMCE . baseURL . charAt ( 0 ) != '/' ) {
// If site absolute
tinyMCE . baseURL = this . documentBasePath + "/" + tinyMCE . baseURL ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Set default values on settings
this . _def ( "mode" , "none" ) ;
this . _def ( "theme" , "advanced" ) ;
this . _def ( "plugins" , "" , true ) ;
this . _def ( "language" , "en" ) ;
this . _def ( "docs_language" , this . settings [ 'language' ] ) ;
this . _def ( "elements" , "" ) ;
this . _def ( "textarea_trigger" , "mce_editable" ) ;
this . _def ( "editor_selector" , "" ) ;
this . _def ( "editor_deselector" , "mceNoEditor" ) ;
this . _def ( "valid_elements" , "+a[id|style|rel|rev|charset|hreflang|dir|lang|tabindex|accesskey|type|name|href|target|title|class|onfocus|onblur|onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup],-strong/-b[class|style],-em/-i[class|style],-strike[class|style],-u[class|style],#p[id|style|dir|class|align],-ol[class|style],-ul[class|style],-li[class|style],br,img[id|dir|lang|longdesc|usemap|style|class|src|onmouseover|onmouseout|border|alt=|title|hspace|vspace|width|height|align],-sub[style|class],-sup[style|class],-blockquote[dir|style],-table[border=0|cellspacing|cellpadding|width|height|class|align|summary|style|dir|id|lang|bgcolor|background|bordercolor],-tr[id|lang|dir|class|rowspan|width|height|align|valign|style|bgcolor|background|bordercolor],tbody[id|class],thead[id|class],tfoot[id|class],-td[id|lang|dir|class|colspan|rowspan|width|height|align|valign|style|bgcolor|background|bordercolor|scope],-th[id|lang|dir|class|colspan|rowspan|width|height|align|valign|style|scope],caption[id|lang|dir|class|style],-div[id|dir|class|align|style],-span[style|class|align],-pre[class|align|style],address[class|align|style],-h1[id|style|dir|class|align],-h2[id|style|dir|class|align],-h3[id|style|dir|class|align],-h4[id|style|dir|class|align],-h5[id|style|dir|class|align],-h6[id|style|dir|class|align],hr[class|style],-font[face|size|style|id|class|dir|color],dd[id|class|title|style|dir|lang],dl[id|class|title|style|dir|lang],dt[id|class|title|style|dir|lang]" ) ;
this . _def ( "extended_valid_elements" , "" ) ;
this . _def ( "invalid_elements" , "" ) ;
this . _def ( "encoding" , "" ) ;
this . _def ( "urlconverter_callback" , tinyMCE . getParam ( "urlconvertor_callback" , "TinyMCE_Engine.prototype.convertURL" ) ) ;
this . _def ( "save_callback" , "" ) ;
this . _def ( "debug" , false ) ;
this . _def ( "force_br_newlines" , false ) ;
this . _def ( "force_p_newlines" , true ) ;
this . _def ( "add_form_submit_trigger" , true ) ;
this . _def ( "relative_urls" , true ) ;
this . _def ( "remove_script_host" , true ) ;
this . _def ( "focus_alert" , true ) ;
this . _def ( "document_base_url" , this . documentURL ) ;
this . _def ( "visual" , true ) ;
this . _def ( "visual_table_class" , "mceVisualAid" ) ;
this . _def ( "setupcontent_callback" , "" ) ;
this . _def ( "fix_content_duplication" , true ) ;
this . _def ( "custom_undo_redo" , true ) ;
this . _def ( "custom_undo_redo_levels" , - 1 ) ;
this . _def ( "custom_undo_redo_keyboard_shortcuts" , true ) ;
this . _def ( "custom_undo_redo_restore_selection" , true ) ;
this . _def ( "verify_html" , true ) ;
this . _def ( "apply_source_formatting" , false ) ;
this . _def ( "directionality" , "ltr" ) ;
this . _def ( "cleanup_on_startup" , false ) ;
this . _def ( "inline_styles" , false ) ;
this . _def ( "convert_newlines_to_brs" , false ) ;
this . _def ( "auto_reset_designmode" , true ) ;
this . _def ( "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,34,quot,38,amp,60,lt,62,gt,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" , true ) ;
this . _def ( "entity_encoding" , "named" ) ;
this . _def ( "cleanup_callback" , "" ) ;
this . _def ( "add_unload_trigger" , true ) ;
this . _def ( "ask" , false ) ;
this . _def ( "nowrap" , false ) ;
this . _def ( "auto_resize" , false ) ;
this . _def ( "auto_focus" , false ) ;
this . _def ( "cleanup" , true ) ;
this . _def ( "remove_linebreaks" , true ) ;
this . _def ( "button_tile_map" , false ) ;
this . _def ( "submit_patch" , true ) ;
this . _def ( "browsers" , "msie,safari,gecko,opera" , true ) ;
this . _def ( "dialog_type" , "window" ) ;
this . _def ( "accessibility_warnings" , true ) ;
this . _def ( "accessibility_focus" , true ) ;
this . _def ( "merge_styles_invalid_parents" , "" ) ;
this . _def ( "force_hex_style_colors" , true ) ;
this . _def ( "trim_span_elements" , true ) ;
this . _def ( "convert_fonts_to_spans" , false ) ;
this . _def ( "doctype" , '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">' ) ;
this . _def ( "font_size_classes" , '' ) ;
this . _def ( "font_size_style_values" , 'xx-small,x-small,small,medium,large,x-large,xx-large' , true ) ;
this . _def ( "event_elements" , 'a,img' , true ) ;
this . _def ( "convert_urls" , true ) ;
this . _def ( "table_inline_editing" , false ) ;
this . _def ( "object_resizing" , true ) ;
this . _def ( "custom_shortcuts" , true ) ;
this . _def ( "convert_on_click" , false ) ;
this . _def ( "content_css" , '' ) ;
this . _def ( "fix_list_elements" , false ) ;
this . _def ( "fix_table_elements" , false ) ;
// Browser check IE
if ( this . isMSIE && this . settings [ 'browsers' ] . indexOf ( 'msie' ) == - 1 )
return ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Browser check Gecko
if ( this . isGecko && this . settings [ 'browsers' ] . indexOf ( 'gecko' ) == - 1 )
return ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Browser check Safari
if ( this . isSafari && this . settings [ 'browsers' ] . indexOf ( 'safari' ) == - 1 )
return ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Browser check Opera
if ( this . isOpera && this . settings [ 'browsers' ] . indexOf ( 'opera' ) == - 1 )
return ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// If not super absolute make it so
var baseHREF = tinyMCE . settings [ 'document_base_url' ] ;
var h = document . location . href ;
var p = h . indexOf ( '://' ) ;
if ( p > 0 && document . location . protocol != "file:" ) {
p = h . indexOf ( '/' , p + 3 ) ;
h = h . substring ( 0 , p ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( baseHREF . indexOf ( '://' ) == - 1 )
baseHREF = h + baseHREF ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
tinyMCE . settings [ 'document_base_url' ] = baseHREF ;
tinyMCE . settings [ 'document_base_prefix' ] = h ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Trim away query part
if ( baseHREF . indexOf ( '?' ) != - 1 )
baseHREF = baseHREF . substring ( 0 , baseHREF . indexOf ( '?' ) ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
this . settings [ 'base_href' ] = baseHREF . substring ( 0 , baseHREF . lastIndexOf ( '/' ) ) + "/" ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
theme = this . settings [ 'theme' ] ;
this . blockRegExp = new RegExp ( "^(h[1-6]|p|div|address|pre|form|table|li|ol|ul|td|blockquote|center|dl|dir|fieldset|form|noscript|noframes|menu|isindex)$" , "i" ) ;
this . posKeyCodes = new Array ( 13 , 45 , 36 , 35 , 33 , 34 , 37 , 38 , 39 , 40 ) ;
this . uniqueURL = 'http://tinymce.moxiecode.cp/mce_temp_url' ; // Make unique URL non real URL
this . uniqueTag = '<div id="mceTMPElement" style="display: none">TMP</div>' ;
this . callbacks = new Array ( 'onInit' , 'getInfo' , 'getEditorTemplate' , 'setupContent' , 'onChange' , 'onPageLoad' , 'handleNodeChange' , 'initInstance' , 'execCommand' , 'getControlHTML' , 'handleEvent' , 'cleanup' ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Theme url
this . settings [ 'theme_href' ] = tinyMCE . baseURL + "/themes/" + theme ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( ! tinyMCE . isMSIE )
this . settings [ 'force_br_newlines' ] = false ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . getParam ( "popups_css" , false ) ) {
var cssPath = tinyMCE . getParam ( "popups_css" , "" ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Is relative
if ( cssPath . indexOf ( '://' ) == - 1 && cssPath . charAt ( 0 ) != '/' )
this . settings [ 'popups_css' ] = this . documentBasePath + "/" + cssPath ;
else
this . settings [ 'popups_css' ] = cssPath ;
} else
this . settings [ 'popups_css' ] = tinyMCE . baseURL + "/themes/" + theme + "/css/editor_popup.css" ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . getParam ( "editor_css" , false ) ) {
var cssPath = tinyMCE . getParam ( "editor_css" , "" ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Is relative
if ( cssPath . indexOf ( '://' ) == - 1 && cssPath . charAt ( 0 ) != '/' )
this . settings [ 'editor_css' ] = this . documentBasePath + "/" + cssPath ;
else
this . settings [ 'editor_css' ] = cssPath ;
} else
this . settings [ 'editor_css' ] = tinyMCE . baseURL + "/themes/" + theme + "/css/editor_ui.css" ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . settings [ 'debug' ] ) {
var msg = "Debug: \n" ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
msg += "baseURL: " + this . baseURL + "\n" ;
msg += "documentBasePath: " + this . documentBasePath + "\n" ;
msg += "content_css: " + this . settings [ 'content_css' ] + "\n" ;
msg += "popups_css: " + this . settings [ 'popups_css' ] + "\n" ;
msg += "editor_css: " + this . settings [ 'editor_css' ] + "\n" ;
alert ( msg ) ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Only do this once
if ( this . configs . length == 0 ) {
// Is Safari enabled
if ( this . isSafari && this . getParam ( 'safari_warning' , false ) )
alert ( "Safari support is very limited and should be considered experimental.\nSo there is no need to even submit bugreports on this early version.\nYou can disable this message by setting: safari_warning option to false" ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( typeof ( TinyMCECompressed ) == "undefined" ) {
tinyMCE . addEvent ( window , "DOMContentLoaded" , TinyMCE _Engine . prototype . onLoad ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . isMSIE && ! tinyMCE . isOpera ) {
if ( document . body )
tinyMCE . addEvent ( document . body , "readystatechange" , TinyMCE _Engine . prototype . onLoad ) ;
else
tinyMCE . addEvent ( document , "readystatechange" , TinyMCE _Engine . prototype . onLoad ) ;
}
tinyMCE . addEvent ( window , "load" , TinyMCE _Engine . prototype . onLoad ) ;
tinyMCE . _addUnloadEvents ( ) ;
}
}
this . loadScript ( tinyMCE . baseURL + '/themes/' + this . settings [ 'theme' ] + '/editor_template' + tinyMCE . srcMode + '.js' ) ;
this . loadScript ( tinyMCE . baseURL + '/langs/' + this . settings [ 'language' ] + '.js' ) ;
this . loadCSS ( this . settings [ 'editor_css' ] ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Add plugins
var p = tinyMCE . getParam ( 'plugins' , '' , true , ',' ) ;
if ( p . length > 0 ) {
for ( var i = 0 ; i < p . length ; i ++ ) {
if ( p [ i ] . charAt ( 0 ) != '-' )
this . loadScript ( tinyMCE . baseURL + '/plugins/' + p [ i ] + '/editor_plugin' + tinyMCE . srcMode + '.js' ) ;
}
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Setup entities
settings [ 'cleanup_entities' ] = new Array ( ) ;
var entities = tinyMCE . getParam ( 'entities' , '' , true , ',' ) ;
for ( var i = 0 ; i < entities . length ; i += 2 )
settings [ 'cleanup_entities' ] [ 'c' + entities [ i ] ] = entities [ i + 1 ] ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Save away this config
settings [ 'index' ] = this . configs . length ;
this . configs [ this . configs . length ] = settings ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
_addUnloadEvents : function ( ) {
2005-12-04 22:04:25 -05:00
if ( tinyMCE . isMSIE ) {
if ( tinyMCE . settings [ 'add_unload_trigger' ] ) {
2006-03-30 02:50:33 -05:00
tinyMCE . addEvent ( window , "unload" , TinyMCE _Engine . prototype . unloadHandler ) ;
tinyMCE . addEvent ( window . document , "beforeunload" , TinyMCE _Engine . prototype . unloadHandler ) ;
2005-12-04 22:04:25 -05:00
}
} else {
if ( tinyMCE . settings [ 'add_unload_trigger' ] )
tinyMCE . addEvent ( window , "unload" , function ( ) { tinyMCE . triggerSave ( true , true ) ; } ) ;
}
2006-03-30 02:50:33 -05:00
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
_def : function ( key , def _val , t ) {
var v = tinyMCE . getParam ( key , def _val ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
v = t ? v . replace ( /\s+/g , "" ) : v ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
this . settings [ key ] = v ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
hasPlugin : function ( n ) {
return typeof ( this . plugins [ n ] ) != "undefined" && this . plugins [ n ] != null ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
addPlugin : function ( n , p ) {
var op = this . plugins [ n ] ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Use the previous plugin object base URL used when loading external plugins
p . baseURL = op ? op . baseURL : tinyMCE . baseURL + "/plugins/" + n ;
this . plugins [ n ] = p ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
setPluginBaseURL : function ( n , u ) {
var op = this . plugins [ n ] ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( op )
op . baseURL = u ;
else
this . plugins [ n ] = { baseURL : u } ;
} ,
loadPlugin : function ( n , u ) {
u = u . indexOf ( '.js' ) != - 1 ? u . substring ( 0 , u . lastIndexOf ( '/' ) ) : u ;
u = u . charAt ( u . length - 1 ) == '/' ? u . substring ( 0 , u . length - 1 ) : u ;
this . plugins [ n ] = { baseURL : u } ;
this . loadScript ( u + "/editor_plugin" + ( tinyMCE . srcMode ? '_src' : '' ) + ".js" ) ;
} ,
hasTheme : function ( n ) {
return typeof ( this . themes [ n ] ) != "undefined" && this . themes [ n ] != null ;
} ,
addTheme : function ( n , t ) {
this . themes [ n ] = t ;
} ,
addMenu : function ( n , m ) {
this . menus [ n ] = m ;
} ,
hasMenu : function ( n ) {
return typeof ( this . plugins [ n ] ) != "undefined" && this . plugins [ n ] != null ;
} ,
loadScript : function ( url ) {
for ( var i = 0 ; i < this . loadedFiles . length ; i ++ ) {
if ( this . loadedFiles [ i ] == url )
return ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
document . write ( '<sc' + 'ript language="javascript" type="text/javascript" src="' + url + '"></script>' ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
this . loadedFiles [ this . loadedFiles . length ] = url ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
loadCSS : function ( url ) {
var ar = url . replace ( /\s+/ , '' ) . split ( ',' ) ;
var lflen = 0 , csslen = 0 ;
var skip = false ;
var x = 0 , i = 0 ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
for ( x = 0 , csslen = ar . length ; x < csslen ; x ++ ) {
ignore _css = false ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( ar [ x ] != null && ar [ x ] != 'null' && ar [ x ] . length > 0 ) {
/* Make sure it doesn't exist. */
for ( i = 0 , lflen = this . loadedFiles . length ; i < lflen ; i ++ ) {
if ( this . loadedFiles [ i ] == ar [ x ] ) {
skip = true ;
break ;
}
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( ! skip ) {
document . write ( '<link href="' + ar [ x ] + '" rel="stylesheet" type="text/css" />' ) ;
this . loadedFiles [ this . loadedFiles . length ] = ar [ x ] ;
}
}
}
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
importCSS : function ( doc , css ) {
var css _ary = css . replace ( /\s+/ , '' ) . split ( ',' ) ;
var csslen , elm , headArr , x , css _file ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
for ( x = 0 , csslen = css _ary . length ; x < csslen ; x ++ ) {
css _file = css _ary [ x ] ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( css _file != null && css _file != 'null' && css _file . length > 0 ) {
// Is relative, make absolute
if ( css _file . indexOf ( '://' ) == - 1 && css _file . charAt ( 0 ) != '/' )
css _file = this . documentBasePath + "/" + css _file ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( typeof ( doc . createStyleSheet ) == "undefined" ) {
elm = doc . createElement ( "link" ) ;
2006-02-12 02:53:23 -05:00
2006-03-30 02:50:33 -05:00
elm . rel = "stylesheet" ;
elm . href = css _file ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( ( headArr = doc . getElementsByTagName ( "head" ) ) != null && headArr . length > 0 )
headArr [ 0 ] . appendChild ( elm ) ;
} else
doc . createStyleSheet ( css _file ) ;
}
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
confirmAdd : function ( e , settings ) {
var elm = tinyMCE . isMSIE ? event . srcElement : e . target ;
var elementId = elm . name ? elm . name : elm . id ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
tinyMCE . settings = settings ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . settings [ 'convert_on_click' ] || ( ! elm . getAttribute ( 'mce_noask' ) && confirm ( tinyMCELang [ 'lang_edit_confirm' ] ) ) )
tinyMCE . addMCEControl ( elm , elementId ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
elm . setAttribute ( 'mce_noask' , 'true' ) ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
updateContent : function ( form _element _name ) {
// Find MCE instance linked to given form element and copy it's value
var formElement = document . getElementById ( form _element _name ) ;
for ( var n in tinyMCE . instances ) {
var inst = tinyMCE . instances [ n ] ;
if ( ! tinyMCE . isInstance ( inst ) )
continue ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
inst . switchSettings ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( inst . formElement == formElement ) {
var doc = inst . getDoc ( ) ;
tinyMCE . _setHTML ( doc , inst . formElement . value ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( ! tinyMCE . isMSIE )
doc . body . innerHTML = tinyMCE . _cleanupHTML ( inst , doc , this . settings , doc . body , inst . visualAid ) ;
}
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
addMCEControl : function ( replace _element , form _element _name , target _document ) {
var id = "mce_editor_" + tinyMCE . idCounter ++ ;
var inst = new TinyMCE _Control ( tinyMCE . settings ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
inst . editorId = id ;
this . instances [ id ] = inst ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
inst . _onAdd ( replace _element , form _element _name , target _document ) ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
removeMCEControl : function ( editor _id ) {
var inst = tinyMCE . getInstanceById ( editor _id ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( inst ) {
inst . switchSettings ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
editor _id = inst . editorId ;
var html = tinyMCE . getContent ( editor _id ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Remove editor instance from instances array
var tmpInstances = new Array ( ) ;
for ( var instanceName in tinyMCE . instances ) {
var instance = tinyMCE . instances [ instanceName ] ;
if ( ! tinyMCE . isInstance ( instance ) )
continue ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( instanceName != editor _id )
tmpInstances [ instanceName ] = instance ;
}
tinyMCE . instances = tmpInstances ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
tinyMCE . selectedElement = null ;
tinyMCE . selectedInstance = null ;
// Remove element
var replaceElement = document . getElementById ( editor _id + "_parent" ) ;
var oldTargetElement = inst . oldTargetElement ;
var targetName = oldTargetElement . nodeName . toLowerCase ( ) ;
if ( targetName == "textarea" || targetName == "input" ) {
// Just show the old text area
replaceElement . parentNode . removeChild ( replaceElement ) ;
oldTargetElement . style . display = "inline" ;
oldTargetElement . value = html ;
} else {
oldTargetElement . innerHTML = html ;
oldTargetElement . style . display = 'block' ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
replaceElement . parentNode . insertBefore ( oldTargetElement , replaceElement ) ;
replaceElement . parentNode . removeChild ( replaceElement ) ;
2005-12-04 22:04:25 -05:00
}
}
2006-03-30 02:50:33 -05:00
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
triggerSave : function ( skip _cleanup , skip _callback ) {
var inst , n ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Default to false
if ( typeof ( skip _cleanup ) == "undefined" )
skip _cleanup = false ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Default to false
if ( typeof ( skip _callback ) == "undefined" )
skip _callback = false ;
// Cleanup and set all form fields
for ( n in tinyMCE . instances ) {
inst = tinyMCE . instances [ n ] ;
if ( ! tinyMCE . isInstance ( inst ) )
continue ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
inst . triggerSave ( skip _cleanup , skip _callback ) ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
resetForm : function ( form _index ) {
var i , inst , n , formObj = document . forms [ form _index ] ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
for ( n in tinyMCE . instances ) {
inst = tinyMCE . instances [ n ] ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( ! tinyMCE . isInstance ( inst ) )
continue ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
inst . switchSettings ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
for ( i = 0 ; i < formObj . elements . length ; i ++ ) {
if ( inst . formTargetElementId == formObj . elements [ i ] . name )
inst . getBody ( ) . innerHTML = inst . startContent ;
}
}
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
execInstanceCommand : function ( editor _id , command , user _interface , value , focus ) {
var inst = tinyMCE . getInstanceById ( editor _id ) ;
if ( inst ) {
if ( typeof ( focus ) == "undefined" )
focus = true ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( focus )
inst . contentWindow . focus ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Reset design mode if lost
inst . autoResetDesignMode ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
this . selectedElement = inst . getFocusElement ( ) ;
this . selectedInstance = inst ;
tinyMCE . execCommand ( command , user _interface , value ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Cancel event so it doesn't call onbeforeonunlaod
if ( tinyMCE . isMSIE && window . event != null )
tinyMCE . cancelEvent ( window . event ) ;
}
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
execCommand : function ( command , user _interface , value ) {
// Default input
user _interface = user _interface ? user _interface : false ;
value = value ? value : null ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . selectedInstance )
tinyMCE . selectedInstance . switchSettings ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
switch ( command ) {
case 'mceHelp' :
tinyMCE . openWindow ( {
file : 'about.htm' ,
width : 480 ,
height : 380
} , {
tinymce _version : tinyMCE . majorVersion + "." + tinyMCE . minorVersion ,
tinymce _releasedate : tinyMCE . releaseDate ,
inline : "yes"
} ) ;
2005-12-04 22:04:25 -05:00
return ;
2006-03-30 02:50:33 -05:00
case 'mceFocus' :
var inst = tinyMCE . getInstanceById ( value ) ;
if ( inst )
inst . contentWindow . focus ( ) ;
2005-12-04 22:04:25 -05:00
return ;
2006-03-30 02:50:33 -05:00
case "mceAddControl" :
case "mceAddEditor" :
tinyMCE . addMCEControl ( tinyMCE . _getElementById ( value ) , value ) ;
return ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
case "mceAddFrameControl" :
tinyMCE . addMCEControl ( tinyMCE . _getElementById ( value [ 'element' ] , value [ 'document' ] ) , value [ 'element' ] , value [ 'document' ] ) ;
return ;
case "mceRemoveControl" :
case "mceRemoveEditor" :
tinyMCE . removeMCEControl ( value ) ;
return ;
case "mceResetDesignMode" :
// Resets the designmode state of the editors in Gecko
if ( ! tinyMCE . isMSIE ) {
for ( var n in tinyMCE . instances ) {
if ( ! tinyMCE . isInstance ( tinyMCE . instances [ n ] ) )
continue ;
try {
tinyMCE . instances [ n ] . getDoc ( ) . designMode = "on" ;
} catch ( e ) {
// Ignore any errors
}
2005-12-04 22:04:25 -05:00
}
}
2006-03-30 02:50:33 -05:00
return ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( this . selectedInstance ) {
this . selectedInstance . execCommand ( command , user _interface , value ) ;
} else if ( tinyMCE . settings [ 'focus_alert' ] )
alert ( tinyMCELang [ 'lang_focus_alert' ] ) ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
_createIFrame : function ( replace _element , doc , win ) {
var iframe , id = replace _element . getAttribute ( "id" ) ;
var aw , ah ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( typeof ( doc ) == "undefined" )
doc = document ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( typeof ( win ) == "undefined" )
win = window ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
iframe = doc . createElement ( "iframe" ) ;
aw = "" + tinyMCE . settings [ 'area_width' ] ;
ah = "" + tinyMCE . settings [ 'area_height' ] ;
if ( aw . indexOf ( '%' ) == - 1 ) {
aw = parseInt ( aw ) ;
aw = aw < 0 ? 300 : aw ;
aw = aw + "px" ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
if ( ah . indexOf ( '%' ) == - 1 ) {
ah = parseInt ( ah ) ;
ah = ah < 0 ? 240 : ah ;
ah = ah + "px" ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
iframe . setAttribute ( "id" , id ) ;
iframe . setAttribute ( "className" , "mceEditorIframe" ) ;
iframe . setAttribute ( "border" , "0" ) ;
iframe . setAttribute ( "frameBorder" , "0" ) ;
iframe . setAttribute ( "marginWidth" , "0" ) ;
iframe . setAttribute ( "marginHeight" , "0" ) ;
iframe . setAttribute ( "leftMargin" , "0" ) ;
iframe . setAttribute ( "topMargin" , "0" ) ;
iframe . setAttribute ( "width" , aw ) ;
iframe . setAttribute ( "height" , ah ) ;
iframe . setAttribute ( "allowtransparency" , "true" ) ;
if ( tinyMCE . settings [ "auto_resize" ] )
iframe . setAttribute ( "scrolling" , "no" ) ;
// Must have a src element in MSIE HTTPs breaks aswell as absoute URLs
if ( tinyMCE . isMSIE && ! tinyMCE . isOpera )
iframe . setAttribute ( "src" , this . settings [ 'default_document' ] ) ;
iframe . style . width = aw ;
iframe . style . height = ah ;
// MSIE 5.0 issue
if ( tinyMCE . isMSIE && ! tinyMCE . isOpera )
replace _element . outerHTML = iframe . outerHTML ;
else
replace _element . parentNode . replaceChild ( iframe , replace _element ) ;
if ( tinyMCE . isMSIE && ! tinyMCE . isOpera )
return win . frames [ id ] ;
else
return iframe ;
} ,
setupContent : function ( editor _id ) {
2005-12-04 22:04:25 -05:00
var inst = tinyMCE . instances [ editor _id ] ;
var doc = inst . getDoc ( ) ;
2006-03-30 02:50:33 -05:00
var head = doc . getElementsByTagName ( 'head' ) . item ( 0 ) ;
var content = inst . startContent ;
2005-12-04 22:04:25 -05:00
inst . switchSettings ( ) ;
2006-03-30 02:50:33 -05:00
// Not loaded correctly hit it again, Mozilla bug #997860
if ( ! tinyMCE . isMSIE && tinyMCE . getParam ( "setupcontent_reload" , false ) && doc . title != "blank_page" ) {
// This part will remove the designMode status
// Failes first time in Firefox 1.5b2 on Mac
try { doc . location . href = tinyMCE . baseURL + "/blank.htm" ; } catch ( ex ) { }
window . setTimeout ( "tinyMCE.setupContent('" + editor _id + "');" , 1000 ) ;
return ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( ! head ) {
window . setTimeout ( "tinyMCE.setupContent('" + editor _id + "');" , 10 ) ;
return ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Import theme specific content CSS the user specific
tinyMCE . importCSS ( inst . getDoc ( ) , tinyMCE . baseURL + "/themes/" + inst . settings [ 'theme' ] + "/css/editor_content.css" ) ;
tinyMCE . importCSS ( inst . getDoc ( ) , inst . settings [ 'content_css' ] ) ;
tinyMCE . dispatchCallback ( inst , 'init_instance_callback' , 'initInstance' , inst ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Setup keyboard shortcuts
if ( tinyMCE . getParam ( 'custom_undo_redo_keyboard_shortcuts' ) ) {
inst . addShortcut ( 'ctrl' , 'z' , 'lang_undo_desc' , 'Undo' ) ;
inst . addShortcut ( 'ctrl' , 'y' , 'lang_redo_desc' , 'Redo' ) ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Add default shortcuts for gecko
if ( tinyMCE . isGecko ) {
inst . addShortcut ( 'ctrl' , 'b' , 'lang_bold_desc' , 'Bold' ) ;
inst . addShortcut ( 'ctrl' , 'i' , 'lang_italic_desc' , 'Italic' ) ;
inst . addShortcut ( 'ctrl' , 'u' , 'lang_underline_desc' , 'Underline' ) ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Setup span styles
if ( tinyMCE . getParam ( "convert_fonts_to_spans" ) )
inst . getDoc ( ) . body . setAttribute ( 'id' , 'mceSpanFonts' ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . settings [ 'nowrap' ] )
doc . body . style . whiteSpace = "nowrap" ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
doc . body . dir = this . settings [ 'directionality' ] ;
doc . editorId = editor _id ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Add on document element in Mozilla
if ( ! tinyMCE . isMSIE )
doc . documentElement . editorId = editor _id ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
inst . setBaseHREF ( tinyMCE . settings [ 'base_href' ] ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Replace new line characters to BRs
if ( tinyMCE . settings [ 'convert_newlines_to_brs' ] ) {
content = tinyMCE . regexpReplace ( content , "\r\n" , "<br />" , "gi" ) ;
content = tinyMCE . regexpReplace ( content , "\r" , "<br />" , "gi" ) ;
content = tinyMCE . regexpReplace ( content , "\n" , "<br />" , "gi" ) ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Open closed anchors
// content = content.replace(new RegExp('<a(.*?)/>', 'gi'), '<a$1></a>');
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Call custom cleanup code
content = tinyMCE . storeAwayURLs ( content ) ;
content = tinyMCE . _customCleanup ( inst , "insert_to_editor" , content ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . isMSIE ) {
// Ugly!!!
window . setInterval ( 'try{tinyMCE.getCSSClasses(tinyMCE.instances["' + editor _id + '"].getDoc(), "' + editor _id + '");}catch(e){}' , 500 ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . settings [ "force_br_newlines" ] )
doc . styleSheets [ 0 ] . addRule ( "p" , "margin: 0;" ) ;
var body = inst . getBody ( ) ;
body . editorId = editor _id ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
content = tinyMCE . cleanupHTMLCode ( content ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Fix for bug #958637
if ( ! tinyMCE . isMSIE ) {
var contentElement = inst . getDoc ( ) . createElement ( "body" ) ;
var doc = inst . getDoc ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
contentElement . innerHTML = content ;
// Remove weridness!
if ( tinyMCE . isGecko && tinyMCE . settings [ 'remove_lt_gt' ] )
content = content . replace ( new RegExp ( '<>' , 'g' ) , "" ) ;
if ( tinyMCE . settings [ 'cleanup_on_startup' ] )
tinyMCE . setInnerHTML ( inst . getBody ( ) , tinyMCE . _cleanupHTML ( inst , doc , this . settings , contentElement ) ) ;
else {
// Convert all strong/em to b/i
content = tinyMCE . regexpReplace ( content , "<strong" , "<b" , "gi" ) ;
content = tinyMCE . regexpReplace ( content , "<em(/?)>" , "<i$1>" , "gi" ) ;
content = tinyMCE . regexpReplace ( content , "<em " , "<i " , "gi" ) ;
content = tinyMCE . regexpReplace ( content , "</strong>" , "</b>" , "gi" ) ;
content = tinyMCE . regexpReplace ( content , "</em>" , "</i>" , "gi" ) ;
tinyMCE . setInnerHTML ( inst . getBody ( ) , content ) ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
tinyMCE . convertAllRelativeURLs ( inst . getBody ( ) ) ;
} else {
if ( tinyMCE . settings [ 'cleanup_on_startup' ] ) {
tinyMCE . _setHTML ( inst . getDoc ( ) , content ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Produces permission denied error in MSIE 5.5
eval ( 'try {tinyMCE.setInnerHTML(inst.getBody(), tinyMCE._cleanupHTML(inst, inst.contentDocument, this.settings, inst.getBody()));} catch(e) {}' ) ;
} else
tinyMCE . _setHTML ( inst . getDoc ( ) , content ) ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Fix for bug #957681
//inst.getDoc().designMode = inst.getDoc().designMode;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Setup element references
var parentElm = inst . targetDoc . getElementById ( inst . editorId + '_parent' ) ;
inst . formElement = tinyMCE . isGecko ? parentElm . previousSibling : parentElm . nextSibling ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
tinyMCE . handleVisualAid ( inst . getBody ( ) , true , tinyMCE . settings [ 'visual' ] , inst ) ;
tinyMCE . dispatchCallback ( inst , 'setupcontent_callback' , 'setupContent' , editor _id , inst . getBody ( ) , inst . getDoc ( ) ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Re-add design mode on mozilla
if ( ! tinyMCE . isMSIE )
tinyMCE . addEventHandlers ( inst ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Add blur handler
if ( tinyMCE . isMSIE ) {
tinyMCE . addEvent ( inst . getBody ( ) , "blur" , TinyMCE _Engine . prototype . _eventPatch ) ;
tinyMCE . addEvent ( inst . getBody ( ) , "beforedeactivate" , TinyMCE _Engine . prototype . _eventPatch ) ; // Bug #1439953
// Workaround for drag drop/copy paste base href bug
if ( ! tinyMCE . isOpera ) {
tinyMCE . addEvent ( doc . body , "mousemove" , TinyMCE _Engine . prototype . onMouseMove ) ;
tinyMCE . addEvent ( doc . body , "beforepaste" , TinyMCE _Engine . prototype . _eventPatch ) ;
tinyMCE . addEvent ( doc . body , "drop" , TinyMCE _Engine . prototype . _eventPatch ) ;
}
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Trigger node change, this call locks buttons for tables and so forth
tinyMCE . selectedInstance = inst ;
tinyMCE . selectedElement = inst . contentWindow . document . body ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Call custom DOM cleanup
tinyMCE . _customCleanup ( inst , "insert_to_editor_dom" , inst . getBody ( ) ) ;
tinyMCE . _customCleanup ( inst , "setup_content_dom" , inst . getBody ( ) ) ;
tinyMCE . _setEventsEnabled ( inst . getBody ( ) , false ) ;
tinyMCE . cleanupAnchors ( inst . getDoc ( ) ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . getParam ( "convert_fonts_to_spans" ) )
tinyMCE . convertSpansToFonts ( inst . getDoc ( ) ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
inst . startContent = tinyMCE . trim ( inst . getBody ( ) . innerHTML ) ;
inst . undoRedo . add ( { content : inst . startContent } ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
tinyMCE . selectedInstance = inst ;
tinyMCE . triggerNodeChange ( false , true ) ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
storeAwayURLs : function ( s ) {
// Remove all mce_src, mce_href and replace them with new ones
// s = s.replace(new RegExp('mce_src\\s*=\\s*\"[^ >\"]*\"', 'gi'), '');
// s = s.replace(new RegExp('mce_href\\s*=\\s*\"[^ >\"]*\"', 'gi'), '');
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( ! s . match ( /(mce_src|mce_href)/gi , s ) ) {
s = s . replace ( new RegExp ( 'src\\s*=\\s*\"([^ >\"]*)\"' , 'gi' ) , 'src="$1" mce_src="$1"' ) ;
s = s . replace ( new RegExp ( 'href\\s*=\\s*\"([^ >\"]*)\"' , 'gi' ) , 'href="$1" mce_href="$1"' ) ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
return s ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
removeTinyMCEFormElements : function ( form _obj ) {
// Check if form is valid
if ( typeof ( form _obj ) == "undefined" || form _obj == null )
return ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// If not a form, find the form
if ( form _obj . nodeName != "FORM" ) {
if ( form _obj . form )
form _obj = form _obj . form ;
else
form _obj = tinyMCE . getParentElement ( form _obj , "form" ) ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Still nothing
if ( form _obj == null )
return ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Disable all UI form elements that TinyMCE created
for ( var i = 0 ; i < form _obj . elements . length ; i ++ ) {
var elementId = form _obj . elements [ i ] . name ? form _obj . elements [ i ] . name : form _obj . elements [ i ] . id ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( elementId . indexOf ( 'mce_editor_' ) == 0 )
form _obj . elements [ i ] . disabled = true ;
}
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
handleEvent : function ( e ) {
var inst = tinyMCE . selectedInstance ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Remove odd, error
if ( typeof ( tinyMCE ) == "undefined" )
return true ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
//tinyMCE.debug(e.type + " " + e.target.nodeName + " " + (e.relatedTarget ? e.relatedTarget.nodeName : ""));
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . executeCallback ( tinyMCE . selectedInstance , 'handle_event_callback' , 'handleEvent' , e ) )
return false ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
switch ( e . type ) {
case "beforedeactivate" : // Was added due to bug #1439953
case "blur" :
if ( tinyMCE . selectedInstance )
tinyMCE . selectedInstance . execCommand ( 'mceEndTyping' ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
tinyMCE . hideMenus ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Workaround for drag drop/copy paste base href bug
case "drop" :
case "beforepaste" :
if ( tinyMCE . selectedInstance )
tinyMCE . selectedInstance . setBaseHREF ( null ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
window . setTimeout ( "tinyMCE.selectedInstance.setBaseHREF(tinyMCE.settings['base_href']);" , 1 ) ;
return ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
case "submit" :
tinyMCE . removeTinyMCEFormElements ( tinyMCE . isMSIE ? window . event . srcElement : e . target ) ;
tinyMCE . triggerSave ( ) ;
tinyMCE . isNotDirty = true ;
return ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
case "reset" :
var formObj = tinyMCE . isMSIE ? window . event . srcElement : e . target ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
for ( var i = 0 ; i < document . forms . length ; i ++ ) {
if ( document . forms [ i ] == formObj )
window . setTimeout ( 'tinyMCE.resetForm(' + i + ');' , 10 ) ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
case "keypress" :
if ( inst && inst . handleShortcut ( e ) )
return false ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( e . target . editorId ) {
tinyMCE . selectedInstance = tinyMCE . instances [ e . target . editorId ] ;
} else {
if ( e . target . ownerDocument . editorId )
tinyMCE . selectedInstance = tinyMCE . instances [ e . target . ownerDocument . editorId ] ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . selectedInstance )
tinyMCE . selectedInstance . switchSettings ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Insert P element
if ( tinyMCE . isGecko && tinyMCE . settings [ 'force_p_newlines' ] && e . keyCode == 13 && ! e . shiftKey ) {
// Insert P element instead of BR
if ( TinyMCE _ForceParagraphs . _insertPara ( tinyMCE . selectedInstance , e ) ) {
// Cancel event
tinyMCE . execCommand ( "mceAddUndoLevel" ) ;
tinyMCE . cancelEvent ( e ) ;
return false ;
}
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Handle backspace
if ( tinyMCE . isGecko && tinyMCE . settings [ 'force_p_newlines' ] && ( e . keyCode == 8 || e . keyCode == 46 ) && ! e . shiftKey ) {
// Insert P element instead of BR
if ( TinyMCE _ForceParagraphs . _handleBackSpace ( tinyMCE . selectedInstance , e . type ) ) {
// Cancel event
tinyMCE . execCommand ( "mceAddUndoLevel" ) ;
tinyMCE . cancelEvent ( e ) ;
return false ;
}
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Return key pressed
if ( tinyMCE . isMSIE && tinyMCE . settings [ 'force_br_newlines' ] && e . keyCode == 13 ) {
if ( e . target . editorId )
tinyMCE . selectedInstance = tinyMCE . instances [ e . target . editorId ] ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . selectedInstance ) {
var sel = tinyMCE . selectedInstance . getDoc ( ) . selection ;
var rng = sel . createRange ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . getParentElement ( rng . parentElement ( ) , "li" ) != null )
return false ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Cancel event
e . returnValue = false ;
e . cancelBubble = true ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Insert BR element
rng . pasteHTML ( "<br />" ) ;
rng . collapse ( false ) ;
rng . select ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
tinyMCE . execCommand ( "mceAddUndoLevel" ) ;
tinyMCE . triggerNodeChange ( false ) ;
return false ;
}
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Backspace or delete
if ( e . keyCode == 8 || e . keyCode == 46 ) {
tinyMCE . selectedElement = e . target ;
tinyMCE . linkElement = tinyMCE . getParentElement ( e . target , "a" ) ;
tinyMCE . imgElement = tinyMCE . getParentElement ( e . target , "img" ) ;
tinyMCE . triggerNodeChange ( false ) ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return false ;
break ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
case "keyup" :
case "keydown" :
tinyMCE . hideMenus ( ) ;
tinyMCE . hasMouseMoved = false ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( inst && inst . handleShortcut ( e ) )
2005-12-04 22:04:25 -05:00
return false ;
2006-03-30 02:50:33 -05:00
if ( e . target . editorId )
tinyMCE . selectedInstance = tinyMCE . instances [ e . target . editorId ] ;
else
return ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . selectedInstance )
tinyMCE . selectedInstance . switchSettings ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
var inst = tinyMCE . selectedInstance ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Handle backspace
if ( tinyMCE . isGecko && tinyMCE . settings [ 'force_p_newlines' ] && ( e . keyCode == 8 || e . keyCode == 46 ) && ! e . shiftKey ) {
// Insert P element instead of BR
if ( TinyMCE _ForceParagraphs . _handleBackSpace ( tinyMCE . selectedInstance , e . type ) ) {
// Cancel event
tinyMCE . execCommand ( "mceAddUndoLevel" ) ;
e . preventDefault ( ) ;
2005-12-04 22:04:25 -05:00
return false ;
}
}
2006-03-30 02:50:33 -05:00
tinyMCE . selectedElement = null ;
tinyMCE . selectedNode = null ;
var elm = tinyMCE . selectedInstance . getFocusElement ( ) ;
tinyMCE . linkElement = tinyMCE . getParentElement ( elm , "a" ) ;
tinyMCE . imgElement = tinyMCE . getParentElement ( elm , "img" ) ;
tinyMCE . selectedElement = elm ;
// Update visualaids on tabs
if ( tinyMCE . isGecko && e . type == "keyup" && e . keyCode == 9 )
tinyMCE . handleVisualAid ( tinyMCE . selectedInstance . getBody ( ) , true , tinyMCE . settings [ 'visual' ] , tinyMCE . selectedInstance ) ;
// Fix empty elements on return/enter, check where enter occured
if ( tinyMCE . isMSIE && e . type == "keydown" && e . keyCode == 13 )
tinyMCE . enterKeyElement = tinyMCE . selectedInstance . getFocusElement ( ) ;
// Fix empty elements on return/enter
if ( tinyMCE . isMSIE && e . type == "keyup" && e . keyCode == 13 ) {
var elm = tinyMCE . enterKeyElement ;
if ( elm ) {
var re = new RegExp ( '^HR|IMG|BR$' , 'g' ) ; // Skip these
var dre = new RegExp ( '^H[1-6]$' , 'g' ) ; // Add double on these
if ( ! elm . hasChildNodes ( ) && ! re . test ( elm . nodeName ) ) {
if ( dre . test ( elm . nodeName ) )
elm . innerHTML = " " ;
else
elm . innerHTML = " " ;
}
}
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
// Check if it's a position key
var keys = tinyMCE . posKeyCodes ;
var posKey = false ;
for ( var i = 0 ; i < keys . length ; i ++ ) {
if ( keys [ i ] == e . keyCode ) {
posKey = true ;
break ;
}
2005-12-04 22:04:25 -05:00
}
2005-12-10 20:32:05 -05:00
2006-03-30 02:50:33 -05:00
// MSIE custom key handling
if ( tinyMCE . isMSIE && tinyMCE . settings [ 'custom_undo_redo' ] ) {
var keys = new Array ( 8 , 46 ) ; // Backspace,Delete
for ( var i = 0 ; i < keys . length ; i ++ ) {
if ( keys [ i ] == e . keyCode ) {
if ( e . type == "keyup" )
tinyMCE . triggerNodeChange ( false ) ;
}
}
2005-12-10 20:32:05 -05:00
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// If Ctrl key
if ( e . keyCode == 17 )
return true ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Handle Undo/Redo when typing content
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Start typing (non position key)
if ( ! posKey && e . type == "keyup" )
tinyMCE . execCommand ( "mceStartTyping" ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Store undo bookmark
if ( e . type == "keydown" && ( posKey || e . ctrlKey ) && inst )
inst . undoBookmark = inst . selection . getBookmark ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// End typing (position key) or some Ctrl event
if ( e . type == "keyup" && ( posKey || e . ctrlKey ) )
tinyMCE . execCommand ( "mceEndTyping" ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( posKey && e . type == "keyup" )
2005-12-04 22:04:25 -05:00
tinyMCE . triggerNodeChange ( false ) ;
2006-03-30 02:50:33 -05:00
if ( tinyMCE . isMSIE && e . ctrlKey )
window . setTimeout ( 'tinyMCE.triggerNodeChange(false);' , 1 ) ;
break ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
case "mousedown" :
case "mouseup" :
case "click" :
case "focus" :
tinyMCE . hideMenus ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . selectedInstance ) {
tinyMCE . selectedInstance . switchSettings ( ) ;
tinyMCE . selectedInstance . isFocused = true ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Check instance event trigged on
var targetBody = tinyMCE . getParentElement ( e . target , "body" ) ;
for ( var instanceName in tinyMCE . instances ) {
if ( ! tinyMCE . isInstance ( tinyMCE . instances [ instanceName ] ) )
continue ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
var inst = tinyMCE . instances [ instanceName ] ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Reset design mode if lost (on everything just in case)
inst . autoResetDesignMode ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( inst . getBody ( ) == targetBody ) {
tinyMCE . selectedInstance = inst ;
tinyMCE . selectedElement = e . target ;
tinyMCE . linkElement = tinyMCE . getParentElement ( tinyMCE . selectedElement , "a" ) ;
tinyMCE . imgElement = tinyMCE . getParentElement ( tinyMCE . selectedElement , "img" ) ;
break ;
2005-12-04 22:04:25 -05:00
}
}
2006-03-30 02:50:33 -05:00
// Add first bookmark location
if ( ! tinyMCE . selectedInstance . undoRedo . undoLevels [ 0 ] . bookmark )
tinyMCE . selectedInstance . undoRedo . undoLevels [ 0 ] . bookmark = tinyMCE . selectedInstance . selection . getBookmark ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . isSafari ) {
tinyMCE . selectedInstance . lastSafariSelection = tinyMCE . selectedInstance . selection . getBookmark ( ) ;
tinyMCE . selectedInstance . lastSafariSelectedElement = tinyMCE . selectedElement ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
var lnk = tinyMCE . getParentElement ( tinyMCE . selectedElement , "a" ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Patch the darned link
if ( lnk && e . type == "mousedown" ) {
lnk . setAttribute ( "mce_real_href" , lnk . getAttribute ( "href" ) ) ;
lnk . setAttribute ( "href" , "javascript:void(0);" ) ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
// Patch back
if ( lnk && e . type == "click" ) {
window . setTimeout ( function ( ) {
lnk . setAttribute ( "href" , lnk . getAttribute ( "mce_real_href" ) ) ;
lnk . removeAttribute ( "mce_real_href" ) ;
} , 10 ) ;
2005-12-04 22:04:25 -05:00
}
}
2006-03-30 02:50:33 -05:00
// Reset selected node
if ( e . type != "focus" )
tinyMCE . selectedNode = null ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
tinyMCE . triggerNodeChange ( false ) ;
2005-12-04 22:04:25 -05:00
tinyMCE . execCommand ( "mceEndTyping" ) ;
2006-03-30 02:50:33 -05:00
if ( e . type == "mouseup" )
tinyMCE . execCommand ( "mceAddUndoLevel" ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Just in case
if ( ! tinyMCE . selectedInstance && e . target . editorId )
tinyMCE . selectedInstance = tinyMCE . instances [ e . target . editorId ] ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return false ;
break ;
}
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
getButtonHTML : function ( id , lang , img , cmd , ui , val ) {
var h = '' , m , x ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'' + cmd + '\'' ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( typeof ( ui ) != "undefined" && ui != null )
cmd += ',' + ui ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( typeof ( val ) != "undefined" && val != null )
cmd += ",'" + val + "'" ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
cmd += ');' ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Use tilemaps when enabled and found and never in MSIE since it loads the tile each time from cache if cahce is disabled
if ( tinyMCE . getParam ( 'button_tile_map' ) && ( ! tinyMCE . isMSIE || tinyMCE . isOpera ) && ( m = this . buttonMap [ id ] ) != null && ( tinyMCE . getParam ( "language" ) == "en" || img . indexOf ( '$lang' ) == - 1 ) ) {
// Tiled button
x = 0 - ( m * 20 ) == 0 ? '0' : 0 - ( m * 20 ) ;
h += '<a id="{$editor_id}_' + id + '" href="javascript:' + cmd + '" onclick="' + cmd + 'return false;" onmousedown="return false;" class="mceTiledButton mceButtonNormal" target="_self">' ;
h += '<img src="{$themeurl}/images/spacer.gif" style="background-position: ' + x + 'px 0" title="{$' + lang + '}" />' ;
h += '</a>' ;
} else {
// Normal button
h += '<a id="{$editor_id}_' + id + '" href="javascript:' + cmd + '" onclick="' + cmd + 'return false;" onmousedown="return false;" class="mceButtonNormal" target="_self">' ;
h += '<img src="' + img + '" title="{$' + lang + '}" />' ;
h += '</a>' ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return h ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
addButtonMap : function ( m ) {
var i , a = m . replace ( /\s+/ , '' ) . split ( ',' ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
for ( i = 0 ; i < a . length ; i ++ )
this . buttonMap [ a [ i ] ] = i ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
submitPatch : function ( ) {
tinyMCE . removeTinyMCEFormElements ( this ) ;
tinyMCE . triggerSave ( ) ;
this . mceOldSubmit ( ) ;
tinyMCE . isNotDirty = true ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
onLoad : function ( ) {
if ( tinyMCE . isMSIE && ! tinyMCE . isOpera && window . event . type == "readystatechange" && document . readyState != "complete" )
return true ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . isLoaded )
return true ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
tinyMCE . isLoaded = true ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
tinyMCE . dispatchCallback ( null , 'onpageload' , 'onPageLoad' ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
for ( var c = 0 ; c < tinyMCE . configs . length ; c ++ ) {
tinyMCE . settings = tinyMCE . configs [ c ] ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
var selector = tinyMCE . getParam ( "editor_selector" ) ;
var deselector = tinyMCE . getParam ( "editor_deselector" ) ;
var elementRefAr = new Array ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Add submit triggers
if ( document . forms && tinyMCE . settings [ 'add_form_submit_trigger' ] && ! tinyMCE . submitTriggers ) {
for ( var i = 0 ; i < document . forms . length ; i ++ ) {
var form = document . forms [ i ] ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
tinyMCE . addEvent ( form , "submit" , TinyMCE _Engine . prototype . handleEvent ) ;
tinyMCE . addEvent ( form , "reset" , TinyMCE _Engine . prototype . handleEvent ) ;
tinyMCE . submitTriggers = true ; // Do it only once
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Patch the form.submit function
if ( tinyMCE . settings [ 'submit_patch' ] ) {
try {
form . mceOldSubmit = form . submit ;
form . submit = TinyMCE _Engine . prototype . submitPatch ;
} catch ( e ) {
// Do nothing
}
}
}
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Add editor instances based on mode
var mode = tinyMCE . settings [ 'mode' ] ;
switch ( mode ) {
case "exact" :
var elements = tinyMCE . getParam ( 'elements' , '' , true , ',' ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
for ( var i = 0 ; i < elements . length ; i ++ ) {
var element = tinyMCE . _getElementById ( elements [ i ] ) ;
var trigger = element ? element . getAttribute ( tinyMCE . settings [ 'textarea_trigger' ] ) : "" ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . getAttrib ( element , "class" ) . indexOf ( deselector ) != - 1 )
continue ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( trigger == "false" )
continue ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( ( tinyMCE . settings [ 'ask' ] || tinyMCE . settings [ 'convert_on_click' ] ) && element ) {
elementRefAr [ elementRefAr . length ] = element ;
continue ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( element )
tinyMCE . addMCEControl ( element , elements [ i ] ) ;
else if ( tinyMCE . settings [ 'debug' ] )
alert ( "Error: Could not find element by id or name: " + elements [ i ] ) ;
}
break ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
case "specific_textareas" :
case "textareas" :
var nodeList = document . getElementsByTagName ( "textarea" ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
for ( var i = 0 ; i < nodeList . length ; i ++ ) {
var elm = nodeList . item ( i ) ;
var trigger = elm . getAttribute ( tinyMCE . settings [ 'textarea_trigger' ] ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( selector != '' && tinyMCE . getAttrib ( elm , "class" ) . indexOf ( selector ) == - 1 )
continue ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( selector != '' )
trigger = selector != "" ? "true" : "" ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . getAttrib ( elm , "class" ) . indexOf ( deselector ) != - 1 )
continue ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( ( mode == "specific_textareas" && trigger == "true" ) || ( mode == "textareas" && trigger != "false" ) )
elementRefAr [ elementRefAr . length ] = elm ;
}
break ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
for ( var i = 0 ; i < elementRefAr . length ; i ++ ) {
var element = elementRefAr [ i ] ;
var elementId = element . name ? element . name : element . id ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . settings [ 'ask' ] || tinyMCE . settings [ 'convert_on_click' ] ) {
// Focus breaks in Mozilla
if ( tinyMCE . isGecko ) {
var settings = tinyMCE . settings ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
tinyMCE . addEvent ( element , "focus" , function ( e ) { window . setTimeout ( function ( ) { TinyMCE _Engine . prototype . confirmAdd ( e , settings ) ; } , 10 ) ; } ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( element . nodeName != "TEXTAREA" && element . nodeName != "INPUT" )
tinyMCE . addEvent ( element , "click" , function ( e ) { window . setTimeout ( function ( ) { TinyMCE _Engine . prototype . confirmAdd ( e , settings ) ; } , 10 ) ; } ) ;
// tinyMCE.addEvent(element, "mouseover", function (e) {window.setTimeout(function() {TinyMCE_Engine.prototype.confirmAdd(e, settings);}, 10);});
} else {
var settings = tinyMCE . settings ;
tinyMCE . addEvent ( element , "focus" , function ( ) { TinyMCE _Engine . prototype . confirmAdd ( null , settings ) ; } ) ;
tinyMCE . addEvent ( element , "click" , function ( ) { TinyMCE _Engine . prototype . confirmAdd ( null , settings ) ; } ) ;
// tinyMCE.addEvent(element, "mouseenter", function () { TinyMCE_Engine.prototype.confirmAdd(null, settings); });
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
} else
tinyMCE . addMCEControl ( element , elementId ) ;
}
// Handle auto focus
if ( tinyMCE . settings [ 'auto_focus' ] ) {
window . setTimeout ( function ( ) {
var inst = tinyMCE . getInstanceById ( tinyMCE . settings [ 'auto_focus' ] ) ;
inst . selection . selectNode ( inst . getBody ( ) , true , true ) ;
inst . contentWindow . focus ( ) ;
} , 10 ) ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
tinyMCE . dispatchCallback ( null , 'oninit' , 'onInit' ) ;
}
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
isInstance : function ( o ) {
return o != null && typeof ( o ) == "object" && o . isTinyMCE _Control ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
getParam : function ( name , default _value , strip _whitespace , split _chr ) {
var value = ( typeof ( this . settings [ name ] ) == "undefined" ) ? default _value : this . settings [ name ] ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Fix bool values
if ( value == "true" || value == "false" )
return ( value == "true" ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( strip _whitespace )
value = tinyMCE . regexpReplace ( value , "[ \t\r\n]" , "" ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( typeof ( split _chr ) != "undefined" && split _chr != null ) {
value = value . split ( split _chr ) ;
var outArray = new Array ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
for ( var i = 0 ; i < value . length ; i ++ ) {
if ( value [ i ] && value [ i ] != "" )
outArray [ outArray . length ] = value [ i ] ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
value = outArray ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return value ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
getLang : function ( name , default _value , parse _entities , va ) {
var v = ( typeof ( tinyMCELang [ name ] ) == "undefined" ) ? default _value : tinyMCELang [ name ] , n ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( parse _entities )
v = tinyMCE . entityDecode ( v ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( va ) {
for ( n in va )
v = this . replaceVar ( v , n , va [ n ] ) ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
return v ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
entityDecode : function ( s ) {
var e = document . createElement ( "div" ) ;
e . innerHTML = s ;
return e . innerHTML ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
addToLang : function ( prefix , ar ) {
for ( var key in ar ) {
if ( typeof ( ar [ key ] ) == 'function' )
continue ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
tinyMCELang [ ( key . indexOf ( 'lang_' ) == - 1 ? 'lang_' : '' ) + ( prefix != '' ? ( prefix + "_" ) : '' ) + key ] = ar [ key ] ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
// for (var key in ar)
// tinyMCELang[(key.indexOf('lang_') == -1 ? 'lang_' : '') + (prefix != '' ? (prefix + "_") : '') + key] = "|" + ar[key] + "|";
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
triggerNodeChange : function ( focus , setup _content ) {
if ( tinyMCE . selectedInstance ) {
var inst = tinyMCE . selectedInstance ;
var editorId = inst . editorId ;
var elm = ( typeof ( setup _content ) != "undefined" && setup _content ) ? tinyMCE . selectedElement : inst . getFocusElement ( ) ;
var undoIndex = - 1 ;
var undoLevels = - 1 ;
var anySelection = false ;
var selectedText = inst . selection . getSelectedText ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( setup _content && tinyMCE . isGecko && inst . isHidden ( ) )
elm = inst . getBody ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
inst . switchSettings ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . settings [ "auto_resize" ] ) {
var doc = inst . getDoc ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
inst . iframeElement . style . width = doc . body . offsetWidth + "px" ;
inst . iframeElement . style . height = doc . body . offsetHeight + "px" ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . selectedElement )
anySelection = ( tinyMCE . selectedElement . nodeName . toLowerCase ( ) == "img" ) || ( selectedText && selectedText . length > 0 ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . settings [ 'custom_undo_redo' ] ) {
undoIndex = inst . undoRedo . undoIndex ;
undoLevels = inst . undoRedo . undoLevels . length ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
tinyMCE . dispatchCallback ( inst , 'handle_node_change_callback' , 'handleNodeChange' , editorId , elm , undoIndex , undoLevels , inst . visualAid , anySelection , setup _content ) ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
if ( this . selectedInstance && ( typeof ( focus ) == "undefined" || focus ) )
this . selectedInstance . contentWindow . focus ( ) ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
_customCleanup : function ( inst , type , content ) {
var pl , po , i ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Call custom cleanup
var customCleanup = tinyMCE . settings [ 'cleanup_callback' ] ;
if ( customCleanup != "" && eval ( "typeof(" + customCleanup + ")" ) != "undefined" )
content = eval ( customCleanup + "(type, content, inst);" ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Trigger plugin cleanups
pl = inst . plugins ;
for ( i = 0 ; i < pl . length ; i ++ ) {
po = tinyMCE . plugins [ pl [ i ] ] ;
if ( po && po . cleanup )
content = po . cleanup ( type , content , inst ) ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
return content ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
setContent : function ( h ) {
if ( tinyMCE . selectedInstance ) {
tinyMCE . selectedInstance . execCommand ( 'mceSetContent' , false , h ) ;
tinyMCE . selectedInstance . repaint ( ) ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
importThemeLanguagePack : function ( name ) {
if ( typeof ( name ) == "undefined" )
name = tinyMCE . settings [ 'theme' ] ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
tinyMCE . loadScript ( tinyMCE . baseURL + '/themes/' + name + '/langs/' + tinyMCE . settings [ 'language' ] + '.js' ) ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
importPluginLanguagePack : function ( name , valid _languages ) {
var lang = "en" , b = tinyMCE . baseURL + '/plugins/' + name ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
valid _languages = valid _languages . split ( ',' ) ;
for ( var i = 0 ; i < valid _languages . length ; i ++ ) {
if ( tinyMCE . settings [ 'language' ] == valid _languages [ i ] )
lang = tinyMCE . settings [ 'language' ] ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( this . plugins [ name ] )
b = this . plugins [ name ] . baseURL ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
tinyMCE . loadScript ( b + '/langs/' + lang + '.js' ) ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
applyTemplate : function ( h , as ) {
var i , s , ar = h . match ( new RegExp ( '\\{\\$[a-z0-9_]+\\}' , 'gi' ) ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( ar && ar . length > 0 ) {
for ( i = ar . length - 1 ; i >= 0 ; i -- ) {
s = ar [ i ] . substring ( 2 , ar [ i ] . length - 1 ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( s . indexOf ( 'lang_' ) == 0 && tinyMCELang [ s ] )
h = tinyMCE . replaceVar ( h , s , tinyMCELang [ s ] ) ;
else if ( as && as [ s ] )
h = tinyMCE . replaceVar ( h , s , as [ s ] ) ;
else if ( tinyMCE . settings [ s ] )
h = tinyMCE . replaceVar ( h , s , tinyMCE . settings [ s ] ) ;
}
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
h = tinyMCE . replaceVar ( h , "themeurl" , tinyMCE . themeURL ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return h ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
replaceVar : function ( h , r , v ) {
return h . replace ( new RegExp ( '{\\\$' + r + '}' , 'g' ) , v ) ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
openWindow : function ( template , args ) {
var html , width , height , x , y , resizable , scrollbars , url ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
args [ 'mce_template_file' ] = template [ 'file' ] ;
args [ 'mce_width' ] = template [ 'width' ] ;
args [ 'mce_height' ] = template [ 'height' ] ;
tinyMCE . windowArgs = args ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
html = template [ 'html' ] ;
if ( ! ( width = parseInt ( template [ 'width' ] ) ) )
width = 320 ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( ! ( height = parseInt ( template [ 'height' ] ) ) )
height = 200 ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Add to height in M$ due to SP2 WHY DON'T YOU GUYS IMPLEMENT innerWidth of windows!!
if ( tinyMCE . isMSIE )
height += 40 ;
else
height += 20 ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
x = parseInt ( screen . width / 2.0 ) - ( width / 2.0 ) ;
y = parseInt ( screen . height / 2.0 ) - ( height / 2.0 ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
resizable = ( args && args [ 'resizable' ] ) ? args [ 'resizable' ] : "no" ;
scrollbars = ( args && args [ 'scrollbars' ] ) ? args [ 'scrollbars' ] : "no" ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( template [ 'file' ] . charAt ( 0 ) != '/' && template [ 'file' ] . indexOf ( '://' ) == - 1 )
url = tinyMCE . baseURL + "/themes/" + tinyMCE . getParam ( "theme" ) + "/" + template [ 'file' ] ;
else
url = template [ 'file' ] ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Replace all args as variables in URL
for ( var name in args ) {
if ( typeof ( args [ name ] ) == 'function' )
continue ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
url = tinyMCE . replaceVar ( url , name , escape ( args [ name ] ) ) ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
if ( html ) {
html = tinyMCE . replaceVar ( html , "css" , this . settings [ 'popups_css' ] ) ;
html = tinyMCE . applyTemplate ( html , args ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
var win = window . open ( "" , "mcePopup" + new Date ( ) . getTime ( ) , "top=" + y + ",left=" + x + ",scrollbars=" + scrollbars + ",dialog=yes,minimizable=" + resizable + ",modal=yes,width=" + width + ",height=" + height + ",resizable=" + resizable ) ;
if ( win == null ) {
alert ( tinyMCELang [ 'lang_popup_blocked' ] ) ;
return ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
win . document . write ( html ) ;
win . document . close ( ) ;
win . resizeTo ( width , height ) ;
win . focus ( ) ;
} else {
if ( ( tinyMCE . isMSIE && ! tinyMCE . isOpera ) && resizable != 'yes' && tinyMCE . settings [ "dialog_type" ] == "modal" ) {
height += 10 ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
var features = "resizable:" + resizable
+ ";scroll:"
+ scrollbars + ";status:yes;center:yes;help:no;dialogWidth:"
+ width + "px;dialogHeight:" + height + "px;" ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
window . showModalDialog ( url , window , features ) ;
} else {
var modal = ( resizable == "yes" ) ? "no" : "yes" ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . isGecko && tinyMCE . isMac )
modal = "no" ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( template [ 'close_previous' ] != "no" )
try { tinyMCE . lastWindow . close ( ) ; } catch ( ex ) { }
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
var win = window . open ( url , "mcePopup" + new Date ( ) . getTime ( ) , "top=" + y + ",left=" + x + ",scrollbars=" + scrollbars + ",dialog=" + modal + ",minimizable=" + resizable + ",modal=" + modal + ",width=" + width + ",height=" + height + ",resizable=" + resizable ) ;
if ( win == null ) {
alert ( tinyMCELang [ 'lang_popup_blocked' ] ) ;
return ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( template [ 'close_previous' ] != "no" )
tinyMCE . lastWindow = win ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
eval ( 'try { win.resizeTo(width, height); } catch(e) { }' ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Make it bigger if statusbar is forced
if ( tinyMCE . isGecko ) {
if ( win . document . defaultView . statusbar . visible )
win . resizeBy ( 0 , tinyMCE . isMac ? 10 : 24 ) ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
win . focus ( ) ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
}
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
closeWindow : function ( win ) {
win . close ( ) ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
getVisualAidClass : function ( class _name , state ) {
var aidClass = tinyMCE . settings [ 'visual_table_class' ] ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( typeof ( state ) == "undefined" )
state = tinyMCE . settings [ 'visual' ] ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Split
var classNames = new Array ( ) ;
var ar = class _name . split ( ' ' ) ;
for ( var i = 0 ; i < ar . length ; i ++ ) {
if ( ar [ i ] == aidClass )
ar [ i ] = "" ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( ar [ i ] != "" )
classNames [ classNames . length ] = ar [ i ] ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( state )
classNames [ classNames . length ] = aidClass ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Glue
var className = "" ;
for ( var i = 0 ; i < classNames . length ; i ++ ) {
if ( i > 0 )
className += " " ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
className += classNames [ i ] ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return className ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
handleVisualAid : function ( el , deep , state , inst ) {
if ( ! el )
return ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
var tableElement = null ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
switch ( el . nodeName ) {
case "TABLE" :
var oldW = el . style . width ;
var oldH = el . style . height ;
var bo = tinyMCE . getAttrib ( el , "border" ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
bo = bo == "" || bo == "0" ? true : false ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
tinyMCE . setAttrib ( el , "class" , tinyMCE . getVisualAidClass ( tinyMCE . getAttrib ( el , "class" ) , state && bo ) ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
el . style . width = oldW ;
el . style . height = oldH ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
for ( var y = 0 ; y < el . rows . length ; y ++ ) {
for ( var x = 0 ; x < el . rows [ y ] . cells . length ; x ++ ) {
var cn = tinyMCE . getVisualAidClass ( tinyMCE . getAttrib ( el . rows [ y ] . cells [ x ] , "class" ) , state && bo ) ;
tinyMCE . setAttrib ( el . rows [ y ] . cells [ x ] , "class" , cn ) ;
}
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
break ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
case "A" :
var anchorName = tinyMCE . getAttrib ( el , "name" ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( anchorName != '' && state ) {
el . title = anchorName ;
el . className = 'mceItemAnchor' ;
} else if ( anchorName != '' && ! state )
el . className = '' ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
break ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( deep && el . hasChildNodes ( ) ) {
for ( var i = 0 ; i < el . childNodes . length ; i ++ )
tinyMCE . handleVisualAid ( el . childNodes [ i ] , deep , state , inst ) ;
}
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
/ *
applyClassesToFonts : function ( doc , size ) {
var f = doc . getElementsByTagName ( "font" ) ;
for ( var i = 0 ; i < f . length ; i ++ ) {
var s = tinyMCE . getAttrib ( f [ i ] , "size" ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( s != "" )
tinyMCE . setAttrib ( f [ i ] , 'class' , "mceItemFont" + s ) ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( typeof ( size ) != "undefined" ) {
var css = "" ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
for ( var x = 0 ; x < doc . styleSheets . length ; x ++ ) {
for ( var i = 0 ; i < doc . styleSheets [ x ] . rules . length ; i ++ ) {
if ( doc . styleSheets [ x ] . rules [ i ] . selectorText == '#mceSpanFonts .mceItemFont' + size ) {
css = doc . styleSheets [ x ] . rules [ i ] . style . cssText ;
break ;
}
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( css != "" )
break ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( doc . styleSheets [ 0 ] . rules [ 0 ] . selectorText == "FONT" )
doc . styleSheets [ 0 ] . removeRule ( 0 ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
doc . styleSheets [ 0 ] . addRule ( "FONT" , css , 0 ) ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
} ,
* /
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
fixGeckoBaseHREFBug : function ( m , e , h ) {
var nl , i ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . isGecko ) {
if ( m == 1 ) {
h = h . replace ( /\ssrc=/gi , " xsrc=" ) ;
h = h . replace ( /\shref=/gi , " xhref=" ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return h ;
} else {
var el = new Array ( 'a' , 'img' , 'select' , 'area' , 'iframe' , 'base' , 'input' , 'script' , 'embed' , 'object' , 'link' ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
for ( var a = 0 ; a < el . length ; a ++ ) {
var n = e . getElementsByTagName ( el [ a ] ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
for ( i = 0 ; i < n . length ; i ++ ) {
var xsrc = tinyMCE . getAttrib ( n [ i ] , "xsrc" ) ;
var xhref = tinyMCE . getAttrib ( n [ i ] , "xhref" ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( xsrc != "" ) {
n [ i ] . src = tinyMCE . convertRelativeToAbsoluteURL ( tinyMCE . settings [ 'base_href' ] , xsrc ) ;
n [ i ] . removeAttribute ( "xsrc" ) ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( xhref != "" ) {
n [ i ] . href = tinyMCE . convertRelativeToAbsoluteURL ( tinyMCE . settings [ 'base_href' ] , xhref ) ;
n [ i ] . removeAttribute ( "xhref" ) ;
}
}
}
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return h ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
_setHTML : function ( doc , html _content ) {
// Force closed anchors open
//html_content = html_content.replace(new RegExp('<a(.*?)/>', 'gi'), '<a$1></a>');
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
html _content = tinyMCE . cleanupHTMLCode ( html _content ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Try innerHTML if it fails use pasteHTML in MSIE
try {
tinyMCE . setInnerHTML ( doc . body , html _content ) ;
} catch ( e ) {
if ( this . isMSIE )
doc . body . createTextRange ( ) . pasteHTML ( html _content ) ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Content duplication bug fix
if ( tinyMCE . isMSIE && tinyMCE . settings [ 'fix_content_duplication' ] ) {
// Remove P elements in P elements
var paras = doc . getElementsByTagName ( "P" ) ;
for ( var i = 0 ; i < paras . length ; i ++ ) {
var node = paras [ i ] ;
while ( ( node = node . parentNode ) != null ) {
if ( node . nodeName == "P" )
node . outerHTML = node . innerHTML ;
}
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Content duplication bug fix (Seems to be word crap)
var html = doc . body . innerHTML ;
/ *
if ( html . indexOf ( '="mso' ) != - 1 ) {
for ( var i = 0 ; i < doc . body . all . length ; i ++ ) {
var el = doc . body . all [ i ] ;
el . removeAttribute ( "className" , "" , 0 ) ;
el . removeAttribute ( "style" , "" , 0 ) ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
html = doc . body . innerHTML ;
html = tinyMCE . regexpReplace ( html , "<o:p><\/o:p>" , "<br />" ) ;
html = tinyMCE . regexpReplace ( html , "<o:p> <\/o:p>" , "" ) ;
html = tinyMCE . regexpReplace ( html , "<st1:.*?>" , "" ) ;
html = tinyMCE . regexpReplace ( html , "<p><\/p>" , "" ) ;
html = tinyMCE . regexpReplace ( html , "<p><\/p>\r\n<p><\/p>" , "" ) ;
html = tinyMCE . regexpReplace ( html , "<p> <\/p>" , "<br />" ) ;
html = tinyMCE . regexpReplace ( html , "<p>\s*(<p>\s*)?" , "<p>" ) ;
html = tinyMCE . regexpReplace ( html , "<\/p>\s*(<\/p>\s*)?" , "</p>" ) ;
} * /
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Always set the htmlText output
tinyMCE . setInnerHTML ( doc . body , html ) ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
tinyMCE . cleanupAnchors ( doc ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . getParam ( "convert_fonts_to_spans" ) )
tinyMCE . convertSpansToFonts ( doc ) ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
getEditorId : function ( form _element ) {
var inst = this . getInstanceById ( form _element ) ;
if ( ! inst )
return null ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return inst . editorId ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
getInstanceById : function ( editor _id ) {
var inst = this . instances [ editor _id ] ;
if ( ! inst ) {
for ( var n in tinyMCE . instances ) {
var instance = tinyMCE . instances [ n ] ;
if ( ! tinyMCE . isInstance ( instance ) )
continue ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( instance . formTargetElementId == editor _id ) {
inst = instance ;
break ;
}
}
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
return inst ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
queryInstanceCommandValue : function ( editor _id , command ) {
var inst = tinyMCE . getInstanceById ( editor _id ) ;
if ( inst )
return inst . queryCommandValue ( command ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return false ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
queryInstanceCommandState : function ( editor _id , command ) {
var inst = tinyMCE . getInstanceById ( editor _id ) ;
if ( inst )
return inst . queryCommandState ( command ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return null ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
setWindowArg : function ( n , v ) {
this . windowArgs [ n ] = v ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
getWindowArg : function ( n , d ) {
return ( typeof ( this . windowArgs [ n ] ) == "undefined" ) ? d : this . windowArgs [ n ] ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
getCSSClasses : function ( editor _id , doc ) {
var output = new Array ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Is cached, use that
if ( typeof ( tinyMCE . cssClasses ) != "undefined" )
return tinyMCE . cssClasses ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( typeof ( editor _id ) == "undefined" && typeof ( doc ) == "undefined" ) {
var instance ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
for ( var instanceName in tinyMCE . instances ) {
instance = tinyMCE . instances [ instanceName ] ;
if ( ! tinyMCE . isInstance ( instance ) )
continue ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
break ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
doc = instance . getDoc ( ) ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( typeof ( doc ) == "undefined" ) {
var instance = tinyMCE . getInstanceById ( editor _id ) ;
doc = instance . getDoc ( ) ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( doc ) {
var styles = tinyMCE . isMSIE ? doc . styleSheets : doc . styleSheets ;
if ( styles && styles . length > 0 ) {
for ( var x = 0 ; x < styles . length ; x ++ ) {
var csses = null ;
// Just ignore any errors
eval ( "try {var csses = tinyMCE.isMSIE ? doc.styleSheets(" + x + ").rules : doc.styleSheets[" + x + "].cssRules;} catch(e) {}" ) ;
if ( ! csses )
return new Array ( ) ;
for ( var i = 0 ; i < csses . length ; i ++ ) {
var selectorText = csses [ i ] . selectorText ;
// Can be multiple rules per selector
if ( selectorText ) {
var rules = selectorText . split ( ',' ) ;
for ( var c = 0 ; c < rules . length ; c ++ ) {
// Invalid rule
if ( rules [ c ] . indexOf ( ' ' ) != - 1 || rules [ c ] . indexOf ( ':' ) != - 1 || rules [ c ] . indexOf ( 'mceItem' ) != - 1 )
continue ;
if ( rules [ c ] == "." + tinyMCE . settings [ 'visual_table_class' ] || rules [ c ] . indexOf ( 'mceEditable' ) != - 1 || rules [ c ] . indexOf ( 'mceNonEditable' ) != - 1 )
continue ;
// Is class rule
if ( rules [ c ] . indexOf ( '.' ) != - 1 ) {
//alert(rules[c].substring(rules[c].indexOf('.')));
output [ output . length ] = rules [ c ] . substring ( rules [ c ] . indexOf ( '.' ) + 1 ) ;
}
}
}
}
2005-12-04 22:04:25 -05:00
}
}
2006-03-30 02:50:33 -05:00
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Cache em
if ( output . length > 0 )
tinyMCE . cssClasses = output ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return output ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
regexpReplace : function ( in _str , reg _exp , replace _str , opts ) {
if ( in _str == null )
return in _str ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( typeof ( opts ) == "undefined" )
opts = 'g' ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
var re = new RegExp ( reg _exp , opts ) ;
return in _str . replace ( re , replace _str ) ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
trim : function ( s ) {
return s . replace ( /^\s*|\s*$/g , "" ) ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
cleanupEventStr : function ( s ) {
s = "" + s ;
s = s . replace ( 'function anonymous()\n{\n' , '' ) ;
s = s . replace ( '\n}' , '' ) ;
s = s . replace ( /^return true;/gi , '' ) ; // Remove event blocker
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return s ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
getControlHTML : function ( c ) {
var i , l , n , o , v ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
l = tinyMCE . plugins ;
for ( n in l ) {
o = l [ n ] ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( o . getControlHTML && ( v = o . getControlHTML ( c ) ) != '' )
return tinyMCE . replaceVar ( v , "pluginurl" , o . baseURL ) ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
o = tinyMCE . themes [ tinyMCE . settings [ 'theme' ] ] ;
if ( o . getControlHTML && ( v = o . getControlHTML ( c ) ) != '' )
return v ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return '' ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
evalFunc : function ( f , idx , a ) {
var s = '(' , i ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
for ( i = idx ; i < a . length ; i ++ ) {
s += 'a[' + i + ']' ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( i < a . length - 1 )
s += ',' ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
s += ');' ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return eval ( "f" + s ) ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
dispatchCallback : function ( i , p , n ) {
return this . callFunc ( i , p , n , 0 , this . dispatchCallback . arguments ) ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
executeCallback : function ( i , p , n ) {
return this . callFunc ( i , p , n , 1 , this . executeCallback . arguments ) ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
execCommandCallback : function ( i , p , n ) {
return this . callFunc ( i , p , n , 2 , this . execCommandCallback . arguments ) ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
callFunc : function ( ins , p , n , m , a ) {
var l , i , on , o , s , v ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
s = m == 2 ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
l = tinyMCE . getParam ( p , '' ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( l != '' && ( v = tinyMCE . evalFunc ( typeof ( l ) == "function" ? l : eval ( l ) , 3 , a ) ) == s && m > 0 )
return true ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( ins != null ) {
for ( i = 0 , l = ins . plugins ; i < l . length ; i ++ ) {
o = tinyMCE . plugins [ l [ i ] ] ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( o [ n ] && ( v = tinyMCE . evalFunc ( o [ n ] , 3 , a ) ) == s && m > 0 )
return true ;
}
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
l = tinyMCE . themes ;
for ( on in l ) {
o = l [ on ] ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( o [ n ] && ( v = tinyMCE . evalFunc ( o [ n ] , 3 , a ) ) == s && m > 0 )
return true ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return false ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
xmlEncode : function ( s ) {
s = "" + s ;
s = s . replace ( /&/g , '&' ) ;
s = s . replace ( new RegExp ( '"' , 'g' ) , '"' ) ;
s = s . replace ( /\'/g , ''' ) ; // ' is not working in MSIE
s = s . replace ( /</g , '<' ) ;
s = s . replace ( />/g , '>' ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return s ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
extend : function ( p , np ) {
var o = { } ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
o . parent = p ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
for ( n in p )
o [ n ] = p [ n ] ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
for ( n in np )
o [ n ] = np [ n ] ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return o ;
} ,
hideMenus : function ( ) {
var e = tinyMCE . lastSelectedMenuBtn ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . lastMenu ) {
tinyMCE . lastMenu . hide ( ) ;
tinyMCE . lastMenu = null ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( e ) {
tinyMCE . switchClass ( e , tinyMCE . lastMenuBtnClass ) ;
tinyMCE . lastSelectedMenuBtn = null ;
}
}
} ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Global instances
var TinyMCE = TinyMCE _Engine ; // Compatiblity with gzip compressors
var tinyMCE = new TinyMCE _Engine ( ) ;
var tinyMCELang = { } ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
/* file:jscripts/tiny_mce/classes/TinyMCE_Control.class.js */
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
function TinyMCE _Control ( settings ) {
var t , i , to , fu , p , x , fn , fu , pn , s = settings ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
this . undoRedoLevel = true ;
this . isTinyMCE _Control = true ;
// Default settings
this . settings = s ;
this . settings [ 'theme' ] = tinyMCE . getParam ( "theme" , "default" ) ;
this . settings [ 'width' ] = tinyMCE . getParam ( "width" , - 1 ) ;
this . settings [ 'height' ] = tinyMCE . getParam ( "height" , - 1 ) ;
this . selection = new TinyMCE _Selection ( this ) ;
this . undoRedo = new TinyMCE _UndoRedo ( this ) ;
this . cleanup = new TinyMCE _Cleanup ( ) ;
this . shortcuts = new Array ( ) ;
this . hasMouseMoved = false ;
this . cleanup . init ( {
valid _elements : s . valid _elements ,
extended _valid _elements : s . extended _valid _elements ,
entities : s . entities ,
entity _encoding : s . entity _encoding ,
debug : s . cleanup _debug ,
url _converter : 'TinyMCE_Cleanup.prototype._urlConverter' ,
indent : s . apply _source _formatting ,
invalid _elements : s . invalid _elements ,
verify _html : s . verify _html ,
fix _content _duplication : s . fix _content _duplication
} ) ;
// Wrap old theme
t = this . settings [ 'theme' ] ;
if ( ! tinyMCE . hasTheme ( t ) ) {
fn = tinyMCE . callbacks ;
to = { } ;
for ( i = 0 ; i < fn . length ; i ++ ) {
if ( ( fu = window [ 'TinyMCE_' + t + "_" + fn [ i ] ] ) )
to [ fn [ i ] ] = fu ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
tinyMCE . addTheme ( t , to ) ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
// Wrap old plugins
this . plugins = new Array ( ) ;
p = tinyMCE . getParam ( 'plugins' , '' , true , ',' ) ;
if ( p . length > 0 ) {
for ( i = 0 ; i < p . length ; i ++ ) {
pn = p [ i ] ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( pn . charAt ( 0 ) == '-' )
pn = pn . substring ( 1 ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( ! tinyMCE . hasPlugin ( pn ) ) {
fn = tinyMCE . callbacks ;
to = { } ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
for ( x = 0 ; x < fn . length ; x ++ ) {
if ( ( fu = window [ 'TinyMCE_' + pn + "_" + fn [ x ] ] ) )
to [ fn [ x ] ] = fu ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
tinyMCE . addPlugin ( pn , to ) ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
this . plugins [ this . plugins . length ] = pn ;
}
}
} ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
TinyMCE _Control . prototype = {
hasPlugin : function ( n ) {
var i ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
for ( i = 0 ; i < this . plugins . length ; i ++ ) {
if ( this . plugins [ i ] == n )
return true ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
return false ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
addPlugin : function ( n , p ) {
if ( ! this . hasPlugin ( n ) ) {
tinyMCE . addPlugin ( n , p ) ;
this . plugins [ this . plugins . length ] = n ;
}
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
repaint : function ( ) {
if ( tinyMCE . isMSIE && ! tinyMCE . isOpera )
return ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
try {
var s = this . selection ;
var b = s . getBookmark ( true ) ;
this . getBody ( ) . style . display = 'none' ;
this . getDoc ( ) . execCommand ( 'selectall' , false , null ) ;
this . getSel ( ) . collapseToStart ( ) ;
this . getBody ( ) . style . display = 'block' ;
s . moveToBookmark ( b ) ;
} catch ( ex ) {
// Ignore
}
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
switchSettings : function ( ) {
if ( tinyMCE . configs . length > 1 && tinyMCE . currentConfig != this . settings [ 'index' ] ) {
tinyMCE . settings = this . settings ;
tinyMCE . currentConfig = this . settings [ 'index' ] ;
}
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
getBody : function ( ) {
return this . getDoc ( ) . body ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
getDoc : function ( ) {
return this . contentWindow . document ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
getWin : function ( ) {
return this . contentWindow ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
addShortcut : function ( m , k , d , cmd , ui , va ) {
var n = typeof ( k ) == "number" , ie = tinyMCE . isMSIE , c , sc , i ;
var scl = this . shortcuts ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( ! tinyMCE . getParam ( 'custom_shortcuts' ) )
return false ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
m = m . toLowerCase ( ) ;
k = ie && ! n ? k . toUpperCase ( ) : k ;
c = n ? null : k . charCodeAt ( 0 ) ;
d = d && d . indexOf ( 'lang_' ) == 0 ? tinyMCE . getLang ( d ) : d ;
sc = {
alt : m . indexOf ( 'alt' ) != - 1 ,
ctrl : m . indexOf ( 'ctrl' ) != - 1 ,
shift : m . indexOf ( 'shift' ) != - 1 ,
charCode : c ,
keyCode : n ? k : ( ie ? c : null ) ,
desc : d ,
cmd : cmd ,
ui : ui ,
val : va
} ;
for ( i = 0 ; i < scl . length ; i ++ ) {
if ( sc . alt == scl [ i ] . alt && sc . ctrl == scl [ i ] . ctrl && sc . shift == scl [ i ] . shift
&& sc . charCode == scl [ i ] . charCode && sc . keyCode == scl [ i ] . keyCode ) {
return false ;
}
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
scl [ scl . length ] = sc ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return true ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
handleShortcut : function ( e ) {
var i , s = this . shortcuts , o ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
for ( i = 0 ; i < s . length ; i ++ ) {
o = s [ i ] ;
if ( o . alt == e . altKey && o . ctrl == e . ctrlKey && ( o . keyCode == e . keyCode || o . charCode == e . charCode ) ) {
if ( o . cmd && ( e . type == "keydown" || ( e . type == "keypress" && ! tinyMCE . isOpera ) ) )
tinyMCE . execCommand ( o . cmd , o . ui , o . val ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
tinyMCE . cancelEvent ( e ) ;
return true ;
}
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return false ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
autoResetDesignMode : function ( ) {
// Add fix for tab/style.display none/block problems in Gecko
if ( ! tinyMCE . isMSIE && this . isHidden ( ) && tinyMCE . getParam ( 'auto_reset_designmode' ) )
eval ( 'try { this.getDoc().designMode = "On"; } catch(e) {}' ) ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
isHidden : function ( ) {
if ( tinyMCE . isMSIE )
return false ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
var s = this . getSel ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Weird, wheres that cursor selection?
return ( ! s || ! s . rangeCount || s . rangeCount == 0 ) ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
isDirty : function ( ) {
// Is content modified and not in a submit procedure
return this . startContent != tinyMCE . trim ( this . getBody ( ) . innerHTML ) && ! tinyMCE . isNotDirty ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
_mergeElements : function ( scmd , pa , ch , override ) {
if ( scmd == "removeformat" ) {
pa . className = "" ;
pa . style . cssText = "" ;
ch . className = "" ;
ch . style . cssText = "" ;
return ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
var st = tinyMCE . parseStyle ( tinyMCE . getAttrib ( pa , "style" ) ) ;
var stc = tinyMCE . parseStyle ( tinyMCE . getAttrib ( ch , "style" ) ) ;
var className = tinyMCE . getAttrib ( pa , "class" ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
className += " " + tinyMCE . getAttrib ( ch , "class" ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( override ) {
for ( var n in st ) {
if ( typeof ( st [ n ] ) == 'function' )
continue ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
stc [ n ] = st [ n ] ;
}
} else {
for ( var n in stc ) {
if ( typeof ( stc [ n ] ) == 'function' )
continue ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
st [ n ] = stc [ n ] ;
}
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
tinyMCE . setAttrib ( pa , "style" , tinyMCE . serializeStyle ( st ) ) ;
tinyMCE . setAttrib ( pa , "class" , tinyMCE . trim ( className ) ) ;
ch . className = "" ;
ch . style . cssText = "" ;
ch . removeAttribute ( "class" ) ;
ch . removeAttribute ( "style" ) ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
_setUseCSS : function ( b ) {
var d = this . getDoc ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
try { d . execCommand ( "useCSS" , false , ! b ) ; } catch ( ex ) { }
try { d . execCommand ( "styleWithCSS" , false , b ) ; } catch ( ex ) { }
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( ! tinyMCE . getParam ( "table_inline_editing" ) )
try { d . execCommand ( 'enableInlineTableEditing' , false , "false" ) ; } catch ( ex ) { }
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( ! tinyMCE . getParam ( "object_resizing" ) )
try { d . execCommand ( 'enableObjectResizing' , false , "false" ) ; } catch ( ex ) { }
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
execCommand : function ( command , user _interface , value ) {
var doc = this . getDoc ( ) ;
var win = this . getWin ( ) ;
var focusElm = this . getFocusElement ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Is non udno specific command
if ( ! new RegExp ( 'mceStartTyping|mceEndTyping|mceBeginUndoLevel|mceEndUndoLevel|mceAddUndoLevel' , 'gi' ) . test ( command ) )
this . undoBookmark = null ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( this . lastSafariSelection && ! new RegExp ( 'mceStartTyping|mceEndTyping|mceBeginUndoLevel|mceEndUndoLevel|mceAddUndoLevel' , 'gi' ) . test ( command ) ) {
this . selection . moveToBookmark ( this . lastSafariSelection ) ;
tinyMCE . selectedElement = this . lastSafariSelectedElement ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Mozilla issue
if ( ! tinyMCE . isMSIE && ! this . useCSS ) {
this . _setUseCSS ( false ) ;
this . useCSS = true ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
//debug("command: " + command + ", user_interface: " + user_interface + ", value: " + value);
this . contentDocument = doc ; // <-- Strange, unless this is applied Mozilla 1.3 breaks
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . execCommandCallback ( this , 'execcommand_callback' , 'execCommand' , this . editorId , this . getBody ( ) , command , user _interface , value ) )
return ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Fix align on images
if ( focusElm && focusElm . nodeName == "IMG" ) {
var align = focusElm . getAttribute ( 'align' ) ;
var img = command == "JustifyCenter" ? focusElm . cloneNode ( false ) : focusElm ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
switch ( command ) {
case "JustifyLeft" :
if ( align == 'left' )
img . removeAttribute ( 'align' ) ;
else
img . setAttribute ( 'align' , 'left' ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Remove the div
var div = focusElm . parentNode ;
if ( div && div . nodeName == "DIV" && div . childNodes . length == 1 && div . parentNode )
div . parentNode . replaceChild ( img , div ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
this . selection . selectNode ( img ) ;
this . repaint ( ) ;
tinyMCE . triggerNodeChange ( ) ;
return ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
case "JustifyCenter" :
img . removeAttribute ( 'align' ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Is centered
var div = tinyMCE . getParentElement ( focusElm , "div" ) ;
if ( div && div . style . textAlign == "center" ) {
// Remove div
if ( div . nodeName == "DIV" && div . childNodes . length == 1 && div . parentNode )
div . parentNode . replaceChild ( img , div ) ;
} else {
// Add div
var div = this . getDoc ( ) . createElement ( "div" ) ;
div . style . textAlign = 'center' ;
div . appendChild ( img ) ;
focusElm . parentNode . replaceChild ( div , focusElm ) ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
this . selection . selectNode ( img ) ;
this . repaint ( ) ;
tinyMCE . triggerNodeChange ( ) ;
return ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
case "JustifyRight" :
if ( align == 'right' )
img . removeAttribute ( 'align' ) ;
else
img . setAttribute ( 'align' , 'right' ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Remove the div
var div = focusElm . parentNode ;
if ( div && div . nodeName == "DIV" && div . childNodes . length == 1 && div . parentNode )
div . parentNode . replaceChild ( img , div ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
this . selection . selectNode ( img ) ;
this . repaint ( ) ;
tinyMCE . triggerNodeChange ( ) ;
return ;
}
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . settings [ 'force_br_newlines' ] ) {
var alignValue = "" ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( doc . selection . type != "Control" ) {
switch ( command ) {
case "JustifyLeft" :
alignValue = "left" ;
break ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
case "JustifyCenter" :
alignValue = "center" ;
break ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
case "JustifyFull" :
alignValue = "justify" ;
break ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
case "JustifyRight" :
alignValue = "right" ;
break ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( alignValue != "" ) {
var rng = doc . selection . createRange ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( ( divElm = tinyMCE . getParentElement ( rng . parentElement ( ) , "div" ) ) != null )
divElm . setAttribute ( "align" , alignValue ) ;
else if ( rng . pasteHTML && rng . htmlText . length > 0 )
rng . pasteHTML ( '<div align="' + alignValue + '">' + rng . htmlText + "</div>" ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
tinyMCE . triggerNodeChange ( ) ;
return ;
}
}
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
switch ( command ) {
case "mceRepaint" :
this . repaint ( ) ;
return true ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
case "InsertUnorderedList" :
case "InsertOrderedList" :
var tag = ( command == "InsertUnorderedList" ) ? "ul" : "ol" ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . isSafari )
this . execCommand ( "mceInsertContent" , false , "<" + tag + "><li> </li><" + tag + ">" ) ;
else
this . getDoc ( ) . execCommand ( command , user _interface , value ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
tinyMCE . triggerNodeChange ( ) ;
break ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
case "Strikethrough" :
if ( tinyMCE . isSafari )
this . execCommand ( "mceInsertContent" , false , "<strike>" + this . selection . getSelectedHTML ( ) + "</strike>" ) ;
else
this . getDoc ( ) . execCommand ( command , user _interface , value ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
tinyMCE . triggerNodeChange ( ) ;
break ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
case "mceSelectNode" :
this . selection . selectNode ( value ) ;
tinyMCE . triggerNodeChange ( ) ;
tinyMCE . selectedNode = value ;
break ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
case "FormatBlock" :
if ( value == null || value == "" ) {
var elm = tinyMCE . getParentElement ( this . getFocusElement ( ) , "p,div,h1,h2,h3,h4,h5,h6,pre,address" ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( elm )
this . execCommand ( "mceRemoveNode" , false , elm ) ;
} else {
if ( value == '<div>' && tinyMCE . isGecko )
value = 'div' ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
this . getDoc ( ) . execCommand ( "FormatBlock" , false , value ) ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
tinyMCE . triggerNodeChange ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
break ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
case "mceRemoveNode" :
if ( ! value )
value = tinyMCE . getParentElement ( this . getFocusElement ( ) ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . isMSIE ) {
value . outerHTML = value . innerHTML ;
} else {
var rng = value . ownerDocument . createRange ( ) ;
rng . setStartBefore ( value ) ;
rng . setEndAfter ( value ) ;
rng . deleteContents ( ) ;
rng . insertNode ( rng . createContextualFragment ( value . innerHTML ) ) ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
tinyMCE . triggerNodeChange ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
break ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
case "mceSelectNodeDepth" :
var parentNode = this . getFocusElement ( ) ;
for ( var i = 0 ; parentNode ; i ++ ) {
if ( parentNode . nodeName . toLowerCase ( ) == "body" )
break ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( parentNode . nodeName . toLowerCase ( ) == "#text" ) {
i -- ;
parentNode = parentNode . parentNode ;
continue ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( i == value ) {
this . selection . selectNode ( parentNode , false ) ;
tinyMCE . triggerNodeChange ( ) ;
tinyMCE . selectedNode = parentNode ;
return ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
parentNode = parentNode . parentNode ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
break ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
case "SetStyleInfo" :
var rng = this . getRng ( ) ;
var sel = this . getSel ( ) ;
var scmd = value [ 'command' ] ;
var sname = value [ 'name' ] ;
var svalue = value [ 'value' ] == null ? '' : value [ 'value' ] ;
//var svalue = value['value'] == null ? '' : value['value'];
var wrapper = value [ 'wrapper' ] ? value [ 'wrapper' ] : "span" ;
var parentElm = null ;
var invalidRe = new RegExp ( "^BODY|HTML$" , "g" ) ;
var invalidParentsRe = tinyMCE . settings [ 'merge_styles_invalid_parents' ] != '' ? new RegExp ( tinyMCE . settings [ 'merge_styles_invalid_parents' ] , "gi" ) : null ;
// Whole element selected check
if ( tinyMCE . isMSIE ) {
// Control range
if ( rng . item )
parentElm = rng . item ( 0 ) ;
else {
var pelm = rng . parentElement ( ) ;
var prng = doc . selection . createRange ( ) ;
prng . moveToElementText ( pelm ) ;
if ( rng . htmlText == prng . htmlText || rng . boundingWidth == 0 ) {
if ( invalidParentsRe == null || ! invalidParentsRe . test ( pelm . nodeName ) )
parentElm = pelm ;
}
}
} else {
var felm = this . getFocusElement ( ) ;
if ( sel . isCollapsed || ( new RegExp ( 'td|tr|tbody|table' , 'gi' ) . test ( felm . nodeName ) && sel . anchorNode == felm . parentNode ) )
parentElm = felm ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Whole element selected
if ( parentElm && ! invalidRe . test ( parentElm . nodeName ) ) {
if ( scmd == "setstyle" )
tinyMCE . setStyleAttrib ( parentElm , sname , svalue ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( scmd == "setattrib" )
tinyMCE . setAttrib ( parentElm , sname , svalue ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( scmd == "removeformat" ) {
parentElm . style . cssText = '' ;
tinyMCE . setAttrib ( parentElm , 'class' , '' ) ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Remove style/attribs from all children
var ch = tinyMCE . getNodeTree ( parentElm , new Array ( ) , 1 ) ;
for ( var z = 0 ; z < ch . length ; z ++ ) {
if ( ch [ z ] == parentElm )
continue ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( scmd == "setstyle" )
tinyMCE . setStyleAttrib ( ch [ z ] , sname , '' ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( scmd == "setattrib" )
tinyMCE . setAttrib ( ch [ z ] , sname , '' ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( scmd == "removeformat" ) {
ch [ z ] . style . cssText = '' ;
tinyMCE . setAttrib ( ch [ z ] , 'class' , '' ) ;
}
}
} else {
this . _setUseCSS ( false ) ; // Bug in FF when running in fullscreen
doc . execCommand ( "FontName" , false , "#mce_temp_font#" ) ;
var elementArray = tinyMCE . getElementsByAttributeValue ( this . getBody ( ) , "font" , "face" , "#mce_temp_font#" ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Change them all
for ( var x = 0 ; x < elementArray . length ; x ++ ) {
elm = elementArray [ x ] ;
if ( elm ) {
var spanElm = doc . createElement ( wrapper ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( scmd == "setstyle" )
tinyMCE . setStyleAttrib ( spanElm , sname , svalue ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( scmd == "setattrib" )
tinyMCE . setAttrib ( spanElm , sname , svalue ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( scmd == "removeformat" ) {
spanElm . style . cssText = '' ;
tinyMCE . setAttrib ( spanElm , 'class' , '' ) ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( elm . hasChildNodes ( ) ) {
for ( var i = 0 ; i < elm . childNodes . length ; i ++ )
spanElm . appendChild ( elm . childNodes [ i ] . cloneNode ( true ) ) ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
spanElm . setAttribute ( "mce_new" , "true" ) ;
elm . parentNode . replaceChild ( spanElm , elm ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Remove style/attribs from all children
var ch = tinyMCE . getNodeTree ( spanElm , new Array ( ) , 1 ) ;
for ( var z = 0 ; z < ch . length ; z ++ ) {
if ( ch [ z ] == spanElm )
continue ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( scmd == "setstyle" )
tinyMCE . setStyleAttrib ( ch [ z ] , sname , '' ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( scmd == "setattrib" )
tinyMCE . setAttrib ( ch [ z ] , sname , '' ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( scmd == "removeformat" ) {
ch [ z ] . style . cssText = '' ;
tinyMCE . setAttrib ( ch [ z ] , 'class' , '' ) ;
}
}
}
}
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Cleaup wrappers
var nodes = doc . getElementsByTagName ( wrapper ) ;
for ( var i = nodes . length - 1 ; i >= 0 ; i -- ) {
var elm = nodes [ i ] ;
var isNew = tinyMCE . getAttrib ( elm , "mce_new" ) == "true" ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
elm . removeAttribute ( "mce_new" ) ;
// Is only child a element
if ( elm . childNodes && elm . childNodes . length == 1 && elm . childNodes [ 0 ] . nodeType == 1 ) {
//tinyMCE.debug("merge1" + isNew);
this . _mergeElements ( scmd , elm , elm . childNodes [ 0 ] , isNew ) ;
continue ;
}
// Is I the only child
if ( elm . parentNode . childNodes . length == 1 && ! invalidRe . test ( elm . nodeName ) && ! invalidRe . test ( elm . parentNode . nodeName ) ) {
//tinyMCE.debug("merge2" + isNew + "," + elm.nodeName + "," + elm.parentNode.nodeName);
if ( invalidParentsRe == null || ! invalidParentsRe . test ( elm . parentNode . nodeName ) )
this . _mergeElements ( scmd , elm . parentNode , elm , false ) ;
}
}
// Remove empty wrappers
var nodes = doc . getElementsByTagName ( wrapper ) ;
for ( var i = nodes . length - 1 ; i >= 0 ; i -- ) {
var elm = nodes [ i ] ;
var isEmpty = true ;
// Check if it has any attribs
var tmp = doc . createElement ( "body" ) ;
tmp . appendChild ( elm . cloneNode ( false ) ) ;
// Is empty span, remove it
tmp . innerHTML = tmp . innerHTML . replace ( new RegExp ( 'style=""|class=""' , 'gi' ) , '' ) ;
//tinyMCE.debug(tmp.innerHTML);
if ( new RegExp ( '<span>' , 'gi' ) . test ( tmp . innerHTML ) ) {
for ( var x = 0 ; x < elm . childNodes . length ; x ++ ) {
if ( elm . parentNode != null )
elm . parentNode . insertBefore ( elm . childNodes [ x ] . cloneNode ( true ) , elm ) ;
}
elm . parentNode . removeChild ( elm ) ;
}
}
// Re add the visual aids
if ( scmd == "removeformat" )
tinyMCE . handleVisualAid ( this . getBody ( ) , true , this . visualAid , this ) ;
tinyMCE . triggerNodeChange ( ) ;
2005-12-04 22:04:25 -05:00
break ;
2006-03-30 02:50:33 -05:00
case "FontName" :
if ( value == null ) {
var s = this . getSel ( ) ;
// Find font and select it
if ( tinyMCE . isGecko && s . isCollapsed ) {
var f = tinyMCE . getParentElement ( this . getFocusElement ( ) , "font" ) ;
if ( f != null )
this . selection . selectNode ( f , false ) ;
}
// Remove format
this . getDoc ( ) . execCommand ( "RemoveFormat" , false , null ) ;
// Collapse range if font was found
if ( f != null && tinyMCE . isGecko ) {
var r = this . getRng ( ) . cloneRange ( ) ;
r . collapse ( true ) ;
s . removeAllRanges ( ) ;
s . addRange ( r ) ;
}
} else
this . getDoc ( ) . execCommand ( 'FontName' , false , value ) ;
if ( tinyMCE . isGecko )
window . setTimeout ( 'tinyMCE.triggerNodeChange(false);' , 1 ) ;
return ;
case "FontSize" :
this . getDoc ( ) . execCommand ( 'FontSize' , false , value ) ;
if ( tinyMCE . isGecko )
window . setTimeout ( 'tinyMCE.triggerNodeChange(false);' , 1 ) ;
return ;
case "forecolor" :
this . getDoc ( ) . execCommand ( 'forecolor' , false , value ) ;
2005-12-04 22:04:25 -05:00
break ;
2006-03-30 02:50:33 -05:00
case "HiliteColor" :
if ( tinyMCE . isGecko ) {
this . _setUseCSS ( true ) ;
this . getDoc ( ) . execCommand ( 'hilitecolor' , false , value ) ;
this . _setUseCSS ( false ) ;
} else
this . getDoc ( ) . execCommand ( 'BackColor' , false , value ) ;
break ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
case "Cut" :
case "Copy" :
case "Paste" :
var cmdFailed = false ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Try executing command
eval ( 'try {this.getDoc().execCommand(command, user_interface, value);} catch (e) {cmdFailed = true;}' ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . isOpera && cmdFailed )
alert ( 'Currently not supported by your browser, use keyboard shortcuts instead.' ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Alert error in gecko if command failed
if ( tinyMCE . isGecko && cmdFailed ) {
// Confirm more info
if ( confirm ( tinyMCE . entityDecode ( tinyMCE . getLang ( 'lang_clipboard_msg' ) ) ) )
window . open ( 'http://www.mozilla.org/editor/midasdemo/securityprefs.html' , 'mceExternal' ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return ;
} else
tinyMCE . triggerNodeChange ( ) ;
break ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
case "mceSetContent" :
if ( ! value )
value = "" ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Call custom cleanup code
value = tinyMCE . storeAwayURLs ( value ) ;
value = tinyMCE . _customCleanup ( this , "insert_to_editor" , value ) ;
tinyMCE . _setHTML ( doc , value ) ;
tinyMCE . setInnerHTML ( doc . body , tinyMCE . _cleanupHTML ( this , doc , tinyMCE . settings , doc . body ) ) ;
tinyMCE . convertAllRelativeURLs ( doc . body ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// When editing always use fonts internaly
if ( tinyMCE . getParam ( "convert_fonts_to_spans" ) )
tinyMCE . convertSpansToFonts ( doc ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
tinyMCE . handleVisualAid ( doc . body , true , this . visualAid , this ) ;
tinyMCE . _setEventsEnabled ( doc . body , false ) ;
return true ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
case "mceCleanup" :
var b = this . selection . getBookmark ( ) ;
tinyMCE . _setHTML ( this . contentDocument , this . getBody ( ) . innerHTML ) ;
tinyMCE . setInnerHTML ( this . getBody ( ) , tinyMCE . _cleanupHTML ( this , this . contentDocument , this . settings , this . getBody ( ) , this . visualAid ) ) ;
tinyMCE . convertAllRelativeURLs ( doc . body ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// When editing always use fonts internaly
if ( tinyMCE . getParam ( "convert_fonts_to_spans" ) )
tinyMCE . convertSpansToFonts ( doc ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
tinyMCE . handleVisualAid ( this . getBody ( ) , true , this . visualAid , this ) ;
tinyMCE . _setEventsEnabled ( this . getBody ( ) , false ) ;
this . repaint ( ) ;
this . selection . moveToBookmark ( b ) ;
tinyMCE . triggerNodeChange ( ) ;
break ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
case "mceReplaceContent" :
// Force empty string
if ( ! value )
value = '' ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
this . getWin ( ) . focus ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
var selectedText = "" ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . isMSIE ) {
var rng = doc . selection . createRange ( ) ;
selectedText = rng . text ;
} else
selectedText = this . getSel ( ) . toString ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( selectedText . length > 0 ) {
value = tinyMCE . replaceVar ( value , "selection" , selectedText ) ;
tinyMCE . execCommand ( 'mceInsertContent' , false , value ) ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
tinyMCE . triggerNodeChange ( ) ;
break ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
case "mceSetAttribute" :
if ( typeof ( value ) == 'object' ) {
var targetElms = ( typeof ( value [ 'targets' ] ) == "undefined" ) ? "p,img,span,div,td,h1,h2,h3,h4,h5,h6,pre,address" : value [ 'targets' ] ;
var targetNode = tinyMCE . getParentElement ( this . getFocusElement ( ) , targetElms ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( targetNode ) {
targetNode . setAttribute ( value [ 'name' ] , value [ 'value' ] ) ;
tinyMCE . triggerNodeChange ( ) ;
}
}
break ;
case "mceSetCSSClass" :
this . execCommand ( "SetStyleInfo" , false , { command : "setattrib" , name : "class" , value : value } ) ;
break ;
case "mceInsertRawHTML" :
var key = 'tiny_mce_marker' ;
this . execCommand ( 'mceBeginUndoLevel' ) ;
// Insert marker key
this . execCommand ( 'mceInsertContent' , false , key ) ;
// Store away scroll pos
var scrollX = this . getDoc ( ) . body . scrollLeft + this . getDoc ( ) . documentElement . scrollLeft ;
var scrollY = this . getDoc ( ) . body . scrollTop + this . getDoc ( ) . documentElement . scrollTop ;
// Find marker and replace with RAW HTML
var html = this . getBody ( ) . innerHTML ;
if ( ( pos = html . indexOf ( key ) ) != - 1 )
tinyMCE . setInnerHTML ( this . getBody ( ) , html . substring ( 0 , pos ) + value + html . substring ( pos + key . length ) ) ;
// Restore scoll pos
this . contentWindow . scrollTo ( scrollX , scrollY ) ;
this . execCommand ( 'mceEndUndoLevel' ) ;
2005-12-04 22:04:25 -05:00
break ;
2006-03-30 02:50:33 -05:00
case "mceInsertContent" :
// Force empty string
if ( ! value )
value = '' ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
var insertHTMLFailed = false ;
this . getWin ( ) . focus ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . isGecko || tinyMCE . isOpera ) {
try {
// Is plain text or HTML, &, etc will be encoded wrong in FF
if ( value . indexOf ( '<' ) == - 1 && ! value . match ( /(&| |<|>)/g ) ) {
var r = this . getRng ( ) ;
var n = this . getDoc ( ) . createTextNode ( tinyMCE . entityDecode ( value ) ) ;
var s = this . getSel ( ) ;
var r2 = r . cloneRange ( ) ;
// Insert text at cursor position
s . removeAllRanges ( ) ;
r . deleteContents ( ) ;
r . insertNode ( n ) ;
// Move the cursor to the end of text
r2 . selectNode ( n ) ;
r2 . collapse ( false ) ;
s . removeAllRanges ( ) ;
s . addRange ( r2 ) ;
} else {
value = tinyMCE . fixGeckoBaseHREFBug ( 1 , this . getDoc ( ) , value ) ;
this . getDoc ( ) . execCommand ( 'inserthtml' , false , value ) ;
tinyMCE . fixGeckoBaseHREFBug ( 2 , this . getDoc ( ) , value ) ;
}
} catch ( ex ) {
insertHTMLFailed = true ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( ! insertHTMLFailed ) {
tinyMCE . triggerNodeChange ( ) ;
return ;
}
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Ugly hack in Opera due to non working "inserthtml"
if ( tinyMCE . isOpera && insertHTMLFailed ) {
this . getDoc ( ) . execCommand ( "insertimage" , false , tinyMCE . uniqueURL ) ;
var ar = tinyMCE . getElementsByAttributeValue ( this . getBody ( ) , "img" , "src" , tinyMCE . uniqueURL ) ;
ar [ 0 ] . outerHTML = value ;
return ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( ! tinyMCE . isMSIE ) {
var isHTML = value . indexOf ( '<' ) != - 1 ;
var sel = this . getSel ( ) ;
var rng = this . getRng ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( isHTML ) {
if ( tinyMCE . isSafari ) {
var tmpRng = this . getDoc ( ) . createRange ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
tmpRng . setStart ( this . getBody ( ) , 0 ) ;
tmpRng . setEnd ( this . getBody ( ) , 0 ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
value = tmpRng . createContextualFragment ( value ) ;
} else
value = rng . createContextualFragment ( value ) ;
} else {
// Setup text node
var el = document . createElement ( "div" ) ;
el . innerHTML = value ;
value = el . firstChild . nodeValue ;
value = doc . createTextNode ( value ) ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Insert plain text in Safari
if ( tinyMCE . isSafari && ! isHTML ) {
this . execCommand ( 'InsertText' , false , value . nodeValue ) ;
tinyMCE . triggerNodeChange ( ) ;
return true ;
} else if ( tinyMCE . isSafari && isHTML ) {
rng . deleteContents ( ) ;
rng . insertNode ( value ) ;
tinyMCE . triggerNodeChange ( ) ;
return true ;
}
rng . deleteContents ( ) ;
// If target node is text do special treatment, (Mozilla 1.3 fix)
if ( rng . startContainer . nodeType == 3 ) {
var node = rng . startContainer . splitText ( rng . startOffset ) ;
node . parentNode . insertBefore ( value , node ) ;
} else
rng . insertNode ( value ) ;
if ( ! isHTML ) {
// Removes weird selection trails
sel . selectAllChildren ( doc . body ) ;
sel . removeAllRanges ( ) ;
// Move cursor to end of content
var rng = doc . createRange ( ) ;
rng . selectNode ( value ) ;
rng . collapse ( false ) ;
sel . addRange ( rng ) ;
} else
rng . collapse ( false ) ;
tinyMCE . fixGeckoBaseHREFBug ( 2 , this . getDoc ( ) , value ) ;
} else {
var rng = doc . selection . createRange ( ) ;
var c = value . indexOf ( '<!--' ) != - 1 ;
// Fix comment bug, add tag before comments
if ( c )
value = tinyMCE . uniqueTag + value ;
if ( rng . item )
rng . item ( 0 ) . outerHTML = value ;
else
rng . pasteHTML ( value ) ;
// Remove unique tag
if ( c ) {
var e = this . getDoc ( ) . getElementById ( 'mceTMPElement' ) ;
e . parentNode . removeChild ( e ) ;
}
}
tinyMCE . triggerNodeChange ( ) ;
break ;
case "mceStartTyping" :
if ( tinyMCE . settings [ 'custom_undo_redo' ] && this . undoRedo . typingUndoIndex == - 1 ) {
this . undoRedo . typingUndoIndex = this . undoRedo . undoIndex ;
this . execCommand ( 'mceAddUndoLevel' ) ;
//tinyMCE.debug("mceStartTyping");
}
break ;
case "mceEndTyping" :
if ( tinyMCE . settings [ 'custom_undo_redo' ] && this . undoRedo . typingUndoIndex != - 1 ) {
this . execCommand ( 'mceAddUndoLevel' ) ;
this . undoRedo . typingUndoIndex = - 1 ;
//tinyMCE.debug("mceEndTyping");
}
break ;
case "mceBeginUndoLevel" :
this . undoRedoLevel = false ;
break ;
case "mceEndUndoLevel" :
this . undoRedoLevel = true ;
this . execCommand ( 'mceAddUndoLevel' ) ;
break ;
case "mceAddUndoLevel" :
if ( tinyMCE . settings [ 'custom_undo_redo' ] && this . undoRedoLevel ) {
if ( this . undoRedo . add ( ) )
tinyMCE . triggerNodeChange ( false ) ;
}
break ;
case "Undo" :
if ( tinyMCE . settings [ 'custom_undo_redo' ] ) {
tinyMCE . execCommand ( "mceEndTyping" ) ;
this . undoRedo . undo ( ) ;
tinyMCE . triggerNodeChange ( ) ;
} else
this . getDoc ( ) . execCommand ( command , user _interface , value ) ;
break ;
case "Redo" :
if ( tinyMCE . settings [ 'custom_undo_redo' ] ) {
tinyMCE . execCommand ( "mceEndTyping" ) ;
this . undoRedo . redo ( ) ;
tinyMCE . triggerNodeChange ( ) ;
} else
this . getDoc ( ) . execCommand ( command , user _interface , value ) ;
break ;
case "mceToggleVisualAid" :
this . visualAid = ! this . visualAid ;
tinyMCE . handleVisualAid ( this . getBody ( ) , true , this . visualAid , this ) ;
tinyMCE . triggerNodeChange ( ) ;
break ;
case "Indent" :
this . getDoc ( ) . execCommand ( command , user _interface , value ) ;
tinyMCE . triggerNodeChange ( ) ;
if ( tinyMCE . isMSIE ) {
var n = tinyMCE . getParentElement ( this . getFocusElement ( ) , "blockquote" ) ;
do {
if ( n && n . nodeName == "BLOCKQUOTE" ) {
n . removeAttribute ( "dir" ) ;
n . removeAttribute ( "style" ) ;
}
} while ( n != null && ( n = n . parentNode ) != null ) ;
}
break ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
case "removeformat" :
var text = this . selection . getSelectedText ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . isOpera ) {
this . getDoc ( ) . execCommand ( "RemoveFormat" , false , null ) ;
return ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . isMSIE ) {
try {
var rng = doc . selection . createRange ( ) ;
rng . execCommand ( "RemoveFormat" , false , null ) ;
} catch ( e ) {
// Do nothing
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
this . execCommand ( "SetStyleInfo" , false , { command : "removeformat" } ) ;
} else {
this . getDoc ( ) . execCommand ( command , user _interface , value ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
this . execCommand ( "SetStyleInfo" , false , { command : "removeformat" } ) ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Remove class
if ( text . length == 0 )
this . execCommand ( "mceSetCSSClass" , false , "" ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
tinyMCE . triggerNodeChange ( ) ;
break ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
default :
this . getDoc ( ) . execCommand ( command , user _interface , value ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . isGecko )
window . setTimeout ( 'tinyMCE.triggerNodeChange(false);' , 1 ) ;
else
tinyMCE . triggerNodeChange ( ) ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Add undo level after modification
if ( command != "mceAddUndoLevel" && command != "Undo" && command != "Redo" && command != "mceStartTyping" && command != "mceEndTyping" )
tinyMCE . execCommand ( "mceAddUndoLevel" ) ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
queryCommandValue : function ( c ) {
try {
return this . getDoc ( ) . queryCommandValue ( c ) ;
} catch ( e ) {
return null ;
}
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
queryCommandState : function ( c ) {
return this . getDoc ( ) . queryCommandState ( c ) ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
_onAdd : function ( replace _element , form _element _name , target _document ) {
var hc , th , to , editorTemplate ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
th = this . settings [ 'theme' ] ;
to = tinyMCE . themes [ th ] ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
var targetDoc = target _document ? target _document : document ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
this . targetDoc = targetDoc ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
tinyMCE . themeURL = tinyMCE . baseURL + "/themes/" + this . settings [ 'theme' ] ;
this . settings [ 'themeurl' ] = tinyMCE . themeURL ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( ! replace _element ) {
alert ( "Error: Could not find the target element." ) ;
return false ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
if ( to . getEditorTemplate )
editorTemplate = to . getEditorTemplate ( this . settings , this . editorId ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
var deltaWidth = editorTemplate [ 'delta_width' ] ? editorTemplate [ 'delta_width' ] : 0 ;
var deltaHeight = editorTemplate [ 'delta_height' ] ? editorTemplate [ 'delta_height' ] : 0 ;
var html = '<span id="' + this . editorId + '_parent" class="mceEditorContainer">' + editorTemplate [ 'html' ] ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
html = tinyMCE . replaceVar ( html , "editor_id" , this . editorId ) ;
this . settings [ 'default_document' ] = tinyMCE . baseURL + "/blank.htm" ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
this . settings [ 'old_width' ] = this . settings [ 'width' ] ;
this . settings [ 'old_height' ] = this . settings [ 'height' ] ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Set default width, height
if ( this . settings [ 'width' ] == - 1 )
this . settings [ 'width' ] = replace _element . offsetWidth ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( this . settings [ 'height' ] == - 1 )
this . settings [ 'height' ] = replace _element . offsetHeight ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Try the style width
if ( this . settings [ 'width' ] == 0 )
this . settings [ 'width' ] = replace _element . style . width ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Try the style height
if ( this . settings [ 'height' ] == 0 )
this . settings [ 'height' ] = replace _element . style . height ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// If no width/height then default to 320x240, better than nothing
if ( this . settings [ 'width' ] == 0 )
this . settings [ 'width' ] = 320 ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( this . settings [ 'height' ] == 0 )
this . settings [ 'height' ] = 240 ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
this . settings [ 'area_width' ] = parseInt ( this . settings [ 'width' ] ) ;
this . settings [ 'area_height' ] = parseInt ( this . settings [ 'height' ] ) ;
this . settings [ 'area_width' ] += deltaWidth ;
this . settings [ 'area_height' ] += deltaHeight ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Special % handling
if ( ( "" + this . settings [ 'width' ] ) . indexOf ( '%' ) != - 1 )
this . settings [ 'area_width' ] = "100%" ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( ( "" + this . settings [ 'height' ] ) . indexOf ( '%' ) != - 1 )
this . settings [ 'area_height' ] = "100%" ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( ( "" + replace _element . style . width ) . indexOf ( '%' ) != - 1 ) {
this . settings [ 'width' ] = replace _element . style . width ;
this . settings [ 'area_width' ] = "100%" ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( ( "" + replace _element . style . height ) . indexOf ( '%' ) != - 1 ) {
this . settings [ 'height' ] = replace _element . style . height ;
this . settings [ 'area_height' ] = "100%" ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
html = tinyMCE . applyTemplate ( html ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
this . settings [ 'width' ] = this . settings [ 'old_width' ] ;
this . settings [ 'height' ] = this . settings [ 'old_height' ] ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
this . visualAid = this . settings [ 'visual' ] ;
this . formTargetElementId = form _element _name ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Get replace_element contents
if ( replace _element . nodeName == "TEXTAREA" || replace _element . nodeName == "INPUT" )
this . startContent = replace _element . value ;
else
this . startContent = replace _element . innerHTML ;
// If not text area or input
if ( replace _element . nodeName != "TEXTAREA" && replace _element . nodeName != "INPUT" ) {
this . oldTargetElement = replace _element ;
// Debug mode
if ( tinyMCE . settings [ 'debug' ] ) {
hc = '<textarea wrap="off" id="' + form _element _name + '" name="' + form _element _name + '" cols="100" rows="15"></textarea>' ;
} else {
hc = '<input type="hidden" type="text" id="' + form _element _name + '" name="' + form _element _name + '" />' ;
this . oldTargetElement . style . display = "none" ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
html += '</span>' ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . isGecko )
html = hc + html ;
else
html += hc ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Output HTML and set editable
if ( tinyMCE . isGecko ) {
var rng = replace _element . ownerDocument . createRange ( ) ;
rng . setStartBefore ( replace _element ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
var fragment = rng . createContextualFragment ( html ) ;
tinyMCE . insertAfter ( fragment , replace _element ) ;
} else
replace _element . insertAdjacentHTML ( "beforeBegin" , html ) ;
} else {
html += '</span>' ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Just hide the textarea element
this . oldTargetElement = replace _element ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( ! tinyMCE . settings [ 'debug' ] )
this . oldTargetElement . style . display = "none" ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Output HTML and set editable
if ( tinyMCE . isGecko ) {
var rng = replace _element . ownerDocument . createRange ( ) ;
rng . setStartBefore ( replace _element ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
var fragment = rng . createContextualFragment ( html ) ;
tinyMCE . insertAfter ( fragment , replace _element ) ;
} else
replace _element . insertAdjacentHTML ( "beforeBegin" , html ) ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Setup iframe
var dynamicIFrame = false ;
var tElm = targetDoc . getElementById ( this . editorId ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( ! tinyMCE . isMSIE ) {
if ( tElm && tElm . nodeName == "SPAN" ) {
tElm = tinyMCE . _createIFrame ( tElm , targetDoc ) ;
dynamicIFrame = true ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
this . targetElement = tElm ;
this . iframeElement = tElm ;
this . contentDocument = tElm . contentDocument ;
this . contentWindow = tElm . contentWindow ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
//this.getDoc().designMode = "on";
} else {
if ( tElm && tElm . nodeName == "SPAN" )
tElm = tinyMCE . _createIFrame ( tElm , targetDoc , targetDoc . parentWindow ) ;
else
tElm = targetDoc . frames [ this . editorId ] ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
this . targetElement = tElm ;
this . iframeElement = targetDoc . getElementById ( this . editorId ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . isOpera ) {
this . contentDocument = this . iframeElement . contentDocument ;
this . contentWindow = this . iframeElement . contentWindow ;
dynamicIFrame = true ;
} else {
this . contentDocument = tElm . window . document ;
this . contentWindow = tElm . window ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
this . getDoc ( ) . designMode = "on" ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Setup base HTML
var doc = this . contentDocument ;
if ( dynamicIFrame ) {
var html = tinyMCE . getParam ( 'doctype' ) + '<html><head xmlns="http://www.w3.org/1999/xhtml"><base href="' + tinyMCE . settings [ 'base_href' ] + '" /><title>blank_page</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head><body class="mceContentBody"></body></html>' ;
try {
if ( ! this . isHidden ( ) )
this . getDoc ( ) . designMode = "on" ;
doc . open ( ) ;
doc . write ( html ) ;
doc . close ( ) ;
} catch ( e ) {
// Failed Mozilla 1.3
this . getDoc ( ) . location . href = tinyMCE . baseURL + "/blank.htm" ;
}
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// This timeout is needed in MSIE 5.5 for some odd reason
// it seems that the document.frames isn't initialized yet?
if ( tinyMCE . isMSIE )
window . setTimeout ( "tinyMCE.addEventHandlers(tinyMCE.instances[\"" + this . editorId + "\"]);" , 1 ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
tinyMCE . setupContent ( this . editorId , true ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return true ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
setBaseHREF : function ( u ) {
var h , b , d , nl ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
d = this . getDoc ( ) ;
nl = d . getElementsByTagName ( "base" ) ;
b = nl . length > 0 ? nl [ 0 ] : null ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( ! b ) {
nl = d . getElementsByTagName ( "head" ) ;
h = nl . length > 0 ? nl [ 0 ] : null ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
b = d . createElement ( "base" ) ;
b . setAttribute ( 'href' , u ) ;
h . appendChild ( b ) ;
} else {
if ( u == "" || u == null )
b . parentNode . removeChild ( b ) ;
else
b . setAttribute ( 'href' , u ) ;
}
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
getFocusElement : function ( ) {
return this . selection . getFocusElement ( ) ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
getSel : function ( ) {
return this . selection . getSel ( ) ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
getRng : function ( ) {
return this . selection . getRng ( ) ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
triggerSave : function ( skip _cleanup , skip _callback ) {
this . switchSettings ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
tinyMCE . settings [ 'preformatted' ] = false ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Default to false
if ( typeof ( skip _cleanup ) == "undefined" )
skip _cleanup = false ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Default to false
if ( typeof ( skip _callback ) == "undefined" )
skip _callback = false ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
tinyMCE . _setHTML ( this . getDoc ( ) , this . getBody ( ) . innerHTML ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Remove visual aids when cleanup is disabled
if ( this . settings [ 'cleanup' ] == false ) {
tinyMCE . handleVisualAid ( this . getBody ( ) , true , false , this ) ;
tinyMCE . _setEventsEnabled ( this . getBody ( ) , true ) ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
tinyMCE . _customCleanup ( this , "submit_content_dom" , this . contentWindow . document . body ) ;
var htm = skip _cleanup ? this . getBody ( ) . innerHTML : tinyMCE . _cleanupHTML ( this , this . getDoc ( ) , this . settings , this . getBody ( ) , tinyMCE . visualAid , true , true ) ;
htm = tinyMCE . _customCleanup ( this , "submit_content" , htm ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( ! skip _callback && tinyMCE . settings [ 'save_callback' ] != "" )
var content = eval ( tinyMCE . settings [ 'save_callback' ] + "(this.formTargetElementId,htm,this.getBody());" ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Use callback content if available
if ( ( typeof ( content ) != "undefined" ) && content != null )
htm = content ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Replace some weird entities (Bug: #1056343)
htm = tinyMCE . regexpReplace ( htm , "(" , "(" , "gi" ) ;
htm = tinyMCE . regexpReplace ( htm , ")" , ")" , "gi" ) ;
htm = tinyMCE . regexpReplace ( htm , ";" , ";" , "gi" ) ;
htm = tinyMCE . regexpReplace ( htm , """ , """ , "gi" ) ;
htm = tinyMCE . regexpReplace ( htm , "^" , "^" , "gi" ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( this . formElement )
this . formElement . value = htm ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . isSafari && this . formElement )
this . formElement . innerText = htm ;
2005-12-04 22:04:25 -05:00
}
} ;
2006-03-30 02:50:33 -05:00
/* file:jscripts/tiny_mce/classes/TinyMCE_Cleanup.class.js */
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
TinyMCE _Engine . prototype . cleanupHTMLCode = function ( s ) {
s = s . replace ( /<p \/>/gi , '<p> </p>' ) ;
s = s . replace ( /<p>\s*<\/p>/gi , '<p> </p>' ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Open closed tags like <b/> to <b></b>
// tinyMCE.debug("f:" + s);
s = s . replace ( /<(h[1-6]|p|div|address|pre|form|table|li|ol|ul|td|b|font|em|strong|i|strike|u|span|a|ul|ol|li|blockquote)([a-z]*)([^\\|>]*?)\/>/gi , '<$1$2$3></$1$2>' ) ;
// tinyMCE.debug("e:" + s);
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Remove trailing space <b > to <b>
s = s . replace ( new RegExp ( '\\s+></' , 'gi' ) , '></' ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Close tags <img></img> to <img/>
s = s . replace ( /<(img|br|hr)(.*?)><\/(img|br|hr)>/gi , '<$1$2 />' ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Weird MSIE bug, <p><hr /></p> breaks runtime?
if ( tinyMCE . isMSIE )
s = s . replace ( /<p><hr \/><\/p>/gi , "<hr>" ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Convert relative anchors to absolute URLs ex: #something to file.htm#something
if ( tinyMCE . getParam ( 'convert_urls' ) )
s = s . replace ( new RegExp ( '(href=\"?)(\\s*?#)' , 'gi' ) , '$1' + tinyMCE . settings [ 'document_base_url' ] + "#" ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return s ;
2005-12-04 22:04:25 -05:00
} ;
2006-03-30 02:50:33 -05:00
TinyMCE _Engine . prototype . parseStyle = function ( str ) {
var ar = new Array ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( str == null )
return ar ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
var st = str . split ( ';' ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
tinyMCE . clearArray ( ar ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
for ( var i = 0 ; i < st . length ; i ++ ) {
if ( st [ i ] == '' )
continue ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
var re = new RegExp ( '^\\s*([^:]*):\\s*(.*)\\s*$' ) ;
var pa = st [ i ] . replace ( re , '$1||$2' ) . split ( '||' ) ;
//tinyMCE.debug(str, pa[0] + "=" + pa[1], st[i].replace(re, '$1||$2'));
if ( pa . length == 2 )
ar [ pa [ 0 ] . toLowerCase ( ) ] = pa [ 1 ] ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return ar ;
} ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
TinyMCE _Engine . prototype . compressStyle = function ( ar , pr , sf , res ) {
var box = new Array ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
box [ 0 ] = ar [ pr + '-top' + sf ] ;
box [ 1 ] = ar [ pr + '-left' + sf ] ;
box [ 2 ] = ar [ pr + '-right' + sf ] ;
box [ 3 ] = ar [ pr + '-bottom' + sf ] ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
for ( var i = 0 ; i < box . length ; i ++ ) {
if ( box [ i ] == null )
return ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
for ( var a = 0 ; a < box . length ; a ++ ) {
if ( box [ a ] != box [ i ] )
return ;
}
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
// They are all the same
ar [ res ] = box [ 0 ] ;
ar [ pr + '-top' + sf ] = null ;
ar [ pr + '-left' + sf ] = null ;
ar [ pr + '-right' + sf ] = null ;
ar [ pr + '-bottom' + sf ] = null ;
2005-12-04 22:04:25 -05:00
} ;
2006-03-30 02:50:33 -05:00
TinyMCE _Engine . prototype . serializeStyle = function ( ar ) {
var str = "" ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Compress box
tinyMCE . compressStyle ( ar , "border" , "" , "border" ) ;
tinyMCE . compressStyle ( ar , "border" , "-width" , "border-width" ) ;
tinyMCE . compressStyle ( ar , "border" , "-color" , "border-color" ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
for ( var key in ar ) {
var val = ar [ key ] ;
if ( typeof ( val ) == 'function' )
continue ;
if ( key . indexOf ( 'mso-' ) == 0 )
continue ;
if ( val != null && val != '' ) {
val = '' + val ; // Force string
// Fix style URL
val = val . replace ( new RegExp ( "url\\(\\'?([^\\']*)\\'?\\)" , 'gi' ) , "url('$1')" ) ;
// Convert URL
if ( val . indexOf ( 'url(' ) != - 1 && tinyMCE . getParam ( 'convert_urls' ) ) {
var m = new RegExp ( "url\\('(.*?)'\\)" ) . exec ( val ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( m . length > 1 )
val = "url('" + eval ( tinyMCE . getParam ( 'urlconverter_callback' ) + "(m[1], null, true);" ) + "')" ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Force HEX colors
if ( tinyMCE . getParam ( "force_hex_style_colors" ) )
val = tinyMCE . convertRGBToHex ( val , true ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( val != "url('')" )
str += key . toLowerCase ( ) + ": " + val + "; " ;
}
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( new RegExp ( '; $' ) . test ( str ) )
str = str . substring ( 0 , str . length - 2 ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return str ;
2005-12-04 22:04:25 -05:00
} ;
2006-03-30 02:50:33 -05:00
TinyMCE _Engine . prototype . convertRGBToHex = function ( s , k ) {
if ( s . toLowerCase ( ) . indexOf ( 'rgb' ) != - 1 ) {
var re = new RegExp ( "(.*?)rgb\\s*?\\(\\s*?([0-9]+).*?,\\s*?([0-9]+).*?,\\s*?([0-9]+).*?\\)(.*?)" , "gi" ) ;
var rgb = s . replace ( re , "$1,$2,$3,$4,$5" ) . split ( ',' ) ;
if ( rgb . length == 5 ) {
r = parseInt ( rgb [ 1 ] ) . toString ( 16 ) ;
g = parseInt ( rgb [ 2 ] ) . toString ( 16 ) ;
b = parseInt ( rgb [ 3 ] ) . toString ( 16 ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
r = r . length == 1 ? '0' + r : r ;
g = g . length == 1 ? '0' + g : g ;
b = b . length == 1 ? '0' + b : b ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
s = "#" + r + g + b ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( k )
s = rgb [ 0 ] + s + rgb [ 4 ] ;
}
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return s ;
2005-12-04 22:04:25 -05:00
} ;
2006-03-30 02:50:33 -05:00
TinyMCE _Engine . prototype . convertHexToRGB = function ( s ) {
if ( s . indexOf ( '#' ) != - 1 ) {
s = s . replace ( new RegExp ( '[^0-9A-F]' , 'gi' ) , '' ) ;
return "rgb(" + parseInt ( s . substring ( 0 , 2 ) , 16 ) + "," + parseInt ( s . substring ( 2 , 4 ) , 16 ) + "," + parseInt ( s . substring ( 4 , 6 ) , 16 ) + ")" ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
return s ;
2005-12-04 22:04:25 -05:00
} ;
2006-03-30 02:50:33 -05:00
TinyMCE _Engine . prototype . convertSpansToFonts = function ( doc ) {
2005-12-04 22:04:25 -05:00
var sizes = tinyMCE . getParam ( 'font_size_style_values' ) . replace ( /\s+/ , '' ) . split ( ',' ) ;
var h = doc . body . innerHTML ;
h = h . replace ( /<span/gi , '<font' ) ;
h = h . replace ( /<\/span/gi , '</font' ) ;
doc . body . innerHTML = h ;
var s = doc . getElementsByTagName ( "font" ) ;
for ( var i = 0 ; i < s . length ; i ++ ) {
var size = tinyMCE . trim ( s [ i ] . style . fontSize ) . toLowerCase ( ) ;
var fSize = 0 ;
for ( var x = 0 ; x < sizes . length ; x ++ ) {
if ( sizes [ x ] == size ) {
fSize = x + 1 ;
break ;
}
}
if ( fSize > 0 ) {
tinyMCE . setAttrib ( s [ i ] , 'size' , fSize ) ;
s [ i ] . style . fontSize = '' ;
}
var fFace = s [ i ] . style . fontFamily ;
if ( fFace != null && fFace != "" ) {
tinyMCE . setAttrib ( s [ i ] , 'face' , fFace ) ;
s [ i ] . style . fontFamily = '' ;
}
var fColor = s [ i ] . style . color ;
if ( fColor != null && fColor != "" ) {
tinyMCE . setAttrib ( s [ i ] , 'color' , tinyMCE . convertRGBToHex ( fColor ) ) ;
s [ i ] . style . color = '' ;
}
}
} ;
2006-03-30 02:50:33 -05:00
TinyMCE _Engine . prototype . convertFontsToSpans = function ( doc ) {
2005-12-04 22:04:25 -05:00
var sizes = tinyMCE . getParam ( 'font_size_style_values' ) . replace ( /\s+/ , '' ) . split ( ',' ) ;
var h = doc . body . innerHTML ;
h = h . replace ( /<font/gi , '<span' ) ;
h = h . replace ( /<\/font/gi , '</span' ) ;
doc . body . innerHTML = h ;
var fsClasses = tinyMCE . getParam ( 'font_size_classes' ) ;
if ( fsClasses != '' )
fsClasses = fsClasses . replace ( /\s+/ , '' ) . split ( ',' ) ;
else
fsClasses = null ;
var s = doc . getElementsByTagName ( "span" ) ;
for ( var i = 0 ; i < s . length ; i ++ ) {
var fSize , fFace , fColor ;
fSize = tinyMCE . getAttrib ( s [ i ] , 'size' ) ;
fFace = tinyMCE . getAttrib ( s [ i ] , 'face' ) ;
fColor = tinyMCE . getAttrib ( s [ i ] , 'color' ) ;
if ( fSize != "" ) {
fSize = parseInt ( fSize ) ;
if ( fSize > 0 && fSize < 8 ) {
if ( fsClasses != null )
tinyMCE . setAttrib ( s [ i ] , 'class' , fsClasses [ fSize - 1 ] ) ;
else
s [ i ] . style . fontSize = sizes [ fSize - 1 ] ;
}
s [ i ] . removeAttribute ( 'size' ) ;
}
if ( fFace != "" ) {
s [ i ] . style . fontFamily = fFace ;
s [ i ] . removeAttribute ( 'face' ) ;
}
if ( fColor != "" ) {
s [ i ] . style . color = fColor ;
s [ i ] . removeAttribute ( 'color' ) ;
}
}
} ;
2006-03-30 02:50:33 -05:00
TinyMCE _Engine . prototype . cleanupAnchors = function ( doc ) {
var i , cn , x , an = doc . getElementsByTagName ( "a" ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
for ( i = 0 ; i < an . length ; i ++ ) {
if ( tinyMCE . getAttrib ( an [ i ] , "name" ) != "" && tinyMCE . getAttrib ( an [ i ] , "href" ) == "" ) {
cn = an [ i ] . childNodes ;
for ( x = cn . length - 1 ; x >= 0 ; x -- )
tinyMCE . insertAfter ( cn [ x ] , an [ i ] ) ;
}
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
} ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
TinyMCE _Engine . prototype . getContent = function ( editor _id ) {
var h ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( typeof ( editor _id ) != "undefined" )
tinyMCE . selectedInstance = tinyMCE . getInstanceById ( editor _id ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . selectedInstance ) {
h = tinyMCE . _cleanupHTML ( this . selectedInstance , this . selectedInstance . getDoc ( ) , tinyMCE . settings , this . selectedInstance . getBody ( ) , false , true ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// When editing always use fonts internaly
if ( tinyMCE . getParam ( "convert_fonts_to_spans" ) )
tinyMCE . convertSpansToFonts ( this . selectedInstance . getDoc ( ) ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return h ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
return null ;
2005-12-04 22:04:25 -05:00
} ;
2006-03-30 02:50:33 -05:00
TinyMCE _Engine . prototype . _fixListElements = function ( d ) {
var nl , x , a = [ 'ol' , 'ul' ] , i , n , p , r = new RegExp ( '^(OL|UL)$' ) , np ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
for ( x = 0 ; x < a . length ; x ++ ) {
nl = d . getElementsByTagName ( a [ x ] ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
for ( i = 0 ; i < nl . length ; i ++ ) {
n = nl [ i ] ;
p = n . parentNode ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( r . test ( p . nodeName ) ) {
np = tinyMCE . prevNode ( n , 'LI' ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( ! np ) {
np = d . createElement ( 'li' ) ;
np . innerHTML = ' ' ;
np . appendChild ( n ) ;
p . insertBefore ( np , p . firstChild ) ;
} else
np . appendChild ( n ) ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
}
}
} ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
TinyMCE _Engine . prototype . _fixTables = function ( d ) {
var nl , i , n , p , np , x , t ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
nl = d . getElementsByTagName ( 'table' ) ;
for ( i = 0 ; i < nl . length ; i ++ ) {
n = nl [ i ] ;
if ( ( p = tinyMCE . getParentElement ( n , 'p,div,h1,h2,h3,h4,h5,h6' ) ) != null ) {
np = p . cloneNode ( false ) ;
np . removeAttribute ( 'id' ) ;
t = n ;
while ( ( n = n . nextSibling ) )
np . appendChild ( n ) ;
tinyMCE . insertAfter ( np , p ) ;
tinyMCE . insertAfter ( t , p ) ;
2005-12-04 22:04:25 -05:00
}
}
} ;
2006-03-30 02:50:33 -05:00
TinyMCE _Engine . prototype . _cleanupHTML = function ( inst , doc , config , elm , visual , on _save , on _submit ) {
var h , d , t1 , t2 , t3 , t4 , t5 , c , s ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( ! tinyMCE . getParam ( 'cleanup' ) )
return elm . innerHTML ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
on _save = typeof ( on _save ) == 'undefined' ? false : on _save ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
c = inst . cleanup ;
s = inst . settings ;
d = c . settings . debug ;
if ( d )
t1 = new Date ( ) . getTime ( ) ;
if ( tinyMCE . getParam ( "convert_fonts_to_spans" ) )
tinyMCE . convertFontsToSpans ( doc ) ;
if ( tinyMCE . getParam ( "fix_list_elements" ) )
tinyMCE . _fixListElements ( doc ) ;
if ( tinyMCE . getParam ( "fix_table_elements" ) )
tinyMCE . _fixTables ( doc ) ;
// Call custom cleanup code
tinyMCE . _customCleanup ( inst , on _save ? "get_from_editor_dom" : "insert_to_editor_dom" , doc . body ) ;
if ( d )
t2 = new Date ( ) . getTime ( ) ;
c . settings . on _save = on _save ;
//for (var i=0; i<100; i++)
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
c . idCount = 0 ;
c . serializationId ++ ;
c . serializedNodes = new Array ( ) ;
c . sourceIndex = - 1 ;
if ( s . cleanup _serializer == "xml" )
h = c . serializeNodeAsXML ( elm ) ;
2005-12-04 22:04:25 -05:00
else
2006-03-30 02:50:33 -05:00
h = c . serializeNodeAsHTML ( elm ) ;
if ( d )
t3 = new Date ( ) . getTime ( ) ;
// Post processing
h = h . replace ( /<\/?(body|head|html)[^>]*>/gi , '' ) ;
h = h . replace ( new RegExp ( ' (rowspan="1"|colspan="1")' , 'g' ) , '' ) ;
h = h . replace ( /<p><hr \/><\/p>/g , '<hr />' ) ;
h = h . replace ( /<p>( | )<\/p><hr \/><p>( | )<\/p>/g , '<hr />' ) ;
h = h . replace ( /<td>\s*<br \/>\s*<\/td>/g , '<td> </td>' ) ;
h = h . replace ( /<p>\s*<br \/>\s*<\/p>/g , '<p> </p>' ) ;
h = h . replace ( /<p>\s*( | )\s*<br \/>\s*( | )\s*<\/p>/g , '<p> </p>' ) ;
h = h . replace ( /<p>\s*( | )\s*<br \/>\s*<\/p>/g , '<p> </p>' ) ;
h = h . replace ( /<p>\s*<br \/>\s* \s*<\/p>/g , '<p> </p>' ) ;
h = h . replace ( /<a>(.*?)<\/a>/g , '$1' ) ;
h = h . replace ( /<p([^>]*)>\s*<\/p>/g , '<p$1> </p>' ) ;
// Clean body
if ( /^\s*(<br \/>|<p> <\/p>|<p> <\/p>|<p><\/p>)\s*$/ . test ( h ) )
h = '' ;
// If preformatted
if ( s . preformatted ) {
h = h . replace ( /^<pre>/ , '' ) ;
h = h . replace ( /<\/pre>$/ , '' ) ;
h = '<pre>' + h + '</pre>' ;
}
// Gecko specific processing
if ( tinyMCE . isGecko ) {
h = h . replace ( /<o:p _moz-userdefined="" \/>/g , '' ) ;
h = h . replace ( /<td([^>]*)>\s*<br \/>\s*<\/td>/g , '<td$1> </td>' ) ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( s . force _br _newlines )
h = h . replace ( /<p>( | )<\/p>/g , '<br />' ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Call custom cleanup code
h = tinyMCE . _customCleanup ( inst , on _save ? "get_from_editor" : "insert_to_editor" , h ) ;
// Remove internal classes
if ( on _save ) {
h = h . replace ( new RegExp ( ' ?(mceItem[a-zA-Z0-9]*|' + s . visual _table _class + ')' , 'g' ) , '' ) ;
h = h . replace ( new RegExp ( ' ?class=""' , 'g' ) , '' ) ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
if ( s . remove _linebreaks && ! c . settings . indent )
h = h . replace ( /\n|\r/g , ' ' ) ;
if ( d )
t4 = new Date ( ) . getTime ( ) ;
if ( on _save && c . settings . indent )
h = c . formatHTML ( h ) ;
// If encoding (not recommended option)
if ( on _submit && ( s . encoding == "xml" || s . encoding == "html" ) )
h = c . xmlEncode ( h ) ;
if ( d )
t5 = new Date ( ) . getTime ( ) ;
if ( c . settings . debug )
tinyMCE . debug ( "Cleanup in ms: Pre=" + ( t2 - t1 ) + ", Serialize: " + ( t3 - t2 ) + ", Post: " + ( t4 - t3 ) + ", Format: " + ( t5 - t4 ) + ", Sum: " + ( t5 - t1 ) + "." ) ;
return h ;
2005-12-04 22:04:25 -05:00
} ;
2006-03-30 02:50:33 -05:00
function TinyMCE _Cleanup ( ) {
this . isMSIE = ( navigator . appName == "Microsoft Internet Explorer" ) ;
this . rules = tinyMCE . clearArray ( new Array ( ) ) ;
// Default config
this . settings = {
indent _elements : 'head,table,tbody,thead,tfoot,form,tr,ul,ol,blockquote,object' ,
newline _before _elements : 'h1,h2,h3,h4,h5,h6,pre,address,div,ul,ol,li,meta,option,area,title,link,base,script,td' ,
newline _after _elements : 'br,hr,p,pre,address,div,ul,ol,meta,option,area,link,base,script' ,
newline _before _after _elements : 'html,head,body,table,thead,tbody,tfoot,tr,form,ul,ol,blockquote,p,object,param,hr,div' ,
indent _char : '\t' ,
indent _levels : 1 ,
entity _encoding : 'raw' ,
valid _elements : '*[*]' ,
entities : '' ,
url _converter : '' ,
invalid _elements : '' ,
verify _html : false
} ;
this . vElements = tinyMCE . clearArray ( new Array ( ) ) ;
this . vElementsRe = '' ;
this . closeElementsRe = /^(IMG|BR|HR|LINK|META|BASE|INPUT|BUTTON)$/ ;
this . codeElementsRe = /^(SCRIPT|STYLE)$/ ;
this . serializationId = 0 ;
this . mceAttribs = {
href : 'mce_href' ,
src : 'mce_src' ,
type : 'mce_type'
} ;
}
TinyMCE _Cleanup . prototype = {
init : function ( s ) {
var n , a , i , ir , or , st ;
for ( n in s )
this . settings [ n ] = s [ n ] ;
// Setup code formating
s = this . settings ;
// Setup regexps
this . inRe = this . _arrayToRe ( s . indent _elements . split ( ',' ) , '' , '^<(' , ')[^>]*' ) ;
this . ouRe = this . _arrayToRe ( s . indent _elements . split ( ',' ) , '' , '^<\\/(' , ')[^>]*' ) ;
this . nlBeforeRe = this . _arrayToRe ( s . newline _before _elements . split ( ',' ) , 'gi' , '<(' , ')([^>]*)>' ) ;
this . nlAfterRe = this . _arrayToRe ( s . newline _after _elements . split ( ',' ) , 'gi' , '<(' , ')([^>]*)>' ) ;
this . nlBeforeAfterRe = this . _arrayToRe ( s . newline _before _after _elements . split ( ',' ) , 'gi' , '<(\\/?)(' , ')([^>]*)>' ) ;
if ( s . invalid _elements != '' )
this . iveRe = this . _arrayToRe ( s . invalid _elements . toUpperCase ( ) . split ( ',' ) , 'g' , '^(' , ')$' ) ;
else
this . iveRe = null ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Setup separator
st = '' ;
for ( i = 0 ; i < s . indent _levels ; i ++ )
st += s . indent _char ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
this . inStr = st ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// If verify_html if false force *[*]
if ( ! s . verify _html ) {
s . valid _elements = '*[*]' ;
s . extended _valid _elements = '' ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
this . fillStr = s . entity _encoding == "named" ? " " : " " ;
this . idCount = 0 ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
addRuleStr : function ( s ) {
var r = this . parseRuleStr ( s ) ;
var n ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
for ( n in r ) {
if ( r [ n ] )
this . rules [ n ] = r [ n ] ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
this . vElements = tinyMCE . clearArray ( new Array ( ) ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
for ( n in this . rules ) {
if ( this . rules [ n ] )
this . vElements [ this . vElements . length ] = this . rules [ n ] . tag ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
this . vElementsRe = this . _arrayToRe ( this . vElements , '' ) ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
parseRuleStr : function ( s ) {
var ta , p , r , a , i , x , px , t , tn , y , av , or = tinyMCE . clearArray ( new Array ( ) ) , dv ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( s == null || s . length == 0 )
return or ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
ta = s . split ( ',' ) ;
for ( x = 0 ; x < ta . length ; x ++ ) {
s = ta [ x ] ;
if ( s . length == 0 )
continue ;
// Split tag/attrs
p = this . split ( /\[|\]/ , s ) ;
if ( p == null || p . length < 1 )
t = s . toUpperCase ( ) ;
else
t = p [ 0 ] . toUpperCase ( ) ;
// Handle all tag names
tn = this . split ( '/' , t ) ;
for ( y = 0 ; y < tn . length ; y ++ ) {
r = { } ;
r . tag = tn [ y ] ;
r . forceAttribs = null ;
r . defaultAttribs = null ;
r . validAttribValues = null ;
// Handle prefixes
px = r . tag . charAt ( 0 ) ;
r . forceOpen = px == '+' ;
r . removeEmpty = px == '-' ;
r . fill = px == '#' ;
r . tag = r . tag . replace ( /\+|-|#/g , '' ) ;
r . oTagName = tn [ 0 ] . replace ( /\+|-|#/g , '' ) . toLowerCase ( ) ;
r . isWild = new RegExp ( '\\*|\\?|\\+' , 'g' ) . test ( r . tag ) ;
r . validRe = new RegExp ( this . _wildcardToRe ( '^' + r . tag + '$' ) ) ;
// Setup valid attributes
if ( p . length > 1 ) {
r . vAttribsRe = '^(' ;
a = this . split ( /\|/ , p [ 1 ] ) ;
for ( i = 0 ; i < a . length ; i ++ ) {
t = a [ i ] ;
av = /(=|:|<)(.*?)$/ . exec ( t ) ;
t = t . replace ( /(=|:|<).*?$/ , '' ) ;
if ( av && av . length > 0 ) {
if ( av [ 0 ] . charAt ( 0 ) == ':' ) {
if ( ! r . forceAttribs )
r . forceAttribs = tinyMCE . clearArray ( new Array ( ) ) ;
r . forceAttribs [ t . toLowerCase ( ) ] = av [ 0 ] . substring ( 1 ) ;
} else if ( av [ 0 ] . charAt ( 0 ) == '=' ) {
if ( ! r . defaultAttribs )
r . defaultAttribs = tinyMCE . clearArray ( new Array ( ) ) ;
dv = av [ 0 ] . substring ( 1 ) ;
r . defaultAttribs [ t . toLowerCase ( ) ] = dv == "" ? "mce_empty" : dv ;
} else if ( av [ 0 ] . charAt ( 0 ) == '<' ) {
if ( ! r . validAttribValues )
r . validAttribValues = tinyMCE . clearArray ( new Array ( ) ) ;
r . validAttribValues [ t . toLowerCase ( ) ] = this . _arrayToRe ( this . split ( '?' , av [ 0 ] . substring ( 1 ) ) , '' ) ;
}
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
r . vAttribsRe += '' + t . toLowerCase ( ) + ( i != a . length - 1 ? '|' : '' ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
a [ i ] = t . toLowerCase ( ) ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
r . vAttribsRe += ')$' ;
r . vAttribsRe = this . _wildcardToRe ( r . vAttribsRe ) ;
r . vAttribsReIsWild = new RegExp ( '\\*|\\?|\\+' , 'g' ) . test ( r . vAttribsRe ) ;
r . vAttribsRe = new RegExp ( r . vAttribsRe ) ;
r . vAttribs = a . reverse ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
//tinyMCE.debug(r.tag, r.oTagName, r.vAttribsRe, r.vAttribsReWC);
} else {
r . vAttribsRe = '' ;
r . vAttribs = tinyMCE . clearArray ( new Array ( ) ) ;
r . vAttribsReIsWild = false ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
or [ r . tag ] = r ;
2005-12-04 22:04:25 -05:00
}
}
2006-03-30 02:50:33 -05:00
return or ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
serializeNodeAsXML : function ( n ) {
var s , b ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( ! this . xmlDoc ) {
if ( this . isMSIE ) {
try { this . xmlDoc = new ActiveXObject ( 'MSXML2.DOMDocument' ) ; } catch ( e ) { }
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( ! this . xmlDoc )
try { this . xmlDoc = new ActiveXObject ( 'Microsoft.XmlDom' ) ; } catch ( e ) { }
} else
this . xmlDoc = document . implementation . createDocument ( '' , '' , null ) ;
if ( ! this . xmlDoc )
alert ( "Error XML Parser could not be found." ) ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( this . xmlDoc . firstChild )
this . xmlDoc . removeChild ( this . xmlDoc . firstChild ) ;
b = this . xmlDoc . createElement ( "html" ) ;
b = this . xmlDoc . appendChild ( b ) ;
this . _convertToXML ( n , b ) ;
if ( this . isMSIE )
return this . xmlDoc . xml ;
else
return new XMLSerializer ( ) . serializeToString ( this . xmlDoc ) ;
} ,
_convertToXML : function ( n , xn ) {
var xd , el , i , l , cn , at , no , hc = false ;
if ( this . _isDuplicate ( n ) )
return ;
xd = this . xmlDoc ;
switch ( n . nodeType ) {
case 1 : // Element
hc = n . hasChildNodes ( ) ;
el = xd . createElement ( n . nodeName . toLowerCase ( ) ) ;
at = n . attributes ;
for ( i = at . length - 1 ; i > - 1 ; i -- ) {
no = at [ i ] ;
if ( no . specified && no . nodeValue )
el . setAttribute ( no . nodeName . toLowerCase ( ) , no . nodeValue ) ;
}
if ( ! hc && ! this . closeElementsRe . test ( n . nodeName ) )
el . appendChild ( xd . createTextNode ( "" ) ) ;
xn = xn . appendChild ( el ) ;
2005-12-04 22:04:25 -05:00
break ;
2006-03-30 02:50:33 -05:00
case 3 : // Text
xn . appendChild ( xd . createTextNode ( n . nodeValue ) ) ;
return ;
case 8 : // Comment
xn . appendChild ( xd . createComment ( n . nodeValue ) ) ;
return ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
if ( hc ) {
cn = n . childNodes ;
for ( i = 0 , l = cn . length ; i < l ; i ++ )
this . _convertToXML ( cn [ i ] , xn ) ;
}
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
serializeNodeAsHTML : function ( n ) {
var en , no , h = '' , i , l , r , cn , va = false , f = false , at , hc ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
this . _setupRules ( ) ; // Will initialize cleanup rules
if ( this . _isDuplicate ( n ) )
return '' ;
switch ( n . nodeType ) {
case 1 : // Element
hc = n . hasChildNodes ( ) ;
// MSIE sometimes produces <//tag>
if ( ( tinyMCE . isMSIE && ! tinyMCE . isOpera ) && n . nodeName . indexOf ( '/' ) != - 1 )
break ;
if ( this . vElementsRe . test ( n . nodeName ) && ( ! this . iveRe || ! this . iveRe . test ( n . nodeName ) ) ) {
va = true ;
r = this . rules [ n . nodeName ] ;
if ( ! r ) {
at = this . rules ;
for ( no in at ) {
if ( at [ no ] && at [ no ] . validRe . test ( n . nodeName ) ) {
r = at [ no ] ;
break ;
}
}
}
en = r . isWild ? n . nodeName . toLowerCase ( ) : r . oTagName ;
f = r . fill ;
if ( r . removeEmpty && ! hc )
return "" ;
h += '<' + en ;
if ( r . vAttribsReIsWild ) {
// Serialize wildcard attributes
at = n . attributes ;
for ( i = at . length - 1 ; i > - 1 ; i -- ) {
no = at [ i ] ;
if ( no . specified && r . vAttribsRe . test ( no . nodeName ) )
h += this . _serializeAttribute ( n , r , no . nodeName ) ;
}
} else {
// Serialize specific attributes
for ( i = r . vAttribs . length - 1 ; i > - 1 ; i -- )
h += this . _serializeAttribute ( n , r , r . vAttribs [ i ] ) ;
}
// Serialize mce_ atts
if ( ! this . settings . on _save ) {
at = this . mceAttribs ;
for ( no in at ) {
if ( at [ no ] )
h += this . _serializeAttribute ( n , r , at [ no ] ) ;
}
}
// Close these
if ( this . closeElementsRe . test ( n . nodeName ) )
return h + ' />' ;
h += '>' ;
if ( this . isMSIE && this . codeElementsRe . test ( n . nodeName ) )
h += n . innerHTML ;
}
break ;
case 3 : // Text
if ( n . parentNode && this . codeElementsRe . test ( n . parentNode . nodeName ) )
return this . isMSIE ? '' : n . nodeValue ;
return this . xmlEncode ( n . nodeValue ) ;
case 8 : // Comment
return "<!--" + this . _trimComment ( n . nodeValue ) + "-->" ;
}
if ( hc ) {
cn = n . childNodes ;
for ( i = 0 , l = cn . length ; i < l ; i ++ )
h += this . serializeNodeAsHTML ( cn [ i ] ) ;
}
// Fill empty nodes
if ( f && ! hc )
h += this . fillStr ;
// End element
if ( va )
h += '</' + en + '>' ;
return h ;
} ,
_serializeAttribute : function ( n , r , an ) {
var av = '' , t , os = this . settings . on _save ;
if ( os && ( an . indexOf ( 'mce_' ) == 0 || an . indexOf ( '_moz' ) == 0 ) )
return '' ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( os && this . mceAttribs [ an ] )
av = this . _getAttrib ( n , this . mceAttribs [ an ] ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( av . length == 0 )
av = this . _getAttrib ( n , an ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( av . length == 0 && r . defaultAttribs && ( t = r . defaultAttribs [ an ] ) ) {
av = t ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( av == "mce_empty" )
return " " + an + '=""' ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( r . forceAttribs && ( t = r . forceAttribs [ an ] ) )
av = t ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( os && av . length != 0 && this . settings . url _converter . length != 0 && /^(src|href|longdesc)$/ . test ( an ) )
av = eval ( this . settings . url _converter + '(this, n, av)' ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( av . length != 0 && r . validAttribValues && r . validAttribValues [ an ] && ! r . validAttribValues [ an ] . test ( av ) )
return "" ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( av . length != 0 && av == "{$uid}" )
av = "uid_" + ( this . idCount ++ ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( av . length != 0 )
return " " + an + "=" + '"' + this . xmlEncode ( av ) + '"' ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return "" ;
} ,
formatHTML : function ( h ) {
var s = this . settings , p = '' , i = 0 , li = 0 , o = '' , l ;
h = h . replace ( /\r/g , '' ) ; // Windows sux, isn't carriage return a thing of the past :)
h = '\n' + h ;
h = h . replace ( new RegExp ( '\\n\\s+' , 'gi' ) , '\n' ) ; // Remove previous formatting
h = h . replace ( this . nlBeforeRe , '\n<$1$2>' ) ;
h = h . replace ( this . nlAfterRe , '<$1$2>\n' ) ;
h = h . replace ( this . nlBeforeAfterRe , '\n<$1$2$3>\n' ) ;
h += '\n' ;
//tinyMCE.debug(h);
while ( ( i = h . indexOf ( '\n' , i + 1 ) ) != - 1 ) {
if ( ( l = h . substring ( li + 1 , i ) ) . length != 0 ) {
if ( this . ouRe . test ( l ) && p . length >= s . indent _levels )
p = p . substring ( s . indent _levels ) ;
o += p + l + '\n' ;
if ( this . inRe . test ( l ) )
p += this . inStr ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
li = i ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
//tinyMCE.debug(h);
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return o ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
xmlEncode : function ( s ) {
var i , l , e , o = '' , c ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
this . _setupEntities ( ) ; // Will intialize lookup table
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
switch ( this . settings . entity _encoding ) {
case "raw" :
return tinyMCE . xmlEncode ( s ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
case "named" :
for ( i = 0 , l = s . length ; i < l ; i ++ ) {
c = s . charCodeAt ( i ) ;
e = this . entities [ c ] ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// ' is not working in MSIE
// More info: http://www.w3.org/TR/xhtml1/#C_16
if ( c == 39 ) {
o += "'" ;
continue ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
if ( e && e != '' )
o += '&' + e + ';' ;
else
o += String . fromCharCode ( c ) ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
return o ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
case "numeric" :
for ( i = 0 , l = s . length ; i < l ; i ++ ) {
c = s . charCodeAt ( i ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( c > 127 || c == 60 || c == 62 || c == 38 || c == 39 || c == 34 )
o += '&#' + c + ";" ;
else
o += String . fromCharCode ( c ) ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return o ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return s ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
split : function ( re , s ) {
var c = s . split ( re ) ;
var i , l , o = new Array ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
for ( i = 0 , l = c . length ; i < l ; i ++ ) {
if ( c [ i ] != '' )
o [ i ] = c [ i ] ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return o ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
_trimComment : function ( s ) {
// Make xsrc, xhref as src and href again
if ( tinyMCE . isGecko ) {
s = s . replace ( /\sxsrc=/gi , " src=" ) ;
s = s . replace ( /\sxhref=/gi , " href=" ) ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Remove mce_src, mce_href
s = s . replace ( new RegExp ( '\\smce_src=\"[^\"]*\"' , 'gi' ) , "" ) ;
s = s . replace ( new RegExp ( '\\smce_href=\"[^\"]*\"' , 'gi' ) , "" ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return s ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
_getAttrib : function ( e , n , d ) {
if ( typeof ( d ) == "undefined" )
d = "" ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( ! e || e . nodeType != 1 )
return d ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
var v = e . getAttribute ( n , 0 ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( n == "class" && ! v )
v = e . className ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( this . isMSIE && n == "http-equiv" )
v = e . httpEquiv ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( n == "style" && ! tinyMCE . isOpera )
v = e . style . cssText ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( n == 'style' )
v = tinyMCE . serializeStyle ( tinyMCE . parseStyle ( v ) ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( this . settings . on _save && n . indexOf ( 'on' ) != - 1 && this . settings . on _save && v && v != "" )
v = tinyMCE . cleanupEventStr ( v ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return ( v && v != "" ) ? '' + v : d ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
_urlConverter : function ( c , n , v ) {
if ( ! c . settings . on _save )
return tinyMCE . convertRelativeToAbsoluteURL ( tinyMCE . settings . base _href , v ) ;
else if ( tinyMCE . getParam ( 'convert_urls' ) )
return eval ( tinyMCE . settings . urlconverter _callback + "(v, n, true);" ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return v ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
_arrayToRe : function ( a , op , be , af ) {
var i , r ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
op = typeof ( op ) == "undefined" ? "gi" : op ;
be = typeof ( be ) == "undefined" ? "^(" : be ;
af = typeof ( af ) == "undefined" ? ")$" : af ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
r = be ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
for ( i = 0 ; i < a . length ; i ++ )
r += this . _wildcardToRe ( a [ i ] ) + ( i != a . length - 1 ? "|" : "" ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
r += af ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return new RegExp ( r , op ) ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
_wildcardToRe : function ( s ) {
s = s . replace ( /\?/g , '(\\S?)' ) ;
s = s . replace ( /\+/g , '(\\S+)' ) ;
s = s . replace ( /\*/g , '(\\S*)' ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return s ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
_setupEntities : function ( ) {
var n , a , i , s = this . settings ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Setup entities
if ( ! this . entitiesDone ) {
if ( s . entity _encoding == "named" ) {
n = tinyMCE . clearArray ( new Array ( ) ) ;
a = this . split ( ',' , s . entities ) ;
for ( i = 0 ; i < a . length ; i += 2 )
n [ a [ i ] ] = a [ i + 1 ] ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
this . entities = n ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
this . entitiesDone = true ;
}
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
_setupRules : function ( ) {
var s = this . settings ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Setup default rule
if ( ! this . rulesDone ) {
this . addRuleStr ( s . valid _elements ) ;
this . addRuleStr ( s . extended _valid _elements ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
this . rulesDone = true ;
}
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
_isDuplicate : function ( n ) {
var i ;
if ( ! this . settings . fix _content _duplication )
return false ;
if ( tinyMCE . isMSIE && ! tinyMCE . isOpera && n . nodeType == 1 ) {
// Mark elements
if ( n . mce _serialized == this . serializationId )
return true ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
n . setAttribute ( 'mce_serialized' , this . serializationId ) ;
} else {
// Search lookup table for text nodes and comments
for ( i = 0 ; i < this . serializedNodes . length ; i ++ ) {
if ( this . serializedNodes [ i ] == n )
2005-12-04 22:04:25 -05:00
return true ;
}
2006-03-30 02:50:33 -05:00
this . serializedNodes [ this . serializedNodes . length ] = n ;
}
return false ;
2005-12-04 22:04:25 -05:00
}
} ;
2006-03-30 02:50:33 -05:00
/* file:jscripts/tiny_mce/classes/TinyMCE_DOMUtils.class.js */
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
TinyMCE _Engine . prototype . getElementByAttributeValue = function ( n , e , a , v ) {
return ( n = this . getElementsByAttributeValue ( n , e , a , v ) ) . length == 0 ? null : n [ 0 ] ;
} ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
TinyMCE _Engine . prototype . getElementsByAttributeValue = function ( n , e , a , v ) {
var i , nl = n . getElementsByTagName ( e ) , o = new Array ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
for ( i = 0 ; i < nl . length ; i ++ ) {
if ( tinyMCE . getAttrib ( nl [ i ] , a ) . indexOf ( v ) != - 1 )
o [ o . length ] = nl [ i ] ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
return o ;
2005-12-04 22:04:25 -05:00
} ;
2006-03-30 02:50:33 -05:00
TinyMCE _Engine . prototype . isBlockElement = function ( n ) {
return n != null && n . nodeType == 1 && this . blockRegExp . test ( n . nodeName ) ;
2005-12-04 22:04:25 -05:00
} ;
2006-03-30 02:50:33 -05:00
TinyMCE _Engine . prototype . getParentBlockElement = function ( n ) {
while ( n ) {
if ( this . isBlockElement ( n ) )
return n ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
n = n . parentNode ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
return null ;
2005-12-04 22:04:25 -05:00
} ;
2006-03-30 02:50:33 -05:00
TinyMCE _Engine . prototype . insertAfter = function ( n , r ) {
if ( r . nextSibling )
r . parentNode . insertBefore ( n , r . nextSibling ) ;
else
r . parentNode . appendChild ( n ) ;
} ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
TinyMCE _Engine . prototype . setInnerHTML = function ( e , h ) {
var i , nl , n ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . isMSIE && ! tinyMCE . isOpera ) {
// Since MSIE handles invalid HTML better that valid XHTML we
// need to make some things invalid. <hr /> gets converted to <hr>.
h = h . replace ( /\s\/>/g , '>' ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Since MSIE auto generated emtpy P tags some times we must tell it to keep the real ones
h = h . replace ( /<p([^>]*)>\u00A0?<\/p>/gi , '<p$1 mce_keep="true"> </p>' ) ; // Keep empty paragraphs
h = h . replace ( /<p([^>]*)> <\/p>/gi , '<p$1 mce_keep="true"> </p>' ) ; // Keep empty paragraphs
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Remove first comment
e . innerHTML = tinyMCE . uniqueTag + h ;
e . firstChild . removeNode ( true ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Remove weird auto generated empty paragraphs unless it's supposed to be there
nl = e . getElementsByTagName ( "p" ) ;
for ( i = nl . length - 1 ; i >= 0 ; i -- ) {
n = nl [ i ] ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( n . nodeName == 'P' && ! n . hasChildNodes ( ) && ! n . mce _keep )
n . parentNode . removeChild ( n ) ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
} else {
h = this . fixGeckoBaseHREFBug ( 1 , e , h ) ;
e . innerHTML = h ;
this . fixGeckoBaseHREFBug ( 2 , e , h ) ;
2005-12-04 22:04:25 -05:00
}
} ;
2006-03-30 02:50:33 -05:00
TinyMCE _Engine . prototype . getOuterHTML = function ( e ) {
if ( tinyMCE . isMSIE )
return e . outerHTML ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
var d = e . ownerDocument . createElement ( "body" ) ;
d . appendChild ( e ) ;
return d . innerHTML ;
} ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
TinyMCE _Engine . prototype . setOuterHTML = function ( e , h ) {
if ( tinyMCE . isMSIE ) {
e . outerHTML = h ;
return ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
var d = e . ownerDocument . createElement ( "body" ) ;
d . innerHTML = h ;
e . parentNode . replaceChild ( d . firstChild , e ) ;
2005-12-04 22:04:25 -05:00
} ;
2006-03-30 02:50:33 -05:00
TinyMCE _Engine . prototype . _getElementById = function ( id , d ) {
var e , i , j , f ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( typeof ( d ) == "undefined" )
d = document ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
e = d . getElementById ( id ) ;
if ( ! e ) {
f = d . forms ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
for ( i = 0 ; i < f . length ; i ++ ) {
for ( j = 0 ; j < f [ i ] . elements . length ; j ++ ) {
if ( f [ i ] . elements [ j ] . name == id ) {
e = f [ i ] . elements [ j ] ;
break ;
}
}
}
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return e ;
2005-12-04 22:04:25 -05:00
} ;
2006-03-30 02:50:33 -05:00
TinyMCE _Engine . prototype . getNodeTree = function ( n , na , t , nn ) {
var i ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( typeof ( t ) == "undefined" || n . nodeType == t && ( typeof ( nn ) == "undefined" || n . nodeName == nn ) )
na [ na . length ] = n ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( n . hasChildNodes ( ) ) {
for ( i = 0 ; i < n . childNodes . length ; i ++ )
tinyMCE . getNodeTree ( n . childNodes [ i ] , na , t , nn ) ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
return na ;
} ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
TinyMCE _Engine . prototype . getParentElement = function ( node , names , attrib _name , attrib _value ) {
if ( typeof ( names ) == "undefined" ) {
if ( node . nodeType == 1 )
return node ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Find parent node that is a element
while ( ( node = node . parentNode ) != null && node . nodeType != 1 ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return node ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
if ( node == null )
return null ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
var namesAr = names . toUpperCase ( ) . split ( ',' ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
do {
for ( var i = 0 ; i < namesAr . length ; i ++ ) {
if ( node . nodeName == namesAr [ i ] || names == "*" ) {
if ( typeof ( attrib _name ) == "undefined" )
return node ;
else if ( node . getAttribute ( attrib _name ) ) {
if ( typeof ( attrib _value ) == "undefined" ) {
if ( node . getAttribute ( attrib _name ) != "" )
return node ;
} else if ( node . getAttribute ( attrib _name ) == attrib _value )
return node ;
}
}
}
} while ( ( node = node . parentNode ) != null ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return null ;
2005-12-04 22:04:25 -05:00
} ;
2006-03-30 02:50:33 -05:00
TinyMCE _Engine . prototype . getAttrib = function ( elm , name , default _value ) {
if ( typeof ( default _value ) == "undefined" )
default _value = "" ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Not a element
if ( ! elm || elm . nodeType != 1 )
return default _value ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
var v = elm . getAttribute ( name ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Try className for class attrib
if ( name == "class" && ! v )
v = elm . className ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Workaround for a issue with Firefox 1.5rc2+
if ( tinyMCE . isGecko && name == "src" && elm . src != null && elm . src != "" )
v = elm . src ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Workaround for a issue with Firefox 1.5rc2+
if ( tinyMCE . isGecko && name == "href" && elm . href != null && elm . href != "" )
v = elm . href ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( name == "http-equiv" && tinyMCE . isMSIE )
v = elm . httpEquiv ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( name == "style" && ! tinyMCE . isOpera )
v = elm . style . cssText ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return ( v && v != "" ) ? v : default _value ;
} ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
TinyMCE _Engine . prototype . setAttrib = function ( element , name , value , fix _value ) {
if ( typeof ( value ) == "number" && value != null )
value = "" + value ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( fix _value ) {
if ( value == null )
value = "" ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
var re = new RegExp ( '[^0-9%]' , 'g' ) ;
value = value . replace ( re , '' ) ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( name == "style" )
element . style . cssText = value ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( name == "class" )
element . className = value ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( value != null && value != "" && value != - 1 )
element . setAttribute ( name , value ) ;
else
element . removeAttribute ( name ) ;
} ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
TinyMCE _Engine . prototype . setStyleAttrib = function ( elm , name , value ) {
eval ( 'elm.style.' + name + '=value;' ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Style attrib deleted
if ( tinyMCE . isMSIE && value == null || value == '' ) {
var str = tinyMCE . serializeStyle ( tinyMCE . parseStyle ( elm . style . cssText ) ) ;
elm . style . cssText = str ;
elm . setAttribute ( "style" , str ) ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
} ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
TinyMCE _Engine . prototype . switchClass = function ( ei , c ) {
var e ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . switchClassCache [ ei ] )
e = tinyMCE . switchClassCache [ ei ] ;
else
e = tinyMCE . switchClassCache [ ei ] = document . getElementById ( ei ) ;
if ( e ) {
// Keep tile mode
if ( tinyMCE . settings . button _tile _map && e . className && e . className . indexOf ( 'mceTiledButton' ) == 0 )
c = 'mceTiledButton ' + c ;
e . className = c ;
}
2005-12-04 22:04:25 -05:00
} ;
2006-03-30 02:50:33 -05:00
TinyMCE _Engine . prototype . getAbsPosition = function ( n ) {
var p = { absLeft : 0 , absTop : 0 } ;
while ( n ) {
p . absLeft += n . offsetLeft ;
p . absTop += n . offsetTop ;
n = n . offsetParent ;
}
return p ;
2005-12-04 22:04:25 -05:00
} ;
2006-03-30 02:50:33 -05:00
TinyMCE _Engine . prototype . prevNode = function ( 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 ;
2005-12-04 22:04:25 -05:00
} ;
2006-03-30 02:50:33 -05:00
TinyMCE _Engine . prototype . nextNode = function ( e , n ) {
var a = n . split ( ',' ) , i ;
while ( ( e = e . nextSibling ) != null ) {
for ( i = 0 ; i < a . length ; i ++ ) {
if ( e . nodeName == a [ i ] )
return e ;
}
}
return null ;
2005-12-04 22:04:25 -05:00
} ;
2006-03-30 02:50:33 -05:00
/* file:jscripts/tiny_mce/classes/TinyMCE_URL.class.js */
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
TinyMCE _Engine . prototype . parseURL = function ( url _str ) {
var urlParts = new Array ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( url _str ) {
var pos , lastPos ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Parse protocol part
pos = url _str . indexOf ( '://' ) ;
if ( pos != - 1 ) {
urlParts [ 'protocol' ] = url _str . substring ( 0 , pos ) ;
lastPos = pos + 3 ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Find port or path start
for ( var i = lastPos ; i < url _str . length ; i ++ ) {
var chr = url _str . charAt ( i ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( chr == ':' )
break ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( chr == '/' )
break ;
}
pos = i ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Get host
urlParts [ 'host' ] = url _str . substring ( lastPos , pos ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Get port
urlParts [ 'port' ] = "" ;
lastPos = pos ;
if ( url _str . charAt ( pos ) == ':' ) {
pos = url _str . indexOf ( '/' , lastPos ) ;
urlParts [ 'port' ] = url _str . substring ( lastPos + 1 , pos ) ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Get path
lastPos = pos ;
pos = url _str . indexOf ( '?' , lastPos ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( pos == - 1 )
pos = url _str . indexOf ( '#' , lastPos ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( pos == - 1 )
pos = url _str . length ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
urlParts [ 'path' ] = url _str . substring ( lastPos , pos ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Get query
lastPos = pos ;
if ( url _str . charAt ( pos ) == '?' ) {
pos = url _str . indexOf ( '#' ) ;
pos = ( pos == - 1 ) ? url _str . length : pos ;
urlParts [ 'query' ] = url _str . substring ( lastPos + 1 , pos ) ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Get anchor
lastPos = pos ;
if ( url _str . charAt ( pos ) == '#' ) {
pos = url _str . length ;
urlParts [ 'anchor' ] = url _str . substring ( lastPos + 1 , pos ) ;
}
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
return urlParts ;
2005-12-04 22:04:25 -05:00
} ;
2006-03-30 02:50:33 -05:00
TinyMCE _Engine . prototype . serializeURL = function ( up ) {
var o = "" ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( up [ 'protocol' ] )
o += up [ 'protocol' ] + "://" ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( up [ 'host' ] )
o += up [ 'host' ] ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( up [ 'port' ] )
o += ":" + up [ 'port' ] ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( up [ 'path' ] )
o += up [ 'path' ] ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( up [ 'query' ] )
o += "?" + up [ 'query' ] ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( up [ 'anchor' ] )
o += "#" + up [ 'anchor' ] ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return o ;
} ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
TinyMCE _Engine . prototype . convertAbsoluteURLToRelativeURL = function ( base _url , url _to _relative ) {
var baseURL = this . parseURL ( base _url ) ;
var targetURL = this . parseURL ( url _to _relative ) ;
var strTok1 ;
var strTok2 ;
var breakPoint = 0 ;
var outPath = "" ;
var forceSlash = false ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( targetURL . path == "" )
targetURL . path = "/" ;
else
forceSlash = true ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Crop away last path part
base _url = baseURL . path . substring ( 0 , baseURL . path . lastIndexOf ( '/' ) ) ;
strTok1 = base _url . split ( '/' ) ;
strTok2 = targetURL . path . split ( '/' ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( strTok1 . length >= strTok2 . length ) {
for ( var i = 0 ; i < strTok1 . length ; i ++ ) {
if ( i >= strTok2 . length || strTok1 [ i ] != strTok2 [ i ] ) {
breakPoint = i + 1 ;
break ;
}
}
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
if ( strTok1 . length < strTok2 . length ) {
for ( var i = 0 ; i < strTok2 . length ; i ++ ) {
if ( i >= strTok1 . length || strTok1 [ i ] != strTok2 [ i ] ) {
breakPoint = i + 1 ;
break ;
}
}
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( breakPoint == 1 )
return targetURL . path ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
for ( var i = 0 ; i < ( strTok1 . length - ( breakPoint - 1 ) ) ; i ++ )
outPath += "../" ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
for ( var i = breakPoint - 1 ; i < strTok2 . length ; i ++ ) {
if ( i != ( breakPoint - 1 ) )
outPath += "/" + strTok2 [ i ] ;
else
outPath += strTok2 [ i ] ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
targetURL . protocol = null ;
targetURL . host = null ;
targetURL . port = null ;
targetURL . path = outPath == "" && forceSlash ? "/" : outPath ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Remove document prefix from local anchors
var fileName = baseURL . path ;
var pos ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( ( pos = fileName . lastIndexOf ( '/' ) ) != - 1 )
fileName = fileName . substring ( pos + 1 ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Is local anchor
if ( fileName == targetURL . path && targetURL . anchor != "" )
targetURL . path = "" ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// If empty and not local anchor force slash
if ( targetURL . path == "" && ! targetURL . anchor )
targetURL . path = "/" ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return this . serializeURL ( targetURL ) ;
} ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
TinyMCE _Engine . prototype . convertRelativeToAbsoluteURL = function ( base _url , relative _url ) {
var baseURL = this . parseURL ( base _url ) ;
var relURL = this . parseURL ( relative _url ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( relative _url == "" || relative _url . charAt ( 0 ) == '/' || relative _url . indexOf ( '://' ) != - 1 || relative _url . indexOf ( 'mailto:' ) != - 1 || relative _url . indexOf ( 'javascript:' ) != - 1 )
return relative _url ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Split parts
baseURLParts = baseURL [ 'path' ] . split ( '/' ) ;
relURLParts = relURL [ 'path' ] . split ( '/' ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Remove empty chunks
var newBaseURLParts = new Array ( ) ;
for ( var i = baseURLParts . length - 1 ; i >= 0 ; i -- ) {
if ( baseURLParts [ i ] . length == 0 )
continue ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
newBaseURLParts [ newBaseURLParts . length ] = baseURLParts [ i ] ;
}
baseURLParts = newBaseURLParts . reverse ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Merge relURLParts chunks
var newRelURLParts = new Array ( ) ;
var numBack = 0 ;
for ( var i = relURLParts . length - 1 ; i >= 0 ; i -- ) {
if ( relURLParts [ i ] . length == 0 || relURLParts [ i ] == "." )
continue ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( relURLParts [ i ] == '..' ) {
numBack ++ ;
continue ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( numBack > 0 ) {
numBack -- ;
continue ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
newRelURLParts [ newRelURLParts . length ] = relURLParts [ i ] ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
relURLParts = newRelURLParts . reverse ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Remove end from absolute path
var len = baseURLParts . length - numBack ;
var absPath = ( len <= 0 ? "" : "/" ) + baseURLParts . slice ( 0 , len ) . join ( '/' ) + "/" + relURLParts . join ( '/' ) ;
var start = "" , end = "" ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Build output URL
relURL . protocol = baseURL . protocol ;
relURL . host = baseURL . host ;
relURL . port = baseURL . port ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Re-add trailing slash if it's removed
if ( relURL . path . charAt ( relURL . path . length - 1 ) == "/" )
absPath += "/" ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
relURL . path = absPath ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return this . serializeURL ( relURL ) ;
} ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
TinyMCE _Engine . prototype . convertURL = function ( url , node , on _save ) {
var prot = document . location . protocol ;
var host = document . location . hostname ;
var port = document . location . port ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Pass through file protocol
if ( prot == "file:" )
return url ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Something is wrong, remove weirdness
url = tinyMCE . regexpReplace ( url , '(http|https):///' , '/' ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Mailto link or anchor (Pass through)
if ( url . indexOf ( 'mailto:' ) != - 1 || url . indexOf ( 'javascript:' ) != - 1 || tinyMCE . regexpReplace ( url , '[ \t\r\n\+]|%20' , '' ) . charAt ( 0 ) == "#" )
return url ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Fix relative/Mozilla
if ( ! tinyMCE . isMSIE && ! on _save && url . indexOf ( "://" ) == - 1 && url . charAt ( 0 ) != '/' )
return tinyMCE . settings [ 'base_href' ] + url ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Handle relative URLs
if ( on _save && tinyMCE . getParam ( 'relative_urls' ) ) {
var curl = tinyMCE . convertRelativeToAbsoluteURL ( tinyMCE . settings [ 'base_href' ] , url ) ;
if ( curl . charAt ( 0 ) == '/' )
curl = tinyMCE . settings [ 'document_base_prefix' ] + curl ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
var urlParts = tinyMCE . parseURL ( curl ) ;
var tmpUrlParts = tinyMCE . parseURL ( tinyMCE . settings [ 'document_base_url' ] ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Force relative
if ( urlParts [ 'host' ] == tmpUrlParts [ 'host' ] && ( urlParts [ 'port' ] == tmpUrlParts [ 'port' ] ) )
return tinyMCE . convertAbsoluteURLToRelativeURL ( tinyMCE . settings [ 'document_base_url' ] , curl ) ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Handle absolute URLs
if ( ! tinyMCE . getParam ( 'relative_urls' ) ) {
var urlParts = tinyMCE . parseURL ( url ) ;
var baseUrlParts = tinyMCE . parseURL ( tinyMCE . settings [ 'base_href' ] ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Force absolute URLs from relative URLs
url = tinyMCE . convertRelativeToAbsoluteURL ( tinyMCE . settings [ 'base_href' ] , url ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// If anchor and path is the same page
if ( urlParts [ 'anchor' ] && urlParts [ 'path' ] == baseUrlParts [ 'path' ] )
return "#" + urlParts [ 'anchor' ] ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
// Remove current domain
if ( tinyMCE . getParam ( 'remove_script_host' ) ) {
var start = "" , portPart = "" ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( port != "" )
portPart = ":" + port ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
start = prot + "//" + host + portPart + "/" ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( url . indexOf ( start ) == 0 )
url = url . substring ( start . length - 1 ) ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return url ;
} ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
TinyMCE _Engine . prototype . convertAllRelativeURLs = function ( body ) {
// Convert all image URL:s to absolute URL
var elms = body . getElementsByTagName ( "img" ) ;
for ( var i = 0 ; i < elms . length ; i ++ ) {
var src = tinyMCE . getAttrib ( elms [ i ] , 'src' ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
var msrc = tinyMCE . getAttrib ( elms [ i ] , 'mce_src' ) ;
if ( msrc != "" )
src = msrc ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( src != "" ) {
src = tinyMCE . convertRelativeToAbsoluteURL ( tinyMCE . settings [ 'base_href' ] , src ) ;
elms [ i ] . setAttribute ( "src" , src ) ;
}
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
// Convert all link URL:s to absolute URL
var elms = body . getElementsByTagName ( "a" ) ;
for ( var i = 0 ; i < elms . length ; i ++ ) {
var href = tinyMCE . getAttrib ( elms [ i ] , 'href' ) ;
var mhref = tinyMCE . getAttrib ( elms [ i ] , 'mce_href' ) ;
if ( mhref != "" )
href = mhref ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( href && href != "" ) {
href = tinyMCE . convertRelativeToAbsoluteURL ( tinyMCE . settings [ 'base_href' ] , href ) ;
elms [ i ] . setAttribute ( "href" , href ) ;
}
}
} ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
/* file:jscripts/tiny_mce/classes/TinyMCE_Array.class.js */
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
TinyMCE _Engine . prototype . clearArray = function ( a ) {
for ( var k in a )
a [ k ] = null ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return a ;
2005-12-04 22:04:25 -05:00
} ;
2006-03-30 02:50:33 -05:00
/* file:jscripts/tiny_mce/classes/TinyMCE_Event.class.js */
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
TinyMCE _Engine . prototype . _setEventsEnabled = function ( node , state ) {
var events = new Array ( 'onfocus' , 'onblur' , 'onclick' , 'ondblclick' ,
'onmousedown' , 'onmouseup' , 'onmouseover' , 'onmousemove' ,
'onmouseout' , 'onkeypress' , 'onkeydown' , 'onkeydown' , 'onkeyup' ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
var evs = tinyMCE . settings [ 'event_elements' ] . split ( ',' ) ;
for ( var y = 0 ; y < evs . length ; y ++ ) {
var elms = node . getElementsByTagName ( evs [ y ] ) ;
for ( var i = 0 ; i < elms . length ; i ++ ) {
var event = "" ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
for ( var x = 0 ; x < events . length ; x ++ ) {
if ( ( event = tinyMCE . getAttrib ( elms [ i ] , events [ x ] ) ) != '' ) {
event = tinyMCE . cleanupEventStr ( "" + event ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( ! state )
event = "return true;" + event ;
else
event = event . replace ( /^return true;/gi , '' ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
elms [ i ] . removeAttribute ( events [ x ] ) ;
elms [ i ] . setAttribute ( events [ x ] , event ) ;
}
}
}
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
} ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
TinyMCE _Engine . prototype . _eventPatch = function ( editor _id ) {
var n , inst , win , e ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Remove odd, error
if ( typeof ( tinyMCE ) == "undefined" )
return true ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
try {
// Try selected instance first
if ( tinyMCE . selectedInstance ) {
win = tinyMCE . selectedInstance . getWin ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( win && win . event ) {
e = win . event ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( ! e . target )
e . target = e . srcElement ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
TinyMCE _Engine . prototype . handleEvent ( e ) ;
return ;
}
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Search for it
for ( n in tinyMCE . instances ) {
inst = tinyMCE . instances [ n ] ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( ! tinyMCE . isInstance ( inst ) )
continue ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
tinyMCE . selectedInstance = inst ;
win = inst . getWin ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( win && win . event ) {
e = win . event ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( ! e . target )
e . target = e . srcElement ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
TinyMCE _Engine . prototype . handleEvent ( e ) ;
return ;
}
}
} catch ( ex ) {
// Ignore error if iframe is pointing to external URL
}
2005-12-04 22:04:25 -05:00
} ;
2006-03-30 02:50:33 -05:00
TinyMCE _Engine . prototype . unloadHandler = function ( ) {
tinyMCE . triggerSave ( true , true ) ;
2005-12-04 22:04:25 -05:00
} ;
2006-03-30 02:50:33 -05:00
TinyMCE _Engine . prototype . addEventHandlers = function ( inst ) {
var doc = inst . getDoc ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
inst . switchSettings ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . isMSIE ) {
tinyMCE . addEvent ( doc , "keypress" , TinyMCE _Engine . prototype . _eventPatch ) ;
tinyMCE . addEvent ( doc , "keyup" , TinyMCE _Engine . prototype . _eventPatch ) ;
tinyMCE . addEvent ( doc , "keydown" , TinyMCE _Engine . prototype . _eventPatch ) ;
tinyMCE . addEvent ( doc , "mouseup" , TinyMCE _Engine . prototype . _eventPatch ) ;
tinyMCE . addEvent ( doc , "click" , TinyMCE _Engine . prototype . _eventPatch ) ;
} else {
tinyMCE . addEvent ( doc , "keypress" , tinyMCE . handleEvent ) ;
tinyMCE . addEvent ( doc , "keydown" , tinyMCE . handleEvent ) ;
tinyMCE . addEvent ( doc , "keyup" , tinyMCE . handleEvent ) ;
tinyMCE . addEvent ( doc , "click" , tinyMCE . handleEvent ) ;
tinyMCE . addEvent ( doc , "mouseup" , tinyMCE . handleEvent ) ;
tinyMCE . addEvent ( doc , "mousedown" , tinyMCE . handleEvent ) ;
tinyMCE . addEvent ( doc , "focus" , tinyMCE . handleEvent ) ;
tinyMCE . addEvent ( doc , "blur" , tinyMCE . handleEvent ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
eval ( 'try { doc.designMode = "On"; } catch(e) {}' ) ; // Force designmode
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
} ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
TinyMCE _Engine . prototype . onMouseMove = function ( ) {
var inst ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( ! tinyMCE . hasMouseMoved ) {
inst = tinyMCE . selectedInstance ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Workaround for bug #1437457 (Odd MSIE bug)
if ( inst . isFocused ) {
inst . undoBookmark = inst . selection . getBookmark ( ) ;
tinyMCE . hasMouseMoved = true ;
2005-12-04 22:04:25 -05:00
}
}
2006-03-30 02:50:33 -05:00
// tinyMCE.cancelEvent(inst.getWin().event);
// return false;
2005-12-04 22:04:25 -05:00
} ;
2006-03-30 02:50:33 -05:00
TinyMCE _Engine . prototype . cancelEvent = function ( e ) {
if ( tinyMCE . isMSIE ) {
e . returnValue = false ;
e . cancelBubble = true ;
} else
e . preventDefault ( ) ;
2005-12-04 22:04:25 -05:00
} ;
2006-03-30 02:50:33 -05:00
TinyMCE _Engine . prototype . addEvent = function ( o , n , h ) {
if ( o . attachEvent )
o . attachEvent ( "on" + n , h ) ;
else
o . addEventListener ( n , h , false ) ;
} ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
TinyMCE _Engine . prototype . addSelectAccessibility = function ( e , s , w ) {
// Add event handlers
if ( ! s . _isAccessible ) {
s . onkeydown = tinyMCE . accessibleEventHandler ;
s . onblur = tinyMCE . accessibleEventHandler ;
s . _isAccessible = true ;
s . _win = w ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
return false ;
} ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
TinyMCE _Engine . prototype . accessibleEventHandler = function ( e ) {
var win = this . _win ;
e = tinyMCE . isMSIE ? win . event : e ;
var elm = tinyMCE . isMSIE ? e . srcElement : e . target ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Unpiggyback onchange on blur
if ( e . type == "blur" ) {
if ( elm . oldonchange ) {
elm . onchange = elm . oldonchange ;
elm . oldonchange = null ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return true ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Piggyback onchange
if ( elm . nodeName == "SELECT" && ! elm . oldonchange ) {
elm . oldonchange = elm . onchange ;
elm . onchange = null ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Execute onchange and remove piggyback
if ( e . keyCode == 13 || e . keyCode == 32 ) {
elm . onchange = elm . oldonchange ;
elm . onchange ( ) ;
elm . oldonchange = null ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
tinyMCE . cancelEvent ( e ) ;
return false ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return true ;
} ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
/* file:jscripts/tiny_mce/classes/TinyMCE_Selection.class.js */
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
function TinyMCE _Selection ( inst ) {
this . instance = inst ;
} ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
TinyMCE _Selection . prototype = {
getSelectedHTML : function ( ) {
var inst = this . instance ;
var e , r = this . getRng ( ) , h ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . isSafari ) {
// Not realy perfect!!
return r . toString ( ) ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
e = document . createElement ( "body" ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . isGecko )
e . appendChild ( r . cloneContents ( ) ) ;
else
e . innerHTML = r . htmlText ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
h = tinyMCE . _cleanupHTML ( inst , inst . contentDocument , inst . settings , e , e , false , true , false ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// When editing always use fonts internaly
if ( tinyMCE . getParam ( "convert_fonts_to_spans" ) )
tinyMCE . convertSpansToFonts ( inst . getDoc ( ) ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return h ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
getSelectedText : function ( ) {
var inst = this . instance ;
var d , r , s , t ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . isMSIE ) {
d = inst . getDoc ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( d . selection . type == "Text" ) {
r = d . selection . createRange ( ) ;
t = r . text ;
} else
t = '' ;
} else {
s = this . getSel ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( s && s . toString )
t = s . toString ( ) ;
else
t = '' ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return t ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
getBookmark : function ( simple ) {
var rng = this . getRng ( ) ;
var doc = this . instance . getDoc ( ) ;
var sp , le , s , e , nl , i , si , ei ;
var trng , sx , sy , xx = - 999999999 ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Skip Opera for now
if ( tinyMCE . isOpera )
return null ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
sx = doc . body . scrollLeft + doc . documentElement . scrollLeft ;
sy = doc . body . scrollTop + doc . documentElement . scrollTop ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . isSafari || tinyMCE . isGecko )
return { rng : rng , scrollX : sx , scrollY : sy } ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . isMSIE ) {
if ( simple )
return { rng : rng } ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( rng . item ) {
e = rng . item ( 0 ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
nl = doc . getElementsByTagName ( e . nodeName ) ;
for ( i = 0 ; i < nl . length ; i ++ ) {
if ( e == nl [ i ] ) {
sp = i ;
break ;
}
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return {
tag : e . nodeName ,
index : sp ,
scrollX : sx ,
scrollY : sy
} ;
} else {
trng = rng . duplicate ( ) ;
trng . collapse ( true ) ;
sp = Math . abs ( trng . move ( 'character' , xx ) ) ;
trng = rng . duplicate ( ) ;
trng . collapse ( false ) ;
le = Math . abs ( trng . move ( 'character' , xx ) ) - sp ;
return {
start : sp ,
length : le ,
scrollX : sx ,
scrollY : sy
} ;
}
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . isGecko ) {
s = tinyMCE . getParentElement ( rng . startContainer ) ;
for ( si = 0 ; si < s . childNodes . length && s . childNodes [ si ] != rng . startContainer ; si ++ ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
nl = doc . getElementsByTagName ( s . nodeName ) ;
for ( i = 0 ; i < nl . length ; i ++ ) {
if ( s == nl [ i ] ) {
sp = i ;
break ;
}
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
e = tinyMCE . getParentElement ( rng . endContainer ) ;
for ( ei = 0 ; ei < e . childNodes . length && e . childNodes [ ei ] != rng . endContainer ; ei ++ ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
nl = doc . getElementsByTagName ( e . nodeName ) ;
for ( i = 0 ; i < nl . length ; i ++ ) {
if ( e == nl [ i ] ) {
le = i ;
break ;
}
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
//tinyMCE.debug(s.nodeName, sp, rng.startOffset, '-' , e.nodeName, le, rng.endOffset);
//tinyMCE.debug(sx, sy);
return {
startTag : s . nodeName ,
start : sp ,
startIndex : si ,
endTag : e . nodeName ,
end : le ,
endIndex : ei ,
startOffset : rng . startOffset ,
endOffset : rng . endOffset ,
scrollX : sx ,
scrollY : sy
} ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return null ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
moveToBookmark : function ( bookmark ) {
var rng , nl , i ;
var inst = this . instance ;
var doc = inst . getDoc ( ) ;
var win = inst . getWin ( ) ;
var sel = this . getSel ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( ! bookmark )
return false ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . isSafari ) {
sel . setBaseAndExtent ( bookmark . startContainer , bookmark . startOffset , bookmark . endContainer , bookmark . endOffset ) ;
return true ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . isMSIE ) {
if ( bookmark . rng ) {
bookmark . rng . select ( ) ;
return true ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
win . focus ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( bookmark . tag ) {
rng = inst . getBody ( ) . createControlRange ( ) ;
nl = doc . getElementsByTagName ( bookmark . tag ) ;
if ( nl . length > bookmark . index )
rng . addElement ( nl [ bookmark . index ] ) ;
2005-12-04 22:04:25 -05:00
} else {
2006-03-30 02:50:33 -05:00
rng = inst . getSel ( ) . createRange ( ) ;
rng . moveToElementText ( inst . getBody ( ) ) ;
rng . collapse ( true ) ;
rng . moveStart ( 'character' , bookmark . start ) ;
rng . moveEnd ( 'character' , bookmark . length ) ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
rng . select ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
win . scrollTo ( bookmark . scrollX , bookmark . scrollY ) ;
return true ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . isGecko && bookmark . rng ) {
sel . removeAllRanges ( ) ;
sel . addRange ( bookmark . rng ) ;
win . scrollTo ( bookmark . scrollX , bookmark . scrollY ) ;
return true ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . isGecko ) {
// try {
rng = doc . createRange ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
nl = doc . getElementsByTagName ( bookmark . startTag ) ;
if ( nl . length > bookmark . start )
rng . setStart ( nl [ bookmark . start ] . childNodes [ bookmark . startIndex ] , bookmark . startOffset ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
nl = doc . getElementsByTagName ( bookmark . endTag ) ;
if ( nl . length > bookmark . end )
rng . setEnd ( nl [ bookmark . end ] . childNodes [ bookmark . endIndex ] , bookmark . endOffset ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
sel . removeAllRanges ( ) ;
sel . addRange ( rng ) ;
/ * } c a t c h {
// Ignore
} * /
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
win . scrollTo ( bookmark . scrollX , bookmark . scrollY ) ;
return true ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return false ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
selectNode : function ( node , collapse , select _text _node , to _start ) {
var inst = this . instance , sel , rng , nodes ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( ! node )
return ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( typeof ( collapse ) == "undefined" )
collapse = true ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( typeof ( select _text _node ) == "undefined" )
select _text _node = false ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( typeof ( to _start ) == "undefined" )
to _start = true ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . isMSIE ) {
rng = inst . getBody ( ) . createTextRange ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
try {
rng . moveToElementText ( node ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( collapse )
rng . collapse ( to _start ) ;
rng . select ( ) ;
} catch ( e ) {
// Throws illigal agrument in MSIE some times
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
} else {
sel = this . getSel ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( ! sel )
return ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . isSafari ) {
sel . setBaseAndExtent ( node , 0 , node , node . innerText . length ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( collapse ) {
if ( to _start )
sel . collapseToStart ( ) ;
else
sel . collapseToEnd ( ) ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
this . scrollToNode ( node ) ;
return ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
rng = inst . getDoc ( ) . createRange ( ) ;
if ( select _text _node ) {
// Find first textnode in tree
nodes = tinyMCE . getNodeTree ( node , new Array ( ) , 3 ) ;
if ( nodes . length > 0 )
rng . selectNodeContents ( nodes [ 0 ] ) ;
else
rng . selectNodeContents ( node ) ;
} else
rng . selectNode ( node ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( collapse ) {
// Special treatment of textnode collapse
if ( ! to _start && node . nodeType == 3 ) {
rng . setStart ( node , node . nodeValue . length ) ;
rng . setEnd ( node , node . nodeValue . length ) ;
} else
rng . collapse ( to _start ) ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
sel . removeAllRanges ( ) ;
sel . addRange ( rng ) ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
this . scrollToNode ( node ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Set selected element
tinyMCE . selectedElement = null ;
if ( node . nodeType == 1 )
tinyMCE . selectedElement = node ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
scrollToNode : function ( node ) {
var inst = this . instance ;
var pos , doc , scrollX , scrollY , height ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Scroll to node position
pos = tinyMCE . getAbsPosition ( node ) ;
doc = inst . getDoc ( ) ;
scrollX = doc . body . scrollLeft + doc . documentElement . scrollLeft ;
scrollY = doc . body . scrollTop + doc . documentElement . scrollTop ;
height = tinyMCE . isMSIE ? document . getElementById ( inst . editorId ) . style . pixelHeight : inst . targetElement . clientHeight ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Only scroll if out of visible area
if ( ! tinyMCE . settings [ 'auto_resize' ] && ! ( pos . absTop > scrollY && pos . absTop < ( scrollY - 25 + height ) ) )
inst . contentWindow . scrollTo ( pos . absLeft , pos . absTop - height + 25 ) ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
getSel : function ( ) {
var inst = this . instance ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . isMSIE && ! tinyMCE . isOpera )
return inst . getDoc ( ) . selection ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return inst . contentWindow . getSelection ( ) ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
getRng : function ( ) {
var inst = this . instance ;
var sel = this . getSel ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( sel == null )
return null ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . isMSIE && ! tinyMCE . isOpera )
return sel . createRange ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . isSafari && ! sel . getRangeAt )
return '' + window . getSelection ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return sel . getRangeAt ( 0 ) ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
getFocusElement : function ( ) {
var inst = this . instance ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . isMSIE && ! tinyMCE . isOpera ) {
var doc = inst . getDoc ( ) ;
var rng = doc . selection . createRange ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// if (rng.collapse)
// rng.collapse(true);
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
var elm = rng . item ? rng . item ( 0 ) : rng . parentElement ( ) ;
} else {
if ( inst . isHidden ( ) )
return inst . getBody ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
var sel = this . getSel ( ) ;
var rng = this . getRng ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( ! sel || ! rng )
return null ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
var elm = rng . commonAncestorContainer ;
//var elm = (sel && sel.anchorNode) ? sel.anchorNode : null;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Handle selection a image or other control like element such as anchors
if ( ! rng . collapsed ) {
// Is selection small
if ( rng . startContainer == rng . endContainer ) {
if ( rng . startOffset - rng . endOffset < 2 ) {
if ( rng . startContainer . hasChildNodes ( ) )
elm = rng . startContainer . childNodes [ rng . startOffset ] ;
}
}
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
// Get the element parent of the node
elm = tinyMCE . getParentElement ( elm ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
//if (tinyMCE.selectedElement != null && tinyMCE.selectedElement.nodeName.toLowerCase() == "img")
// elm = tinyMCE.selectedElement;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return elm ;
}
} ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
/* file:jscripts/tiny_mce/classes/TinyMCE_UndoRedo.class.js */
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
function TinyMCE _UndoRedo ( inst ) {
this . instance = inst ;
this . undoLevels = new Array ( ) ;
this . undoIndex = 0 ;
this . typingUndoIndex = - 1 ;
this . undoRedo = true ;
} ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
TinyMCE _UndoRedo . prototype = {
add : function ( l ) {
var b ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( l ) {
this . undoLevels [ this . undoLevels . length ] = l ;
return true ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
var inst = this . instance ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( this . typingUndoIndex != - 1 ) {
this . undoIndex = this . typingUndoIndex ;
// tinyMCE.debug("Override: " + this.undoIndex);
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
var newHTML = tinyMCE . trim ( inst . getBody ( ) . innerHTML ) ;
if ( this . undoLevels [ this . undoIndex ] && newHTML != this . undoLevels [ this . undoIndex ] . content ) {
//tinyMCE.debug(newHTML, this.undoLevels[this.undoIndex]);
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
tinyMCE . dispatchCallback ( inst , 'onchange_callback' , 'onChange' , inst ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Time to compress
var customUndoLevels = tinyMCE . settings [ 'custom_undo_redo_levels' ] ;
if ( customUndoLevels != - 1 && this . undoLevels . length > customUndoLevels ) {
for ( var i = 0 ; i < this . undoLevels . length - 1 ; i ++ ) {
//tinyMCE.debug(this.undoLevels[i] + "=" + this.undoLevels[i+1]);
this . undoLevels [ i ] = this . undoLevels [ i + 1 ] ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
this . undoLevels . length -- ;
this . undoIndex -- ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
b = inst . undoBookmark ;
if ( ! b )
b = inst . selection . getBookmark ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
this . undoIndex ++ ;
this . undoLevels [ this . undoIndex ] = {
content : newHTML ,
bookmark : b
} ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
this . undoLevels . length = this . undoIndex + 1 ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
//tinyMCE.debug("level added" + this.undoIndex);
return true ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// tinyMCE.debug(this.undoIndex + "," + (this.undoLevels.length-1));
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return false ;
} ,
undo : function ( ) {
var inst = this . instance ;
// Do undo
if ( this . undoIndex > 0 ) {
this . undoIndex -- ;
tinyMCE . setInnerHTML ( inst . getBody ( ) , this . undoLevels [ this . undoIndex ] . content ) ;
inst . repaint ( ) ;
if ( inst . settings . custom _undo _redo _restore _selection )
inst . selection . moveToBookmark ( this . undoLevels [ this . undoIndex ] . bookmark ) ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// tinyMCE.debug("Undo - undo levels:" + this.undoLevels.length + ", undo index: " + this.undoIndex);
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
redo : function ( ) {
var inst = this . instance ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
tinyMCE . execCommand ( "mceEndTyping" ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( this . undoIndex < ( this . undoLevels . length - 1 ) ) {
this . undoIndex ++ ;
tinyMCE . setInnerHTML ( inst . getBody ( ) , this . undoLevels [ this . undoIndex ] . content ) ;
inst . repaint ( ) ;
// if (this.undoIndex > 0)
// inst.selection.moveToBookmark(this.undoLevels[this.undoIndex-1].bookmark);
if ( inst . settings . custom _undo _redo _restore _selection )
inst . selection . moveToBookmark ( this . undoLevels [ this . undoIndex ] . bookmark ) ;
// tinyMCE.debug("Redo - undo levels:" + this.undoLevels.length + ", undo index: " + this.undoIndex);
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
tinyMCE . triggerNodeChange ( ) ;
}
} ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
/* file:jscripts/tiny_mce/classes/TinyMCE_ForceParagraphs.class.js */
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
var TinyMCE _ForceParagraphs = {
_insertPara : function ( inst , e ) {
function isEmpty ( para ) {
function isEmptyHTML ( html ) {
return html . replace ( new RegExp ( '[ \t\r\n]+' , 'g' ) , '' ) . toLowerCase ( ) == "" ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
// Check for images
if ( para . getElementsByTagName ( "img" ) . length > 0 )
return false ;
// Check for tables
if ( para . getElementsByTagName ( "table" ) . length > 0 )
return false ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Check for HRs
if ( para . getElementsByTagName ( "hr" ) . length > 0 )
return false ;
// Check all textnodes
var nodes = tinyMCE . getNodeTree ( para , new Array ( ) , 3 ) ;
for ( var i = 0 ; i < nodes . length ; i ++ ) {
if ( ! isEmptyHTML ( nodes [ i ] . nodeValue ) )
return false ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
// No images, no tables, no hrs, no text content then it's empty
return true ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
var doc = inst . getDoc ( ) ;
var sel = inst . getSel ( ) ;
var win = inst . contentWindow ;
var rng = sel . getRangeAt ( 0 ) ;
var body = doc . body ;
var rootElm = doc . documentElement ;
var blockName = "P" ;
// tinyMCE.debug(body.innerHTML);
// debug(e.target, sel.anchorNode.nodeName, sel.focusNode.nodeName, rng.startContainer, rng.endContainer, rng.commonAncestorContainer, sel.anchorOffset, sel.focusOffset, rng.toString());
// Setup before range
var rngBefore = doc . createRange ( ) ;
rngBefore . setStart ( sel . anchorNode , sel . anchorOffset ) ;
rngBefore . collapse ( true ) ;
// Setup after range
var rngAfter = doc . createRange ( ) ;
rngAfter . setStart ( sel . focusNode , sel . focusOffset ) ;
rngAfter . collapse ( true ) ;
// Setup start/end points
var direct = rngBefore . compareBoundaryPoints ( rngBefore . START _TO _END , rngAfter ) < 0 ;
var startNode = direct ? sel . anchorNode : sel . focusNode ;
var startOffset = direct ? sel . anchorOffset : sel . focusOffset ;
var endNode = direct ? sel . focusNode : sel . anchorNode ;
var endOffset = direct ? sel . focusOffset : sel . anchorOffset ;
startNode = startNode . nodeName == "BODY" ? startNode . firstChild : startNode ;
endNode = endNode . nodeName == "BODY" ? endNode . firstChild : endNode ;
// tinyMCE.debug(startNode, endNode);
// Get block elements
var startBlock = tinyMCE . getParentBlockElement ( startNode ) ;
var endBlock = tinyMCE . getParentBlockElement ( endNode ) ;
// Use current block name
if ( startBlock != null ) {
blockName = startBlock . nodeName ;
// Use P instead
if ( blockName == "TD" || blockName == "TABLE" || ( blockName == "DIV" && new RegExp ( 'left|right' , 'gi' ) . test ( startBlock . style . cssFloat ) ) )
blockName = "P" ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Within a list use normal behaviour
if ( tinyMCE . getParentElement ( startBlock , "OL,UL" ) != null )
return false ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Within a table create new paragraphs
if ( ( startBlock != null && startBlock . nodeName == "TABLE" ) || ( endBlock != null && endBlock . nodeName == "TABLE" ) )
startBlock = endBlock = null ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Setup new paragraphs
var paraBefore = ( startBlock != null && startBlock . nodeName == blockName ) ? startBlock . cloneNode ( false ) : doc . createElement ( blockName ) ;
var paraAfter = ( endBlock != null && endBlock . nodeName == blockName ) ? endBlock . cloneNode ( false ) : doc . createElement ( blockName ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Is header, then force paragraph under
if ( /^(H[1-6])$/ . test ( blockName ) )
paraAfter = doc . createElement ( "p" ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Setup chop nodes
var startChop = startNode ;
var endChop = endNode ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Get startChop node
node = startChop ;
do {
if ( node == body || node . nodeType == 9 || tinyMCE . isBlockElement ( node ) )
break ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
startChop = node ;
} while ( ( node = node . previousSibling ? node . previousSibling : node . parentNode ) ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Get endChop node
node = endChop ;
do {
if ( node == body || node . nodeType == 9 || tinyMCE . isBlockElement ( node ) )
break ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
endChop = node ;
} while ( ( node = node . nextSibling ? node . nextSibling : node . parentNode ) ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Fix when only a image is within the TD
if ( startChop . nodeName == "TD" )
startChop = startChop . firstChild ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( endChop . nodeName == "TD" )
endChop = endChop . lastChild ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// If not in a block element
if ( startBlock == null ) {
// Delete selection
rng . deleteContents ( ) ;
sel . removeAllRanges ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( startChop != rootElm && endChop != rootElm ) {
// Insert paragraph before
rngBefore = rng . cloneRange ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( startChop == body )
rngBefore . setStart ( startChop , 0 ) ;
else
rngBefore . setStartBefore ( startChop ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
paraBefore . appendChild ( rngBefore . cloneContents ( ) ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Insert paragraph after
if ( endChop . parentNode . nodeName == blockName )
endChop = endChop . parentNode ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// If not after image
//if (rng.startContainer.nodeName != "BODY" && rng.endContainer.nodeName != "BODY")
rng . setEndAfter ( endChop ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( endChop . nodeName != "#text" && endChop . nodeName != "BODY" )
rngBefore . setEndAfter ( endChop ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
var contents = rng . cloneContents ( ) ;
if ( contents . firstChild && ( contents . firstChild . nodeName == blockName || contents . firstChild . nodeName == "BODY" ) )
paraAfter . innerHTML = contents . firstChild . innerHTML ;
else
paraAfter . appendChild ( contents ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Check if it's a empty paragraph
if ( isEmpty ( paraBefore ) )
paraBefore . innerHTML = " " ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Check if it's a empty paragraph
if ( isEmpty ( paraAfter ) )
paraAfter . innerHTML = " " ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Delete old contents
rng . deleteContents ( ) ;
rngAfter . deleteContents ( ) ;
rngBefore . deleteContents ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Insert new paragraphs
paraAfter . normalize ( ) ;
rngBefore . insertNode ( paraAfter ) ;
paraBefore . normalize ( ) ;
rngBefore . insertNode ( paraBefore ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// tinyMCE.debug("1: ", paraBefore.innerHTML, paraAfter.innerHTML);
2005-12-04 22:04:25 -05:00
} else {
2006-03-30 02:50:33 -05:00
body . innerHTML = "<" + blockName + "> </" + blockName + "><" + blockName + "> </" + blockName + ">" ;
paraAfter = body . childNodes [ 1 ] ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
inst . selection . selectNode ( paraAfter , true , true ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return true ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Place first part within new paragraph
if ( startChop . nodeName == blockName )
rngBefore . setStart ( startChop , 0 ) ;
else
rngBefore . setStartBefore ( startChop ) ;
rngBefore . setEnd ( startNode , startOffset ) ;
paraBefore . appendChild ( rngBefore . cloneContents ( ) ) ;
// Place secound part within new paragraph
rngAfter . setEndAfter ( endChop ) ;
rngAfter . setStart ( endNode , endOffset ) ;
var contents = rngAfter . cloneContents ( ) ;
if ( contents . firstChild && contents . firstChild . nodeName == blockName ) {
/ * v a r n o d e s = c o n t e n t s . f i r s t C h i l d . c h i l d N o d e s ;
for ( var i = 0 ; i < nodes . length ; i ++ ) {
//tinyMCE.debug(nodes[i].nodeName);
if ( nodes [ i ] . nodeName != "BODY" )
paraAfter . appendChild ( nodes [ i ] ) ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
* /
paraAfter . innerHTML = contents . firstChild . innerHTML ;
} else
paraAfter . appendChild ( contents ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Check if it's a empty paragraph
if ( isEmpty ( paraBefore ) )
paraBefore . innerHTML = " " ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Check if it's a empty paragraph
if ( isEmpty ( paraAfter ) )
paraAfter . innerHTML = " " ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Create a range around everything
var rng = doc . createRange ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( ! startChop . previousSibling && startChop . parentNode . nodeName . toUpperCase ( ) == blockName ) {
rng . setStartBefore ( startChop . parentNode ) ;
} else {
if ( rngBefore . startContainer . nodeName . toUpperCase ( ) == blockName && rngBefore . startOffset == 0 )
rng . setStartBefore ( rngBefore . startContainer ) ;
else
rng . setStart ( rngBefore . startContainer , rngBefore . startOffset ) ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( ! endChop . nextSibling && endChop . parentNode . nodeName . toUpperCase ( ) == blockName )
rng . setEndAfter ( endChop . parentNode ) ;
else
rng . setEnd ( rngAfter . endContainer , rngAfter . endOffset ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Delete all contents and insert new paragraphs
rng . deleteContents ( ) ;
rng . insertNode ( paraAfter ) ;
rng . insertNode ( paraBefore ) ;
//tinyMCE.debug("2", paraBefore.innerHTML, paraAfter.innerHTML);
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Normalize
paraAfter . normalize ( ) ;
paraBefore . normalize ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
inst . selection . selectNode ( paraAfter , true , true ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return true ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
_handleBackSpace : function ( inst ) {
var r = inst . getRng ( ) ;
var sn = r . startContainer ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( sn && sn . nextSibling && sn . nextSibling . nodeName == "BR" )
sn . nextSibling . parentNode . removeChild ( sn . nextSibling ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return false ;
}
} ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
/* file:jscripts/tiny_mce/classes/TinyMCE_Layer.class.js */
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
function TinyMCE _Layer ( id , bm ) {
this . id = id ;
this . blockerElement = null ;
this . events = false ;
this . element = null ;
this . blockMode = typeof ( bm ) != 'undefined' ? bm : true ;
} ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
TinyMCE _Layer . prototype = {
moveRelativeTo : function ( re , p ) {
var rep = this . getAbsPosition ( re ) ;
var w = parseInt ( re . offsetWidth ) ;
var h = parseInt ( re . offsetHeight ) ;
var e = this . getElement ( ) ;
var ew = parseInt ( e . offsetWidth ) ;
var eh = parseInt ( e . offsetHeight ) ;
var x , y ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
switch ( p ) {
case "tl" :
x = rep . absLeft ;
y = rep . absTop ;
break ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
case "tr" :
x = rep . absLeft + w ;
y = rep . absTop ;
break ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
case "bl" :
x = rep . absLeft ;
y = rep . absTop + h ;
break ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
case "br" :
x = rep . absLeft + w ;
y = rep . absTop + h ;
break ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
case "cc" :
x = rep . absLeft + ( w / 2 ) - ( ew / 2 ) ;
y = rep . absTop + ( h / 2 ) - ( eh / 2 ) ;
break ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
this . moveTo ( x , y ) ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
moveBy : function ( x , y ) {
var e = this . getElement ( ) ;
this . moveTo ( parseInt ( e . style . left ) + x , parseInt ( e . style . top ) + y ) ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
moveTo : function ( x , y ) {
var e = this . getElement ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
e . style . left = x + "px" ;
e . style . top = y + "px" ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
this . updateBlocker ( ) ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
resizeBy : function ( w , h ) {
var e = this . getElement ( ) ;
this . resizeTo ( parseInt ( e . style . width ) + w , parseInt ( e . style . height ) + h ) ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
resizeTo : function ( w , h ) {
var e = this . getElement ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
e . style . width = w + "px" ;
e . style . height = h + "px" ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
this . updateBlocker ( ) ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
show : function ( ) {
this . getElement ( ) . style . display = 'block' ;
this . updateBlocker ( ) ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
hide : function ( ) {
this . getElement ( ) . style . display = 'none' ;
this . updateBlocker ( ) ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
isVisible : function ( ) {
return this . getElement ( ) . style . display == 'block' ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
getElement : function ( ) {
if ( ! this . element )
this . element = document . getElementById ( this . id ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return this . element ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
setBlockMode : function ( s ) {
this . blockMode = s ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
updateBlocker : function ( ) {
var e , b , x , y , w , h ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
b = this . getBlocker ( ) ;
if ( b ) {
if ( this . blockMode ) {
e = this . getElement ( ) ;
x = this . parseInt ( e . style . left ) ;
y = this . parseInt ( e . style . top ) ;
w = this . parseInt ( e . offsetWidth ) ;
h = this . parseInt ( e . offsetHeight ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
b . style . left = x + 'px' ;
b . style . top = y + 'px' ;
b . style . width = w + 'px' ;
b . style . height = h + 'px' ;
b . style . display = e . style . display ;
} else
b . style . display = 'none' ;
}
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
getBlocker : function ( ) {
var d , b ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( ! this . blockerElement && this . blockMode ) {
d = document ;
b = d . createElement ( "iframe" ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
b . style . cssText = 'display: none; position: absolute; left: 0; top: 0' ;
b . src = 'javascript:false;' ;
b . frameBorder = '0' ;
b . scrolling = 'no' ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
d . body . appendChild ( b ) ;
this . blockerElement = b ;
}
return this . blockerElement ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
getAbsPosition : function ( n ) {
var p = { absLeft : 0 , absTop : 0 } ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
while ( n ) {
p . absLeft += n . offsetLeft ;
p . absTop += n . offsetTop ;
n = n . offsetParent ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return p ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
create : function ( n , c , p ) {
var d = document , e = d . createElement ( n ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
e . setAttribute ( 'id' , this . id ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( c )
e . className = c ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( ! p )
p = d . body ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
p . appendChild ( e ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return this . element = e ;
} ,
/ *
addCSSClass : function ( e , c ) {
this . removeCSSClass ( e , c ) ;
var a = this . explode ( ' ' , e . className ) ;
a [ a . length ] = c ;
e . className = a . join ( ' ' ) ;
} ,
removeCSSClass : function ( e , c ) {
var a = this . explode ( ' ' , e . className ) , i ;
for ( i = 0 ; i < a . length ; i ++ ) {
if ( a [ i ] == c )
a [ i ] = '' ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
e . className = a . join ( ' ' ) ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
explode : function ( d , s ) {
var ar = s . split ( d ) ;
var oar = new Array ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
for ( var i = 0 ; i < ar . length ; i ++ ) {
if ( ar [ i ] != "" )
oar [ oar . length ] = ar [ i ] ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
return oar ;
} ,
* /
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
parseInt : function ( s ) {
if ( s == null || s == '' )
return 0 ;
return parseInt ( s ) ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
} ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
/* file:jscripts/tiny_mce/classes/TinyMCE_Menu.class.js */
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
function TinyMCE _Menu ( ) {
var id ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( typeof ( tinyMCE . menuCounter ) == "undefined" )
tinyMCE . menuCounter = 0 ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
id = "mc_menu_" + tinyMCE . menuCounter ++ ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
TinyMCE _Layer . call ( this , id , true ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
this . id = id ;
this . items = new Array ( ) ;
this . needsUpdate = true ;
} ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Extends the TinyMCE_Layer class
TinyMCE _Menu . prototype = tinyMCE . extend ( TinyMCE _Layer . prototype , {
init : function ( s ) {
var n ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
// Default params
this . settings = {
separator _class : 'mceMenuSeparator' ,
title _class : 'mceMenuTitle' ,
disabled _class : 'mceMenuDisabled' ,
menu _class : 'mceMenu' ,
drop _menu : true
} ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
for ( n in s )
this . settings [ n ] = s [ n ] ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
this . create ( 'div' , this . settings . menu _class ) ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
clear : function ( ) {
this . items = new Array ( ) ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
addTitle : function ( t ) {
this . add ( { type : 'title' , text : t } ) ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
addDisabled : function ( t ) {
this . add ( { type : 'disabled' , text : t } ) ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
addSeparator : function ( ) {
this . add ( { type : 'separator' } ) ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
addItem : function ( t , js ) {
this . add ( { text : t , js : js } ) ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
add : function ( mi ) {
this . items [ this . items . length ] = mi ;
this . needsUpdate = true ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
update : function ( ) {
var e = this . getElement ( ) , h = '' , i , t , m = this . items , s = this . settings ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( this . settings . drop _menu )
h += '<span class="mceMenuLine"></span>' ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
h += '<table border="0" cellpadding="0" cellspacing="0">' ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
for ( i = 0 ; i < m . length ; i ++ ) {
t = tinyMCE . xmlEncode ( m [ i ] . text ) ;
c = m [ i ] . class _name ? ' class="' + m [ i ] . class _name + '"' : '' ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
switch ( m [ i ] . type ) {
case 'separator' :
h += '<tr class="' + s . separator _class + '"><td>' ;
break ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
case 'title' :
h += '<tr class="' + s . title _class + '"><td><span' + c + '>' + t + '</span>' ;
break ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
case 'disabled' :
h += '<tr class="' + s . disabled _class + '"><td><span' + c + '>' + t + '</span>' ;
break ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
default :
h += '<tr><td><a href="javascript:void(0);" onmousedown="' + tinyMCE . xmlEncode ( m [ i ] . js ) + ';return false;"><span' + c + '>' + t + '</span></a>' ;
}
h += '</td></tr>' ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
h += '</table>' ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
e . innerHTML = h ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
this . needsUpdate = false ;
this . updateBlocker ( ) ;
} ,
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
show : function ( ) {
var nl , i ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . lastMenu == this )
return ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( this . needsUpdate )
this . update ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( tinyMCE . lastMenu && tinyMCE . lastMenu != this )
tinyMCE . lastMenu . hide ( ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
this . parent . show . call ( this ) ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
if ( ! tinyMCE . isOpera ) {
// Accessibility stuff
/ * n l = t h i s . g e t E l e m e n t ( ) . g e t E l e m e n t s B y T a g N a m e ( " a " ) ;
if ( nl . length > 0 )
nl [ 0 ] . focus ( ) ; * /
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
tinyMCE . lastMenu = this ;
}
} ) ;
/* file:jscripts/tiny_mce/classes/TinyMCE_Debug.class.js */
TinyMCE _Engine . prototype . debug = function ( ) {
var m = "" , e , a , i ;
e = document . getElementById ( "tinymce_debug" ) ;
if ( ! e ) {
var d = document . createElement ( "div" ) ;
d . setAttribute ( "className" , "debugger" ) ;
d . className = "debugger" ;
d . innerHTML = 'Debug output:<textarea id="tinymce_debug" style="width: 100%; height: 300px" wrap="nowrap" mce_editable="false"></textarea>' ;
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
document . body . appendChild ( d ) ;
e = document . getElementById ( "tinymce_debug" ) ;
2005-12-04 22:04:25 -05:00
}
2006-03-30 02:50:33 -05:00
a = this . debug . arguments ;
for ( i = 0 ; i < a . length ; i ++ ) {
m += a [ i ] ;
if ( i < a . length - 1 )
m += ', ' ;
}
2005-12-04 22:04:25 -05:00
2006-03-30 02:50:33 -05:00
e . value += m + "\n" ;
} ;