You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

571 lines
12 KiB

window.RTEDownlevelInit=function(config)
{
var ua=navigator.userAgent;
if(!config.ubbmode&&ua.match(/MSIE [5678]/i))
return;
if(ua.match(/Firefox\/1\.[0-4]/i))
return;
if(ua.match(/Safari\/41/i))
return;
var _debugmode=false;
if(location.href.indexOf("://127.0.0.1")!=-1||location.href.indexOf("rtenocache")!=-1)
_debugmode=true;
var d=new Date();
var urlsuffix="2012073100" //String(d.getFullYear()*10000+(1+d.getMonth())*100+d.getDate());
if(_debugmode)
urlsuffix=d.getTime();
var _showLangWarning=false;
function createxh()
{
return window.XMLHttpRequest?new XMLHttpRequest():new ActiveXObject("Microsoft.XMLHTTP");;
}
var scriptmap={};
function asyncloadscript(url,callback,runcode)
{
var item=scriptmap[url];
if(item)
{
if(item.loading!='loading')
{
setTimeout(function()
{
callback(item.loading);
},0);
}
else
{
item.callbacks.push(callback);
}
return;
}
item={url:url,loading:'loading',callbacks:[callback]};
scriptmap[url]=item;
var index=0;
function runcallbacks()
{
var func=item.callbacks[index];
index++;
if(index<item.callbacks.length)setTimeout(runcallbacks,0);
func(item.loading);
}
var xh=createxh();
xh.open("GET",url,true);
xh.onreadystatechange=function()
{
if(xh.readyState!=4)return;
xh.onreadystatechange=new Function("","");
setTimeout(runcallbacks,0);
if(xh.status!=200)
{
item.succeed=false;
item.loading='httperror:'+xh.status;
//alert(item.loading)
throw(new Error("failed to load "+url+" , \r\n http"+xh.status));
}
try
{
var code=xh.responseText;
if(!runcode)
runcode=new Function("","eval(arguments[0])");
runcode(code);
item.loading=null;
}
catch(x)
{
item.loading='scripterror:'+x.message;
alert(x.message);
throw(new Error("failed to load "+url+" , \r\n"+x.message));
}
}
xh.send("");
}
var loader={};
loader._config=config;
config._debugmode=_debugmode;
var folder=config.folder;
if(folder.indexOf("://")==-1&&folder.charAt(0)!="/")
{
var url=window.location.href.split('#')[0].split('?')[0].split('/');
url[url.length-1]=folder;
url.splice(0,3);
config.folder=folder="/"+url.join('/');
}
config.initdate=new Date();
config._urlsuffix=urlsuffix;
var langs=[];
function runlangcode(lang,code)
{
var func=new Function("lang,__code","eval(__code)");
if(!lang._data)lang._data={};
func(lang._data,code);
}
function asyncloadlangindex(index)
{
var lang=langs[index];
if(!lang)return;
if(lang.loading)return;
lang.loading=true;
function runcode(code)
{
runlangcode(lang,code);
}
function nextstep(err)
{
lang.loading=false;
lang.loaded=true;
if(index>0)asyncloadlangindex(index+1);
}
if(!lang.loaded)
{
asyncloadscript(lang.langurl,nextstep,runcode)
}
else
{
nextstep();
}
}
function syncloadlang(lang)
{
var xh=createxh();
xh.open("GET",lang.langurl,false);
xh.send("");
if(xh.status!=200)return;
runlangcode(lang,xh.responseText);
}
loader.getLangText=function(name)
{
var showWarning=_showLangWarning;
if(!name)return "{empty}";
name=name.toLowerCase().replace(/(^\s+|\s+$)/g,"");
for(var i=0;i<langs.length;i++)
{
var lang=langs[i];
var dict=lang._data;
if(!dict)
{
if(showWarning)
{
showWarning=false;
setTimeout(function()
{
throw(new Error("Warning,sync load "+lang.langurl+" for text {"+name+"}"));
},1);
}
syncloadlang(lang);
dict=lang._data;
}
if(!dict)continue;
var text=dict[name];
if(!text)continue;
if(text.indexOf("{")!=-1&&text.indexOf("}")!=-1)
{
for(var i=1;i<arguments.length;i++)
{
text=text.split("{"+(i-1)+"}").join(arguments[i]);
}
}
return text;
}
if(config._debugmode)
return "{"+name+"}";
return name;
}
function translate_lang(val)
{
if(val.indexOf("|")==-1)
return loader.getLangText(val.substring(1));
var pairs=val.split("|");
for(var i=0;i<pairs.length;i++)
{
val=pairs[i];
if(val.charAt(0)=="@")
{
if(val.length==1)
pairs[i]="";
else
pairs[i]=loader.getLangText(val.substring(1));
}
}
return pairs.join("");
}
loader.translateText=function(text)
{
if(!text)return "";
if(text.charAt(0)=="@")
return translate_lang(text);
return text;
}
function _loadmain()
{
if(loader._loadcalled)return;
loader._loadcalled=true;
var ctrls=document.getElementsByName(config.uniqueid);
for(var i=0;i<ctrls.length;i++)
{
var ctrl=ctrls[i];
if(ctrl.nodeName=="INPUT"||ctrl.nodeName=="TEXTAREA")
loader.textarea=ctrl;
}
if(!loader.textarea)
{
//error no textarea
return;
}
loader.textareainitvalue=loader.textarea.value;
function nextstep(err)
{
if(err)
{
alert("Unable to load config.js \r\n"+err);
}
else
{
_configready()
}
};
if(config.baseconfig||window.RTE_Configuration)
_configready();
else
asyncloadscript(config.folder+"scripts/config.js?"+config._urlsuffix,nextstep)
}
function _configready()
{
var baseconfig=config.baseconfig||window.RTE_Configuration;
if(baseconfig)
{
for(var p in baseconfig)
{
if(!config.hasOwnProperty(p))
config[p]=baseconfig[p];
}
}
var csscontainer=document.getElementsByTagName("head")[0]||document.body;
if(!window.richtexteditorcss)
{
var link=document.createElement("LINK");
link.setAttribute("rel","stylesheet");
link.setAttribute("href",config.folder+"downlevel/style.css?"+config._urlsuffix);
csscontainer.insertBefore(link,csscontainer.firstChild);
window.richtexteditorcss=link;
}
config.skin_div=document.getElementById(config.containerid);
config.skin_divborder=config.skin_div.style.border;
config.skin_div.style.border="solid 1px #eeeeee";
config.skin_div.innerHTML="<table style='width:100%;height:100%;'><tr>"
+"<td style='vertical-align:center;text-align:center;'>"
+"<img src='"+config.folder+"images/"+config.loader_loadingimage+"'/></td></tr></table>";
if(config.langfiles)
{
var langarr=config.langfiles.split(',');
for(var i=0;i<langarr.length;i++)
{
langs.push({langfile:langarr[i],langurl:config.folder+"lang/"+langarr[i]+".js?"+config._urlsuffix});
}
asyncloadlangindex(0);
}
setTimeout(function()
{
_loadjsml();
},config.loader_loadcodedelay||1);
}
function _loadjsml()
{
function nextstep()
{
_loadcommonxml();
};
if(window.jsml)
nextstep();
else
asyncloadscript(config.folder+"core/jsml.js?"+config._urlsuffix,nextstep)
}
function translate_value(val)
{
if(val.charAt(0)=="@")
return translate_lang(val);
if(val.indexOf('}')==-1)
return val;
val=val.split('{folder}').join(config.folder);
val=val.split('{timems}').join(config._debugmode?new Date().getTime():config._urlsuffix);
return val;
}
function _load_jsml_xml(url,callback)
{
jsml.jsmlfolder=config.folder+"core";
var xh=jsml.xmlhttp();
xh.onreadystatechange=function()
{
if(xh.readyState<4)return;
xh.onreadystatechange=new Function();
if(xh.status==0)return;
if(xh.status!=200)
{
alert("Unable to load "+url+", http error "+xh.status);
return;
}
try
{
jsml.parse_xmldoc(xh.responseXML,null,null,null,translate_value);
}
catch(x)
{
alert("Unable to parse "+url+" , "+x.message);
return;
}
//callback();
setTimeout(callback,12);
};
xh.open("GET",url,true);
xh.send("");
}
function _loadcommonxml()
{
if(jsml.rtecommonlibraryloaded)
{
_loaduihtml();
return;
}
var url=config.folder+"downlevel/common.xml?"+config._urlsuffix;
_load_jsml_xml(url,function()
{
_loaduihtml();
});
}
function _loaduihtml()
{
config.uixmlclass=config.ubbmode?"rteubblayout":"rtehtmlayout";
if(jsml.class_exists(config.uixmlclass))
{
_loadeditorui();
return;
}
var url=config.folder+"downlevel/"+(config.ubbmode?"rteubb":"rtehtm")+".xml?"+config._urlsuffix;
_load_jsml_xml(url,_loadeditorui);
}
function _loadeditorui()
{
config.skin_div.style.border=config.skin_divborder;
jsml.suppend_layout();
config.skin_control=jsml.class_create_instance(config.uixmlclass);
config.skin_control._rteconfig=config;
config.skin_container=config.skin_control.editor_frame_container;
var width=config.skin_div.clientWidth||parseInt(config.skin_div.style.width)||760;
var height=config.skin_div.clientHeight||parseInt(config.skin_div.style.height)||480;
config.skin_control.set_width(width);
config.skin_control.set_height(height);
if(config.ubbmode)
{
loader.textbox=jsml.class_create_instance("textbox",[loader.textarea]);
//fix IE bug :
loader.textbox.set_text(loader.textareainitvalue);
loader.textbox.set_dock("fill");
config.skin_container.append_child(loader.textbox);
config.skin_div.innerHTML="";
config.skin_control.set_parent(config.skin_div);
setTimeout(_loadtextbox,1);
}
else
{
loader.textarea.style.display='none';
config.skin_div.parentNode.insertBefore(loader.textarea,config.skin_div);
config.skin_div.innerHTML="";
config.skin_control.set_parent(config.skin_div);
setTimeout(_loadframe,1);
}
jsml.resume_layout();
}
function _loadtextbox()
{
_loadscript();
}
function _loadframe()
{
var frame=document.createElement("IFRAME");
config.skin_frame=frame;
function handle_resize()
{
frame.style.width=Math.max(0,config.skin_container.get_client_width()-0)+"px";
frame.style.height=Math.max(0,config.skin_container.get_client_height()-0)+"px";
}
var frameurl=config.folder+"downlevel/blank.htm?"+config._urlsuffix;
var frameloaded=false;
function frameonload()
{
frameloaded=true;
frame.onload=new Function();
if(config.designtimeblankhtml)
{
_loadscript();
return;
}
var url=frameurl;
var xh=jsml.xmlhttp();
xh.onreadystatechange=function()
{
if(xh.readyState<4)return;
xh.onreadystatechange=new Function();
if(xh.status==0)return;
if(xh.status!=200)
{
alert("Unable to load "+url);
return;
}
config.designtimeblankhtml=xh.responseText;
_loadscript();
};
xh.open("GET",url,true);
xh.send("");
};
//frame.onload=frameonload;
frame.frameBorder=0;
frame.setAttribute("src",frameurl);
config.skin_container._content.appendChild(frame);
config.skin_container.attach_event("resize",handle_resize);
handle_resize();
//some browsers has trouble on frame.onload
function checkframeload()
{
if(frameloaded)return;
var win=frame.contentWindow;
//if(win&&win.document&&win.document.readyState=="complete")
// return frameonload();
if(win&&win.document&&win.document.body)
return frameonload();
setTimeout(checkframeload,10);
}
setTimeout(checkframeload,10);
}
function GetEditorClass()
{
return config.ubbmode?window.RTEBBCodeEditor:window.RTESimpleEditor;
}
function _loadscript()
{
if(GetEditorClass())
{
_loadeditor();
return;
}
if(config.ubbmode)
asyncloadscript(config.folder+"downlevel/rteubb.js?"+config._urlsuffix,_loadeditor);
else
asyncloadscript(config.folder+"downlevel/rtehtm.js?"+config._urlsuffix,_loadeditor);
}
function _loadeditor()
{
var frame=config.skin_frame;
var editorctor=GetEditorClass();
var editor=new editorctor(config,loader.textarea,loader);
config.skin_control._rteinstance=editor;
config.skin_control.invoke_recursive("editor_ready",editor);
asyncloadlangindex(1);
}
loader.asyncloadscript=asyncloadscript;
loader.translate_value=translate_value;
loader.load=function()
{
_loadmain();
}
loader.startLoadTimer=function(timeout)
{
loader._loadtimerid=setTimeout(_loadmain,timeout);
}
loader.cancelLoadTimer=function()
{
clearTimeout(loader._loadtimerid);
}
loader.preloadScripts=function()
{
var arr=[];
arr.push(config.folder+"scripts/config.js?"+config._urlsuffix);
arr.push(config.folder+"core/jsml.js?"+config._urlsuffix);
if(config.ubbmode)
arr.push(config.folder+"downlevel/rteubb.js?"+config._urlsuffix);
else
arr.push(config.folder+"downlevel/rtehtm.js?"+config._urlsuffix);
var index=-1;
function LoadNext()
{
var url=arr[++index];
if(url)asyncloadscript(url,LoadNext)
//else , load the xml..
}
LoadNext();
}
_loadmain();
}