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.
2435 lines
53 KiB
2435 lines
53 KiB
|
|
|
|
$rte.Editor=$rte.Core._extends(function(base,type){
|
|
|
|
var tempdiv=document.createElement("DIV");
|
|
|
|
this.init=function(config,frame,win,loader){
|
|
|
|
this._config=config;
|
|
this._loader=loader;
|
|
this._starttime=new Date().getTime();
|
|
|
|
config.skin_div.editor=this;
|
|
|
|
base.init.apply(this,[config,frame,win]);
|
|
|
|
this._FindAndLoadUploader();
|
|
|
|
//if(!this._config._debugmode)
|
|
//{
|
|
// setTimeout(this.delegate(function()
|
|
// {
|
|
// this.PreloadDialogUrl("_dialog.xml");
|
|
// this.PreloadDialogUrl("browsedialogbase.xml");
|
|
// this.PreloadDialogUrl("menu_context_default.xml");
|
|
// }),this._config.delay_preload||5000);
|
|
//}
|
|
|
|
}
|
|
|
|
|
|
this.Dispose=function()
|
|
{
|
|
base.Dispose.apply(this);
|
|
this._config.skin_control.dispose();
|
|
}
|
|
|
|
|
|
this.GetConfig=function()
|
|
{
|
|
return this._config;
|
|
}
|
|
this.GetLangText=function(name,nullifnotfound)
|
|
{
|
|
return this._loader.getLangText.apply(this._loader,arguments);
|
|
}
|
|
this._InitUserDataBehavior=function(cate)
|
|
{
|
|
if(!config.userDataBehavior)return false;
|
|
if(!config.userDataBehavior.load)return false;
|
|
config.userDataBehavior.load("rte-"+cate);
|
|
return true;
|
|
}
|
|
this.SupportLocalData=function()
|
|
{
|
|
var config=this._config;
|
|
if(config.localStorage)
|
|
return true;
|
|
if(config.userDataBehavior&&config.userDataBehavior.load)
|
|
return true;
|
|
return false;
|
|
}
|
|
this.SetLocalData=function(cate,name,value)
|
|
{
|
|
var config=this._config;
|
|
if(config.localStorage)
|
|
{
|
|
config.localStorage.setItem(cate+"-"+name,value);
|
|
return;
|
|
}
|
|
if(this._InitUserDataBehavior(cate))
|
|
{
|
|
config.userDataBehavior.setAttribute(name,value);
|
|
config.userDataBehavior.save("rte-"+cate);
|
|
return;
|
|
}
|
|
}
|
|
this.GetLocalData=function(cate,name)
|
|
{
|
|
var config=this._config;
|
|
if(config.localStorage)
|
|
{
|
|
return config.localStorage.getItem(cate+"-"+name);
|
|
}
|
|
if(this._InitUserDataBehavior(cate))
|
|
{
|
|
return config.userDataBehavior.getAttribute(name);
|
|
}
|
|
}
|
|
|
|
this._FindAndLoadUploader=function()
|
|
{
|
|
this.uploaderhidden=document.getElementById(this._config.uploaderid);
|
|
if(this.uploaderhidden==null)return;
|
|
|
|
if(this.uploaderhidden.internalobject)
|
|
{
|
|
this._SetupUploader();
|
|
}
|
|
else
|
|
{
|
|
this.uploaderhidden.parentNode.style.display="";
|
|
this.uploaderhidden.handleinitialize=this.delegate(function()
|
|
{
|
|
this.uploaderhidden.parentNode.style.display='none';
|
|
this._SetupUploader();
|
|
});
|
|
}
|
|
}
|
|
|
|
this._CreateUploaderHandler=function(eventName)
|
|
{
|
|
var editor=this;
|
|
return function Dispatcher()
|
|
{
|
|
var uploader=this;
|
|
|
|
var arr=[uploader];
|
|
for(var i=0;i<arguments.length;i++)
|
|
arr.push(arguments[i]);
|
|
|
|
var res=editor._broadcastEvent("Uploader_"+eventName,arr);
|
|
|
|
if(eventName=="Progress")
|
|
return false;
|
|
if(eventName=="QueueUI")
|
|
return false;
|
|
if(eventName=="Postback")
|
|
return false;
|
|
|
|
return res;
|
|
};
|
|
}
|
|
|
|
this.WaitForUploader=function(callback)
|
|
{
|
|
if(!callback)return;
|
|
if(this.uploaderfinished||this.uploadersetuperror)
|
|
return callback(this.uploadersetuperror);
|
|
if(!this.uploadercallbacks)this.uploadercallbacks=[];
|
|
this.uploadercallbacks.push(callback);
|
|
}
|
|
this._SetupUploader=function()
|
|
{
|
|
this.uploaderhidden.internalobject.alwaysMantleButton=true;
|
|
|
|
var editor=this;
|
|
function MakeFunc(name)
|
|
{
|
|
editor.uploaderhidden["handle"+name.toLowerCase()]=editor._CreateUploaderHandler(name);
|
|
}
|
|
|
|
MakeFunc("Postback");
|
|
MakeFunc("Progress");
|
|
MakeFunc("QueueUI");
|
|
MakeFunc("Browse");
|
|
MakeFunc("Select");
|
|
MakeFunc("Start");
|
|
MakeFunc("Stop");
|
|
MakeFunc("Initialize");
|
|
|
|
MakeFunc("Error");
|
|
MakeFunc("TaskStart");
|
|
MakeFunc("TaskError");
|
|
MakeFunc("TaskComplete");
|
|
|
|
this.uploaderhidden.handlemantlebutton=this.delegate(this._uploaderMantleButton);
|
|
|
|
if(!this._internalbtnadded)
|
|
{
|
|
this._internalbtnadded=true;
|
|
this._SetupUploadButton(this.uploaderhidden.internalobject.insertBtn);
|
|
}
|
|
|
|
this.RunUploaderCallbacks();
|
|
}
|
|
this.RunUploaderCallbacks=function(err)
|
|
{
|
|
this.uploaderfinished=true;
|
|
this.uploadersetuperror=err;
|
|
if(!this.uploadercallbacks)
|
|
return;
|
|
for(var i=0;i<this.uploadercallbacks.length;i++)
|
|
this.uploadercallbacks[i](this.uploadersetuperror);
|
|
}
|
|
this._SetupUploadButton=function(btn,movetonow)
|
|
{
|
|
if(!this.uploaderhidden)
|
|
{
|
|
btn.onclick=function(){
|
|
alert("UploaderNotReady");
|
|
};
|
|
return;
|
|
}
|
|
|
|
if(!this._uploadbtns)
|
|
this._uploadbtns=[];
|
|
this._uploadbtns.push(btn);
|
|
btn._onclick=btn.onclick;
|
|
btn.onclick=this.delegate(function(){
|
|
if(this.uploaderhidden.internalobject)
|
|
this.uploaderhidden.startbrowse();
|
|
return false;
|
|
});
|
|
btn._onmouseover=this.delegate(function(){
|
|
this._overuploadbtn=btn;
|
|
if(this._uploaddiv)
|
|
{
|
|
this._uploaderMantleButton(btn,this._uploaddiv,this._uploadaddon,null,"enter");
|
|
}
|
|
});
|
|
btn._onmouseout=this.delegate(function(){
|
|
if(this._uploaddiv)
|
|
{
|
|
this._uploaderMantleButton(btn,this._uploaddiv,this._uploadaddon,null,"leave");
|
|
}
|
|
});
|
|
if(btn.attachEvent)
|
|
{
|
|
btn.attachEvent("onmouseover",btn._onmouseover);
|
|
btn.attachEvent("onmouseout",btn._onmouseout);
|
|
}
|
|
else
|
|
{
|
|
btn.addEventListener("mouseover",btn._onmouseover,false);
|
|
btn.addEventListener("mouseout",btn._onmouseout,false);
|
|
}
|
|
|
|
if(movetonow)
|
|
{
|
|
this._overuploadbtn=btn;
|
|
if(this._uploaddiv)
|
|
{
|
|
this._uploaderMantleButton(btn,this._uploaddiv,this._uploadaddon,null,"enter");
|
|
}
|
|
}
|
|
}
|
|
this.FocusUploadButton=function(btn)
|
|
{
|
|
this._focusuploadbtn=btn;
|
|
}
|
|
this.RemoveUploadButton=function(btn)
|
|
{
|
|
if(this._focusuploadbtn==btn)
|
|
this._focusuploadbtn=null;
|
|
if(!this._uploadbtns)
|
|
return;
|
|
for(var i=0;i<this._uploadbtns.length;i++)
|
|
{
|
|
if(this._uploadbtns[i]!=btn)
|
|
continue;
|
|
|
|
this._uploadbtns.splice(i,1);
|
|
btn.onclick=btn._onclick;
|
|
if(btn.detachEvent)
|
|
{
|
|
btn.detachEvent("onmouseover",btn._onmouseover);
|
|
btn.detachEvent("onmouseout",btn._onmouseout);
|
|
}
|
|
else
|
|
{
|
|
btn.removeEventListener("mouseover",btn._onmouseover,false);
|
|
btn.removeEventListener("mouseout",btn._onmouseout,false);
|
|
}
|
|
return;
|
|
}
|
|
}
|
|
this.RegisterUploadButton=function(btn,movetonow)
|
|
{
|
|
if(this.uploaderhidden)
|
|
{
|
|
this._SetupUploadButton(btn,movetonow);
|
|
return;
|
|
}
|
|
|
|
if(this._settingMantleButton)
|
|
{
|
|
if(!this._addingupbtns)
|
|
this._addingupbtns=[];
|
|
this._addingupbtns.push(btn);
|
|
return;
|
|
}
|
|
|
|
var config=this._config;
|
|
|
|
this._settingMantleButton=btn;
|
|
|
|
var handlehtml=this.delegate(function(res)
|
|
{
|
|
if(res.Error)
|
|
{
|
|
this.RunUploaderCallbacks(res.Error);
|
|
return;
|
|
}
|
|
var html=res.ReturnValue;
|
|
if(!html)
|
|
{
|
|
this.RunUploaderCallbacks("AjaxGetUploaderHTML failed");
|
|
return;
|
|
}
|
|
var div=document.createElement("DIV");
|
|
div.style.width="1px";
|
|
div.style.height="1px";
|
|
div.style.position="absolute";
|
|
div.innerHTML=html;
|
|
config.skin_div_parent.insertBefore(div,config.skin_div_holder);
|
|
this._FindAndLoadUploader();
|
|
if(!this.uploaderhidden)
|
|
{
|
|
this.RunUploaderCallbacks("AjaxGetUploaderHTML invalid")
|
|
return;
|
|
}
|
|
this.RegisterUploadButton(btn,movetonow);
|
|
if(this._addingupbtns)
|
|
{
|
|
for(var i=0;i<this._addingupbtns.length;i++)
|
|
this.RegisterUploadButton(this._addingupbtns[i]);
|
|
this._addingupbtns=null;
|
|
}
|
|
});
|
|
var loadhtml=this.delegate(function()
|
|
{
|
|
this.CallAjax("AjaxGetUploaderHTML",handlehtml);
|
|
});
|
|
var loaduploader=this.delegate(function()
|
|
{
|
|
if(!window.RTE_AjaxUploader_Initialize)
|
|
{
|
|
loadhtml();
|
|
return;
|
|
}
|
|
var hidden=document.getElementById("UploadLib_Uploader_js");
|
|
if(hidden!=null)
|
|
{
|
|
loadhtml();
|
|
return;
|
|
}
|
|
|
|
var form=document.forms[0]||document.body;
|
|
var hidden = document.createElement("input");
|
|
hidden.type = "hidden";
|
|
hidden.id = hidden.name = "UploadLib_Uploader_js";
|
|
hidden.value = "1";
|
|
form.insertBefore(hidden, form.firstChild);
|
|
hidden = null;
|
|
loadhtml();
|
|
});
|
|
|
|
if(window.RTE_AjaxUploader_Initialize)
|
|
{
|
|
loaduploader();
|
|
return;
|
|
}
|
|
|
|
var scripturl=this._config.uploaderscripturl||this._config.folder+"core/uploader.js?"+this._config._urlsuffix;
|
|
if(!scripturl)
|
|
{
|
|
loaduploader();
|
|
return;
|
|
}
|
|
var xh=jsml.xmlhttp();
|
|
xh.onreadystatechange=function()
|
|
{
|
|
if(xh.readyState<4)return;
|
|
xh.onreadystatechange=jsml.empty_function;
|
|
if(xh.status!=200)
|
|
{
|
|
this.RunUploaderCallbacks("failed to load uploader.js");
|
|
return;
|
|
}
|
|
var calleval=new Function("code","eval(code)");
|
|
try
|
|
{
|
|
calleval(xh.responseText);
|
|
}
|
|
catch(x)
|
|
{
|
|
this.RunUploaderCallbacks("failed to run uploader.js : "+x.message);
|
|
throw(x);
|
|
}
|
|
|
|
|
|
loaduploader();
|
|
}
|
|
xh.open("GET",scripturl,true);
|
|
xh.send("");
|
|
}
|
|
this._uploaderMantleButton=function(btn,div,addon,flag,mode)
|
|
{
|
|
if(!this._uploaddiv)
|
|
{
|
|
this._uploaddiv=div;
|
|
this._uploadaddon=addon;
|
|
}
|
|
|
|
div.onmousedown=jsml.cancel_bubble_function;
|
|
|
|
div.onmouseover=this.delegate(function()
|
|
{
|
|
this._uploadover=true;
|
|
if(this._overuploadbtn&&typeof(this._overuploadbtn.onmouseover)=="function")this._overuploadbtn.onmouseover();
|
|
});
|
|
div.onmouseout=this.delegate(function()
|
|
{
|
|
this._uploadover=false;
|
|
if(this._overuploadbtn&&typeof(this._overuploadbtn.onmouseout)=="function")this._overuploadbtn.onmouseout();
|
|
});
|
|
|
|
if(mode=="enter")
|
|
{
|
|
this._uploadover=true;
|
|
}
|
|
if(mode=="leave")
|
|
{
|
|
|
|
}
|
|
|
|
function hideit()
|
|
{
|
|
div.style.left="-100px";
|
|
div.style.top="-100px";
|
|
}
|
|
|
|
var overbtn=this._overuploadbtn;
|
|
|
|
if(this._focusuploadbtn)
|
|
{
|
|
overbtn=this._focusuploadbtn
|
|
}
|
|
else
|
|
{
|
|
if(!this._uploadover)return hideit();
|
|
if(!this._overuploadbtn)return hideit();
|
|
}
|
|
|
|
var pos=jsml.calc_position(div,overbtn);
|
|
div.style.left=pos.left+"px";
|
|
div.style.top=pos.top+"px";
|
|
div.style.cursor="pointer";
|
|
addon.style.cursor="pointer";
|
|
addon.style.width=div.style.width=this._overuploadbtn.offsetWidth+"px";
|
|
addon.style.height=div.style.height=this._overuploadbtn.offsetHeight+"px";
|
|
}
|
|
|
|
this.GetWidth=function()
|
|
{
|
|
if(this._isfullscreen)
|
|
return parseInt(this._origincontainerwidth);
|
|
else
|
|
return this._config.skin_control.get_current_width();
|
|
}
|
|
this.GetHeight=function()
|
|
{
|
|
if(this._isfullscreen)
|
|
return parseInt(this._origincontainerheight);
|
|
else
|
|
return this._config.skin_control.get_current_height();
|
|
}
|
|
this.SetWidth=function(value)
|
|
{
|
|
value=parseInt(value);
|
|
if(!value)return;
|
|
|
|
if(this._isfullscreen)
|
|
{
|
|
this._origincontainerwidth=value+"px";
|
|
}
|
|
else
|
|
{
|
|
var skindiv=this._config.skin_div;
|
|
var skinctrl=this._config.skin_control;
|
|
skindiv.style.width=value+"px";
|
|
skinctrl.set_width(value);
|
|
}
|
|
}
|
|
this.SetHeight=function(value)
|
|
{
|
|
value=parseInt(value);
|
|
if(!value)return;
|
|
|
|
if(this._isfullscreen)
|
|
{
|
|
this._origincontainerheight=value+"px";
|
|
}
|
|
else
|
|
{
|
|
var skindiv=this._config.skin_div;
|
|
var skinctrl=this._config.skin_control;
|
|
skindiv.style.height=value+"px";
|
|
skinctrl.set_height(value);
|
|
}
|
|
}
|
|
|
|
this._toggleFullScreen=function()
|
|
{
|
|
var config=this._config;
|
|
|
|
var db=document.body;
|
|
var de=document.documentElement;
|
|
|
|
var div=config.skin_div;
|
|
var ctrl=config.skin_control;
|
|
|
|
var rect=jsml.get_body_rect();
|
|
if(jsml.mobile)
|
|
{
|
|
rect.width=rect.width+20;
|
|
}
|
|
|
|
var handleresize=this.delegate(function()
|
|
{
|
|
if(!this._isfullscreen)return;
|
|
|
|
if(!jsml.mobile)
|
|
{
|
|
rect=jsml.get_body_rect();
|
|
}
|
|
|
|
var nextwidth=rect.width;
|
|
var nextheight=rect.height;
|
|
|
|
if(jsml.mobile)
|
|
{
|
|
var screenw=screen.availWidth;
|
|
var screenh=screen.availHeight;
|
|
if(screenw==460)screenw=480;
|
|
if(screenh==460)screenh=480;
|
|
if(window.orientation==90||window.orientation==-90)
|
|
{
|
|
var screent=screenw
|
|
screenw=screenh
|
|
screenh=screent
|
|
}
|
|
|
|
if(nextwidth>screenw)nextwidth=screenw;
|
|
if(nextheight>screenh)nextheight=screenh;
|
|
|
|
var bodyheight=this.GetContentHeight();
|
|
var currheight=ctrl.get_current_height();
|
|
var missheight=bodyheight-config.skin_container.get_current_height();
|
|
nextheight=currheight+missheight+32;//+screenh/2;
|
|
if(nextheight<screenh)nextheight=screenh;
|
|
nextwidth=screenw;
|
|
|
|
if(nextwidth<rect.width)nextwidth=rect.width;
|
|
if(nextheight<rect.height)nextheight=rect.height;
|
|
}
|
|
|
|
pos={top:0,left:0}
|
|
div.style.top=pos.top+'px'
|
|
div.style.left=pos.left+'px'
|
|
div.style.width=nextwidth+"px";
|
|
div.style.height=nextheight+"px";
|
|
|
|
ctrl.set_width(div.clientWidth);
|
|
ctrl.set_height(nextheight);
|
|
|
|
if(jsml.mobile)
|
|
{
|
|
var doc=this.GetWindow().document;
|
|
if(doc.body.scrollTop!=0)doc.body.scrollTop=0;
|
|
if(doc.documentElement.scrollTop!=0)doc.documentElement.scrollTop=0;
|
|
|
|
}
|
|
});
|
|
|
|
|
|
this._isfullscreen=!this._isfullscreen;
|
|
if(this._isfullscreen)
|
|
{
|
|
this._origincontainerzindex=div.style.zIndex;
|
|
this._origincontainerwidth=div.style.width;
|
|
this._origincontainerheight=div.style.height;
|
|
|
|
this._originbodyoverflow=db.style.overflow;
|
|
this._originbodyoverflowX=db.style.overflowX;
|
|
this._originbodyoverflowY=db.style.overflowY;
|
|
this._originbodyscrollTop=db.scrollTop;
|
|
this._originbodyscrollLeft=db.scrollLeft;
|
|
|
|
this._originhtmloverflow=de.style.overflow;
|
|
this._originhtmloverflowX=de.style.overflowX;
|
|
this._originhtmloverflowY=de.style.overflowY;
|
|
this._originhtmlscrollTop=de.scrollTop;
|
|
this._originhtmlscrollLeft=de.scrollLeft;
|
|
|
|
db.style.overflow="hidden";
|
|
db.style.overflowX="hidden";
|
|
db.style.overflowY="hidden";
|
|
db.scrollTop=0;
|
|
db.scrollLeft=0;
|
|
de.style.overflow="hidden";
|
|
de.style.overflowX="hidden";
|
|
de.style.overflowY="hidden";
|
|
de.scrollTop=0;
|
|
de.scrollLeft=0;
|
|
|
|
div.style.position='absolute';
|
|
div.style.zIndex=config.fullscreen_zindex;
|
|
|
|
config.skin_div_holder=document.createElement("DIV");
|
|
config.skin_div_parent.insertBefore(config.skin_div_holder,div);
|
|
|
|
this.DetachFrame();
|
|
document.body.insertBefore(div,document.body.firstChild);
|
|
this.AttachFrame();
|
|
|
|
jsml.dom_attach_event(window,"resize",handleresize);
|
|
this._fullscreenhandleresize=handleresize;
|
|
if(jsml.mobile)
|
|
{
|
|
jsml.dom_attach_event(window,"orientationchange",handleresize);
|
|
this._fullscreeneventid=this.AttachEvent("TextChanged",this._fullscreenhandleresize);
|
|
}
|
|
|
|
handleresize();
|
|
}
|
|
else
|
|
{
|
|
jsml.dom_detach_event(window,"resize",this._fullscreenhandleresize);
|
|
if(jsml.mobile)
|
|
{
|
|
jsml.dom_detach_event(window,"orientationchange",handleresize);
|
|
this.DetachEvent("TextChanged",this._fullscreeneventid);
|
|
}
|
|
|
|
this.DetachFrame();
|
|
config.skin_div_parent.insertBefore(div,config.skin_div_holder);
|
|
config.skin_div_parent.removeChild(config.skin_div_holder);
|
|
config.skin_div_holder=div;
|
|
this.AttachFrame();
|
|
|
|
div.style.position='';
|
|
div.style.top=''
|
|
div.style.left=''
|
|
div.style.width=this._origincontainerwidth;
|
|
div.style.height=this._origincontainerheight;
|
|
div.style.zIndex=this._origincontainerzindex;
|
|
|
|
ctrl.set_width(div.clientWidth);
|
|
ctrl.set_height(div.clientHeight);
|
|
|
|
de.style.overflow=this._originhtmloverflow;
|
|
de.style.overflowX=this._originhtmloverflowX;
|
|
de.style.overflowY=this._originhtmloverflowY;
|
|
de.scrollTop=this._originhtmlscrollTop;
|
|
de.scrollLeft=this._originhtmlscrollLeft;
|
|
|
|
db.style.overflow=this._originbodyoverflow;
|
|
db.style.overflowX=this._originbodyoverflowX;
|
|
db.style.overflowY=this._originbodyoverflowY;
|
|
db.scrollTop=this._originbodyscrollTop;
|
|
db.scrollLeft=this._originbodyscrollLeft;
|
|
}
|
|
|
|
this._broadcastEvent("FullScreenChanged");
|
|
|
|
}
|
|
|
|
this.BuildDialogUrl=function(filename)
|
|
{
|
|
var config=this._config;
|
|
var url=config.folder+"dialogs/"+filename+"?"+(config._debugmode?new Date().getTime():config._urlsuffix);
|
|
return url;
|
|
}
|
|
this.PreloadDialogUrl=function(filename)
|
|
{
|
|
if(!filename)return;
|
|
var url=this.BuildDialogUrl(filename);
|
|
this._LoadXmlUrl(url);
|
|
}
|
|
this._LoadXmlUrl=function(url,handler,processinst,globalvars,translator,loadDelay)
|
|
{
|
|
var xh;
|
|
|
|
var ParseXmlDoc=this.delegate(function(x)
|
|
{
|
|
//no handler means only cache the url
|
|
if(handler==null)
|
|
return;
|
|
|
|
//TODO:preload the <include> recursive..
|
|
var loader=this._loader;
|
|
var translate_value=loader.translate_value;
|
|
if(translator)
|
|
{
|
|
translate_value=function(val)
|
|
{
|
|
val=loader.translate_value(val);
|
|
val=translator(val);
|
|
return val;
|
|
}
|
|
}
|
|
|
|
try
|
|
{
|
|
jsml.parse_xmldoc(xh.responseXML,processinst,globalvars,null,translate_value)
|
|
}
|
|
catch(x)
|
|
{
|
|
this.Alert("Unable to parse "+url+" , "+x.message);
|
|
handler(null,"Unable to parse "+url+" , "+x.message);
|
|
xh=null;
|
|
return;
|
|
}
|
|
xh=null;
|
|
handler(true);
|
|
});
|
|
|
|
function startLoad()
|
|
{
|
|
if(!this._xmlurldatamap)this._xmlurldatamap={};
|
|
|
|
xh=this._xmlurldatamap[url];
|
|
|
|
if(xh)
|
|
{
|
|
ParseXmlDoc();
|
|
return;
|
|
}
|
|
|
|
xh=jsml.xmlhttp();
|
|
xh.onreadystatechange=this.delegate(function()
|
|
{
|
|
if(xh.readyState<4)return;
|
|
xh.onreadystatechange=jsml.empty_function;
|
|
if(xh.status==0)
|
|
return;
|
|
if(xh.status!=200)
|
|
{
|
|
if(handler)handler(null,"Unable to parse "+url+" , http "+xh.status);
|
|
return;
|
|
}
|
|
if(xh.responseXML==null||xh.responseXML.documentElement==null)
|
|
{
|
|
if(handler)handler(null,"Unable to parse "+url+" , invalid xml format");
|
|
return;
|
|
}
|
|
if(!this._config._debugmode)
|
|
{
|
|
this._xmlurldatamap[url]=xh;
|
|
}
|
|
ParseXmlDoc();
|
|
});
|
|
xh.open("GET",url,true);
|
|
xh.send("");
|
|
}
|
|
|
|
setTimeout(this.delegate(startLoad),loadDelay||1);
|
|
}
|
|
|
|
this._LoadDialog=function(option,callback)
|
|
{
|
|
var dialog;
|
|
if(!option)option={}
|
|
|
|
var urlhandler=this.delegate(function(res,err)
|
|
{
|
|
if(!res)
|
|
{
|
|
if(option.callback)option.callback(res,err);
|
|
if(err)setTimeout(function(){throw(err)},1);
|
|
return;
|
|
}
|
|
|
|
if(callback)
|
|
callback(dialog);
|
|
});
|
|
|
|
var processinst=this.delegate(function(inst){
|
|
dialog=inst;
|
|
|
|
dialog._rteconfig=this._config;
|
|
dialog._rteinstance=this;
|
|
dialog._estyle.zIndex=this._config.dialog_zindex;
|
|
if(option.title)
|
|
dialog.set_title(option.title);
|
|
if(option.width&&option.height)
|
|
dialog.resize(option.width,option.height);
|
|
if(option.ondialoginit)
|
|
option.ondialoginit(dialog);
|
|
});
|
|
|
|
var dialogvars={editor:this}
|
|
|
|
this._LoadXmlUrl(this.BuildDialogUrl("_dialog.xml"),urlhandler,processinst,dialogvars);
|
|
}
|
|
|
|
|
|
this.ShowXmlDialog=function(url,option)
|
|
{
|
|
var dialog;
|
|
|
|
if(!option)option={}
|
|
|
|
var urlhandler=this.delegate(function(res,err)
|
|
{
|
|
if(!res)
|
|
{
|
|
setTimeout(function()
|
|
{
|
|
if(option.callback)option.callback(res,err);
|
|
},1);
|
|
dialog.close();
|
|
return;
|
|
}
|
|
|
|
dialog.attach_event("closing",function()
|
|
{
|
|
if(option.callback)option.callback(dialog.result);
|
|
});
|
|
|
|
dialog.adjustsize();
|
|
|
|
if(option.oncontentload)
|
|
option.oncontentload(dialog);
|
|
});
|
|
var processinst=this.delegate(function(inst){
|
|
dialog.append_child(inst);
|
|
inst.invoke_recursive("editor_ready",this);
|
|
});
|
|
|
|
var HandleDialog=this.delegate(function(argdialog)
|
|
{
|
|
dialog=argdialog;
|
|
if(option.ondialogload)
|
|
option.ondialogload(dialog);
|
|
var urlgvars={editor:this,dialog:dialog,option:option};
|
|
this._LoadXmlUrl(url,urlhandler,processinst,urlgvars,option.translator,option.loadDelay);
|
|
});
|
|
|
|
this._LoadDialog(option,HandleDialog);
|
|
}
|
|
this.ShowXmlFloatBox=function(url,option)
|
|
{
|
|
var config=this._config;
|
|
var dialog=jsml.class_create_instance(option.floatboxClass||"floatbox");
|
|
var waiting=true;
|
|
var showloading=config.floatbox_showloaingimage&&!option.stopLoadingImage;
|
|
|
|
if(showloading)
|
|
{
|
|
dialog.set_min_width(90);
|
|
dialog.set_min_height(90);
|
|
dialog._element.innerHTML="<table style='width:90px;height:90px;'><tr>"
|
|
+"<td style='vertical-align:center;text-align:center;'>"
|
|
+"<img src='"+config.folder+"images/"+config.loader_loadingimage+"'/></td></tr></table>";
|
|
}
|
|
|
|
var urlhandler=this.delegate(function(res,err)
|
|
{
|
|
if(waiting){waiting=false;dialog._element.innerHTML="";}
|
|
|
|
if(!res)
|
|
{
|
|
setTimeout(function()
|
|
{
|
|
if(option.callback)option.callback(res,err);
|
|
},1);
|
|
dialog.close();
|
|
return;
|
|
}
|
|
|
|
if(!showloading)
|
|
{
|
|
dialog.show(option);
|
|
}
|
|
|
|
dialog.attach_event("closing",function()
|
|
{
|
|
if(option.callback)option.callback(dialog.result);
|
|
});
|
|
|
|
if(option.oncontentload)
|
|
option.oncontentload(dialog);
|
|
});
|
|
var processinst=this.delegate(function(inst){
|
|
if(waiting){waiting=false;dialog._element.innerHTML="";}
|
|
dialog.append_child(inst);
|
|
inst.invoke_recursive("editor_ready",this);
|
|
});
|
|
|
|
setTimeout(this.delegate(function(){
|
|
|
|
if(option.title)
|
|
dialog.set_title(option.title);
|
|
if(option.width&&option.height)
|
|
dialog.resize(option.width,option.height);
|
|
|
|
dialog._rteconfig=this._config;
|
|
dialog._rteinstance=this;
|
|
dialog._estyle.zIndex=this._config.dialog_zindex;
|
|
|
|
if(showloading)
|
|
{
|
|
dialog.show(option);
|
|
}
|
|
|
|
if(option.ondialoginit)
|
|
option.ondialoginit(dialog);
|
|
|
|
var urlgvars={editor:this,dialog:dialog,option:option};
|
|
this._LoadXmlUrl(url,urlhandler,processinst,urlgvars,option.translator,option.loadDelay);
|
|
}),0);
|
|
|
|
if(option.ondialogload)
|
|
option.ondialogload(dialog);
|
|
|
|
return dialog;
|
|
}
|
|
this.ExecShowXmlDialog=function(element,url,option)
|
|
{
|
|
if(!option)option={};
|
|
if(!option.width)option.width=180;
|
|
if(!option.height)option.height=120;
|
|
this.ShowXmlDialog(this.BuildDialogUrl(url),option);
|
|
}
|
|
this.ExecShowXmlFloatbox=function(element,url,option)
|
|
{
|
|
if(!option)option={};
|
|
if(!option.width)option.width=60;
|
|
if(!option.height)option.height=40;
|
|
option.anchor=element;
|
|
this.ShowXmlFloatBox(this.BuildDialogUrl(url),option);
|
|
}
|
|
|
|
|
|
this.Alert=function(option)
|
|
{
|
|
if(typeof(option)=="string")
|
|
{
|
|
option={message:option};
|
|
}
|
|
if(!option.message)throw(new Error("require .message"));
|
|
|
|
if(jsml.mobile)
|
|
return window.alert(option.message);
|
|
|
|
if(!option.title)option.title="Alert:";
|
|
if(!option.width)option.width=280;
|
|
if(option.control||option.anchor)
|
|
{
|
|
if(option.hideButtons==null)
|
|
option.hideButtons=true;
|
|
if(!option.height)option.height=90;
|
|
this.ShowXmlFloatBox(this.BuildDialogUrl("basic_alert.xml"),option);
|
|
}
|
|
else
|
|
{
|
|
if(!option.height)option.height=140;
|
|
this.ShowXmlDialog(this.BuildDialogUrl("basic_alert.xml"),option);
|
|
}
|
|
}
|
|
this.Confirm=function(option)
|
|
{
|
|
if(!option.message)throw(new Error("require .message"));
|
|
if(!option.callback)throw(new Error("require .callback"));
|
|
if(!option.title)option.title="confirm:";
|
|
if(!option.width)option.width=320;
|
|
if(option.control||option.anchor)
|
|
{
|
|
if(!option.height)option.height=110;
|
|
this.ShowXmlFloatBox(this.BuildDialogUrl("basic_confirm.xml"),option);
|
|
}
|
|
else
|
|
{
|
|
if(!option.height)option.height=140;
|
|
this.ShowXmlDialog(this.BuildDialogUrl("basic_confirm.xml"),option);
|
|
}
|
|
}
|
|
this.Prompt=function(option)
|
|
{
|
|
if(!option.message)throw(new Error("require .message"));
|
|
if(!option.callback)throw(new Error("require .callback"));
|
|
if(!option.title)option.title="prompt:";
|
|
if(!option.width)option.width=320;
|
|
if(option.control||option.anchor)
|
|
{
|
|
if(!option.height)option.height=140;
|
|
this.ShowXmlFloatBox(this.BuildDialogUrl("basic_prompt.xml"),option);
|
|
}
|
|
else
|
|
{
|
|
if(!option.height)option.height=170;
|
|
this.ShowXmlDialog(this.BuildDialogUrl("basic_prompt.xml"),option);
|
|
}
|
|
}
|
|
|
|
|
|
this._invokeUIRequest=function(cmd,element)
|
|
{
|
|
|
|
cmd=String(cmd).toLowerCase();
|
|
switch(cmd)
|
|
{
|
|
case "paste":
|
|
case "pastetext":
|
|
case "pastehtml":
|
|
case "pasteword":
|
|
this._lastpastecmd=cmd;
|
|
var option={width:480,height:320}
|
|
option.command=cmd;
|
|
option.puretextmode=(cmd=="pastetext"||cmd=="pastehtml");
|
|
option.callback=this.delegate(this._onpastedialogreturn);
|
|
if(element&&jsml.isvisible(element))
|
|
{
|
|
//if clicked by a visible element :
|
|
option.anchor=element;
|
|
this.ShowXmlFloatBox(this.BuildDialogUrl("editor_paste.xml"),option);
|
|
}
|
|
else
|
|
{
|
|
this.ShowXmlDialog(this.BuildDialogUrl("editor_paste.xml"),option);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
this._onpastedialogreturn=function(res,err)
|
|
{
|
|
this.Focus();
|
|
if(!res)return;
|
|
res=this.FilterByPasteCommand(res,this._lastpastecmd);
|
|
this.InsertHTML(res);
|
|
}
|
|
|
|
this.ExecPlugin=function(pluginname,element,arg1,arg2)
|
|
{
|
|
this.LoadPlugin(pluginname,function(plugin,error)
|
|
{
|
|
if(!plugin)return;
|
|
plugin.Execute(element,arg1,arg2);
|
|
});
|
|
}
|
|
this.LoadPlugin=function(pluginname,callback)
|
|
{
|
|
pluginname=String(pluginname).toLowerCase();
|
|
var map=this._plugins;
|
|
if(!map)map=this._plugins={};
|
|
var plugin=map[pluginname];
|
|
if(plugin)
|
|
{
|
|
if(!callback)
|
|
return;
|
|
if(plugin.loaded||plugin.failed)
|
|
{
|
|
setTimeout(function()
|
|
{
|
|
callback(plugin.loaded,plugin.failed);
|
|
},1);
|
|
return;
|
|
}
|
|
plugin._pluginloadcallbacks.push(callback);
|
|
return;
|
|
}
|
|
|
|
plugin={};
|
|
plugin.Name=pluginname;
|
|
plugin._pluginloadcallbacks=[];
|
|
if(callback)
|
|
plugin._pluginloadcallbacks.push(callback);
|
|
map[pluginname]=plugin;
|
|
function urlhandler(res,err)
|
|
{
|
|
if(res)
|
|
plugin.loaded=plugin;
|
|
if(err)
|
|
plugin.failed=err;
|
|
|
|
if(plugin.failed)
|
|
map[pluginname]=null;
|
|
|
|
var arr=plugin._pluginloadcallbacks.concat();
|
|
plugin._pluginloadcallbacks=null;
|
|
for(var i=0;i<arr.length;i++)
|
|
arr[i](plugin.loaded,plugin.failed);
|
|
|
|
}
|
|
function processinst()
|
|
{
|
|
}
|
|
function translator(val)
|
|
{
|
|
if(val.indexOf('{')==-1)
|
|
return val;
|
|
return val.split("{plugin}").join(pluginname);
|
|
}
|
|
|
|
var config=this._config;
|
|
var url=config.folder+"plugins/"+pluginname+"/plugin.xml?"+(config._debugmode?new Date().getTime():config._urlsuffix);
|
|
var globalvars={plugin:plugin,editor:this}
|
|
this._LoadXmlUrl(url,urlhandler,processinst,globalvars,translator);
|
|
}
|
|
|
|
|
|
this.IsCommandReady=function(cmd)
|
|
{
|
|
var lowercmd=String(cmd).toLowerCase();
|
|
|
|
if(this._config.readonly)
|
|
{
|
|
switch(lowercmd)
|
|
{
|
|
case "fullscreen":
|
|
case "toggleborder":
|
|
case "toggleborderreverse":
|
|
case "help":
|
|
return true;
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
|
|
switch(lowercmd)
|
|
{
|
|
case "imageeditor":
|
|
case "insertimagemap":
|
|
if(this.GetSelectionType()=="Control")
|
|
{
|
|
if(this.GetPointNode().GetNameLower()=="img")
|
|
return true;
|
|
}
|
|
return false;
|
|
case "insertgallery":
|
|
case "insertimage":
|
|
case "insertvideo":
|
|
case "insertdocument":
|
|
case "inserttemplate":
|
|
return this.GetSelectionType()!="None";
|
|
default:
|
|
return this.CanExecCommand(cmd);
|
|
}
|
|
}
|
|
this.IsCommandActive=function(cmd,val1,val2,val3)
|
|
{
|
|
var lowercmd=String(cmd).toLowerCase();
|
|
switch(lowercmd)
|
|
{
|
|
case "fullscreen":
|
|
return !!this._isfullscreen;
|
|
default:
|
|
return this.QueryCommand(cmd,val1,val2,val3);
|
|
}
|
|
}
|
|
|
|
this.ExecUICommand=function(element,cmd,arg0,arg1,arg2)
|
|
{
|
|
var evt=jsml.find_event();
|
|
if(evt&&evt.ctrlKey&&evt.shiftKey&&evt.altKey)
|
|
{
|
|
this.ShowXmlDialog(this.BuildDialogUrl("_developer.xml"),{width:560,height:420});
|
|
return;
|
|
}
|
|
|
|
this.Focus();
|
|
|
|
if(this._broadcastEvent("ExecUICommand",arguments)!==false)
|
|
{
|
|
var lowercmd=String(cmd).toLowerCase();
|
|
switch(lowercmd)
|
|
{
|
|
case "save":
|
|
this.ExecSave(element);
|
|
break;
|
|
case "execplugin":
|
|
this.ExecPlugin(arg0,element,arg1,arg2)
|
|
break;
|
|
case "loadplugin":
|
|
this.LoadPlugin(arg0)
|
|
break;
|
|
case "fullscreen":
|
|
this._toggleFullScreen();
|
|
break;
|
|
case "cleancode":
|
|
this.ExecCleanCode(element);
|
|
break;
|
|
case "imageeditor":
|
|
this.ExecImageEditor(element);
|
|
break;
|
|
case "insertimagemap":
|
|
this.ExecInsertImageMap(element);
|
|
break;
|
|
case "insertgallery":
|
|
this.ExecInsertGallery(element);
|
|
return;
|
|
case "insertimage":
|
|
this.ExecInsertImage(element);
|
|
return;
|
|
case "insertvideo":
|
|
this.ExecInsertVideo(element);
|
|
return;
|
|
case "insertdocument":
|
|
this.ExecInsertDocument(element);
|
|
return;
|
|
case "inserttemplate":
|
|
this.ExecInsertTemplate(element);
|
|
return;
|
|
case "inserttemplate_dropdown":
|
|
this.ExecShowXmlFloatbox(element,"inserttemplate_dropdown.xml");
|
|
break;
|
|
case "showxmldialog":
|
|
this.ExecShowXmlDialog(element,arg0);
|
|
break;
|
|
case "showxmlfloatbox":
|
|
this.ExecShowXmlFloatbox(element,arg0);
|
|
break;
|
|
case "forecolor_dropdown":
|
|
this.ExecColorDropDown(element,"ForeColor");
|
|
break;
|
|
case "backcolor_dropdown":
|
|
this.ExecColorDropDown(element,"BackColor");
|
|
break;
|
|
case "insertdate":
|
|
this.InsertHTML(this._config.command_insertdatetime());
|
|
break;
|
|
case "insertdate_dropdown":
|
|
this.ExecShowXmlFloatbox(element,"insertdate.xml");
|
|
break;
|
|
case "inserttable":
|
|
this.ExecInsertTable(element);
|
|
break;
|
|
case "inserttabletemplate":
|
|
this.ExecInsertTable(element,null,true);
|
|
break;
|
|
case "insertanchor":
|
|
this.ExecInsertAnchor(element);
|
|
break;
|
|
case "insertlink":
|
|
this.ExecInsertLink(element);
|
|
break;
|
|
case "insertlink_dropdown":
|
|
this.ExecShowXmlFloatbox(element,"insertlink_dropdown.xml");
|
|
break;
|
|
case "help":
|
|
this.ExecHelp(element);
|
|
break;
|
|
case "paste":
|
|
case "pastetext":
|
|
case "pastehtml":
|
|
case "pasteword":
|
|
this.ExecPaste(cmd,element);
|
|
break;
|
|
case "find":
|
|
this.ExecFindAndReplace(element);
|
|
return;
|
|
case "insertbox":
|
|
case "insertform":
|
|
case "inserttextarea":
|
|
case "insertinptext":
|
|
case "insertinpfile":
|
|
case "insertinpimage":
|
|
case "insertinpreset":
|
|
case "insertinpsubmit":
|
|
case "insertinphidden":
|
|
case "insertinppassword":
|
|
case "insertradiobox":
|
|
case "insertcheckbox":
|
|
case "insertinpbutton":
|
|
case "insertbutton":
|
|
case "insertdropdown":
|
|
case "insertlistbox":
|
|
var sp=this.SaveLogContent();
|
|
this.ExecCommand(cmd,arg0,arg1,arg2);
|
|
for(var pn=this.GetPointNode();pn;pn=pn.GetParent())
|
|
{
|
|
var match=false;
|
|
switch(pn.GetNameLower())
|
|
{
|
|
case "div":
|
|
case "form":
|
|
case "input":
|
|
case "textarea":
|
|
case "select":
|
|
case "button":
|
|
match=true;
|
|
break;
|
|
}
|
|
if(match)
|
|
{
|
|
this.ShowPropertiesDialog(pn,{savepoint:sp});
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
case "insertvideo":
|
|
this.ExecInsertControl(this._config.default_code_video);
|
|
break;
|
|
case "insertaudio":
|
|
this.ExecInsertControl(this._config.default_code_audio);
|
|
break;
|
|
case "switchribbon":
|
|
if (this._config.toolbar != "ribbon" || this._config.toolbaritems != null)
|
|
{
|
|
this._config.toolbar = "ribbon";
|
|
this._config.toolbaritems = null;
|
|
this._broadcastEvent("ReloadToolbar");
|
|
}
|
|
break;
|
|
default:
|
|
this.ExecCommand(cmd,arg0,arg1,arg2);
|
|
break;
|
|
}
|
|
}
|
|
|
|
this.Focus();
|
|
this.NotifyUpdateUI();
|
|
|
|
}
|
|
|
|
this.ShowDragDropMenu=function(e,ctrl)
|
|
{
|
|
this._lastdroprequest=new Date().getTime();
|
|
|
|
e.Cancel();
|
|
if(this._config.readonly)
|
|
return;
|
|
|
|
if(!this._config.enablecontextmenu)
|
|
return;
|
|
|
|
var pos=jsml.get_scrollposition(this.GetFrame());
|
|
var option={floatboxClass:"floatmenu",x:pos.left+e.clientX+3,y:pos.top+e.clientY+3,stopLoadingImage:true};
|
|
option.dragcontrol=ctrl;
|
|
this.ShowXmlFloatBox(this.BuildDialogUrl("menu_dragdrop.xml"),option);
|
|
return true;
|
|
}
|
|
|
|
this.HandleContextMenu=function(e)
|
|
{
|
|
if(e.ctrlKey&&e.altKey&&e.shiftKey)
|
|
return;
|
|
|
|
e.Cancel();
|
|
if(new Date().getTime()-(this._lastdroprequest||0)<100)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if(this._config.readonly)
|
|
return false;
|
|
if(!this._config.enablecontextmenu)
|
|
return false;
|
|
var menufile="menu_context_"+(this._config.contextmenumode||"default")+".xml";
|
|
var pos=jsml.get_scrollposition(this.GetFrame());
|
|
var option={floatboxClass:"floatmenu",x:pos.left+e.clientX+3,y:pos.top+e.clientY+3,stopLoadingImage:true};
|
|
this.ShowXmlFloatBox(this.BuildDialogUrl(menufile),option);
|
|
return false;
|
|
}
|
|
|
|
this.HandleDoubleClick=function(e)
|
|
{
|
|
var node=this.GetNodeFromDom(e.srcElement);
|
|
if(node&&node.IsControl())
|
|
{
|
|
e.Cancel();
|
|
this.ShowPropertiesDialog(node);
|
|
}
|
|
}
|
|
|
|
this.CreateControlProvider=function(node)
|
|
{
|
|
var provider={Editor:this,Control:node}
|
|
|
|
provider.GetTitle=function()
|
|
{
|
|
var nl=node.GetNameLower();
|
|
if(nl=="div"&&node.GetStyle("position")=="absolute")
|
|
return provider.Editor.GetLangText("Layer");
|
|
if(nl=="a")
|
|
{
|
|
if(node.GetChildCount()==0)
|
|
return provider.Editor.GetLangText("Anchor");
|
|
return provider.Editor.GetLangText("Link");
|
|
}
|
|
return nl.substring(0,1).toUpperCase()+nl.substring(1);
|
|
}
|
|
provider.ShowPropertiesDialog=function(option)
|
|
{
|
|
provider.Editor.ShowPropertiesDialogDefault(node,option);
|
|
}
|
|
provider.FillDesignView=function(element)
|
|
{
|
|
element.innerHTML="Default preview for : "+provider.GetTitle();
|
|
}
|
|
|
|
this.InitInternalProvider(provider,node);
|
|
|
|
this._broadcastEvent("CreateControlProvider",[provider]);
|
|
|
|
return provider;
|
|
}
|
|
|
|
this.InitInternalProvider=function(provider,node)
|
|
{
|
|
var nl=node.GetNameLower();
|
|
if(nl=="iframe")
|
|
{
|
|
if(node.InsertType=="Video")
|
|
return this.InitVideoProvider(provider,node);
|
|
var src=node.GetAttribute("src");
|
|
if(src&&src.indexOf("file="))
|
|
{
|
|
if(src.indexOf("type=video")!=-1)
|
|
return this.InitVideoProvider(provider,node);
|
|
}
|
|
}
|
|
}
|
|
|
|
function ExtractMovieUrl(src)
|
|
{
|
|
if(!src)return "";
|
|
var pairs=(src.split('#')[0].split('?')[1]||"").split('&');
|
|
for(var i=0;i<pairs.length;i++)
|
|
{
|
|
var pair=pairs[i].split('=');
|
|
if(pair.length!=2)continue;
|
|
if(pair[0]=="file")
|
|
return decodeURIComponent(pair[1]);
|
|
}
|
|
return "";
|
|
}
|
|
|
|
this.InitVideoProvider=function(provider,node)
|
|
{
|
|
provider.GetTitle=function()
|
|
{
|
|
return "Video";
|
|
}
|
|
provider.ShowPropertiesDialog=function(option)
|
|
{
|
|
provider.Editor.ExecInsertVideo(null,node);
|
|
}
|
|
provider.FillDesignView=function(element)
|
|
{
|
|
var file="media";
|
|
var type="Video";
|
|
var src=ExtractMovieUrl(node.GetAttribute("src"));
|
|
if(src&&(src.indexOf(".flv")>-1||src.indexOf(".swf")>-1))
|
|
{
|
|
file="flash"
|
|
type="Flash"
|
|
}
|
|
element.innerHTML="<img src='"+provider.Editor._config.folder+"images/"+file+".png' width=20 height=20/><br/>"+type+" "+src;
|
|
}
|
|
}
|
|
|
|
this.ShowPropertiesDialog=function(element,option)
|
|
{
|
|
if(option&&option.styletab)
|
|
{
|
|
this.ShowPropertiesDialogDefault(element,option);
|
|
}
|
|
else
|
|
{
|
|
var provider=this.CreateControlProvider(element);
|
|
provider.ShowPropertiesDialog(option);
|
|
}
|
|
}
|
|
this.ShowPropertiesDialogDefault=function(element,option)
|
|
{
|
|
if(! (option&&option.styletab) )
|
|
{
|
|
var namelower=element.GetNameLower();
|
|
|
|
if(namelower=="img")
|
|
{
|
|
this.ExecInsertImage(null,element);
|
|
return;
|
|
}
|
|
|
|
if(namelower=="a")
|
|
{
|
|
if(element.GetChildCount()==0)
|
|
this.ExecInsertAnchor(null,element);
|
|
else
|
|
this.ExecInsertLink(null,element);
|
|
return;
|
|
}
|
|
if(name=="area")
|
|
{
|
|
this.ExecInsertLink(null,element);
|
|
return;
|
|
}
|
|
}
|
|
|
|
var sp=option&&option.savepoint;
|
|
if(typeof(sp)=="undefined")
|
|
sp=this.SaveLogContent();
|
|
|
|
if(!option)option={};
|
|
if(!option.width)option.width=550;
|
|
if(!option.height)option.height=420;
|
|
option.targetnode=element;
|
|
this.ShowTagDialog(this.BuildDialogUrl("properties.xml"),option,sp,this.delegate(function()
|
|
{
|
|
this.SaveLogIndex(sp+1)
|
|
this.Focus();
|
|
}));
|
|
}
|
|
|
|
this.ShowTagDialog=function(url,option,sp,ontrue,onfalse)
|
|
{
|
|
if(!option)option={}
|
|
|
|
this._broadcastEvent("TagDialogBegin",[url,option]);
|
|
|
|
var oldcallback=option.callback;
|
|
option.callback=this.delegate(function(res,err)
|
|
{
|
|
if(!res)
|
|
{
|
|
if(typeof(sp)=="number")
|
|
this.LoadLogIndex(sp);
|
|
this.Focus();
|
|
if(err)this.Alert(err.message||err);
|
|
if(onfalse)onfalse(res,err)
|
|
if(oldcallback)oldcallback(res,err)
|
|
}
|
|
else
|
|
{
|
|
if(ontrue)ontrue(res,err)
|
|
if(oldcallback)oldcallback(res,err)
|
|
}
|
|
this._broadcastEvent("TagDialogEnd",[url,option,res,err]);
|
|
});
|
|
this.ShowXmlDialog(url,option);
|
|
}
|
|
|
|
|
|
this.ExecInsertControl=function(code)
|
|
{
|
|
var sp=this.SaveLogContent();
|
|
var node=this.ParseHtmlCode(code)[0];
|
|
this.InsertNode(node);
|
|
this.Focus();
|
|
this.SelectControl(node);
|
|
this.ShowPropertiesDialog(node,{savepoint:sp});
|
|
}
|
|
|
|
|
|
this.ExecInsertAnchor=function(anchor,tag)
|
|
{
|
|
var sp=this.SaveLogContent();
|
|
|
|
if(!tag)
|
|
{
|
|
tag=new $rte.LinkElement("a");
|
|
//tag.SetAttribute("href","http://")
|
|
|
|
var list=this.SurroundNodes(tag);
|
|
if(!list&&list.length==0)
|
|
return;
|
|
if(list.length>1)
|
|
return this.LoadLogIndex(sp);
|
|
|
|
var p=tag;
|
|
while(true)
|
|
{
|
|
var p=p.GetParent();
|
|
if(!p)break;
|
|
if(p.GetNameLower()=="a")
|
|
{
|
|
tag=p;
|
|
tag.SetInnerText("");
|
|
}
|
|
}
|
|
}
|
|
|
|
this.SelectControl(tag);
|
|
|
|
var option={width:320,height:220,targetnode:tag,anchor:anchor};
|
|
this.ShowTagDialog(this.BuildDialogUrl("insertanchor.xml"),option,sp,this.delegate(function()
|
|
{
|
|
this.SaveLogIndex(sp+1)
|
|
this.Focus();
|
|
this.SelectControl(tag);
|
|
}));
|
|
}
|
|
|
|
this.RemoveInnerLink=function(node)
|
|
{
|
|
var index=0;
|
|
while(true)
|
|
{
|
|
var child=node.GetChildAt(index);
|
|
if(!child)
|
|
return;
|
|
if(child.GetChildAt)
|
|
this.RemoveInnerLink(child);
|
|
if(child.GetNameLower()=="a")
|
|
child.RemoveNode(false);
|
|
else
|
|
index++;
|
|
}
|
|
};
|
|
|
|
this.ExecInsertLink=function(anchor,tag)
|
|
{
|
|
var sp=this.SaveLogContent();
|
|
|
|
var list;
|
|
if(!tag)
|
|
{
|
|
tag=new $rte.LinkElement("a");
|
|
var list=this.SurroundNodes(tag);
|
|
if(!list&&list.length==0)
|
|
return;
|
|
var p=tag;
|
|
while(true)
|
|
{
|
|
var p=p.GetParent();
|
|
if(!p)break;
|
|
if(p.GetNameLower()=="a")
|
|
{
|
|
tag.RemoveNode(false);
|
|
tag=p;
|
|
}
|
|
}
|
|
if(tag.GetChildAt(0)==null)
|
|
{
|
|
var tn=new $rte.TextNode();
|
|
tn.SetText(this._config.default_link_text||"new_link");
|
|
tag.AppendChild(tn);
|
|
}
|
|
|
|
//tag.SetAttribute("href","http://")
|
|
}
|
|
else
|
|
{
|
|
list=[tag];
|
|
}
|
|
|
|
//this.SelectControl(tag);
|
|
|
|
var option={width:550,height:420,targetnode:tag,anchor:anchor};
|
|
this.ShowTagDialog(this.BuildDialogUrl("properties.xml"),option,sp,this.delegate(function()
|
|
{
|
|
for(var i=0;i<list.length;i++)
|
|
this.RemoveInnerLink(list[i]);
|
|
this.SaveLogIndex(sp+1)
|
|
this.Focus();
|
|
this.SelectContent(tag);
|
|
if(jsml.msie10)
|
|
{
|
|
tag.SetRuntimeAttribute("style","text-decoration:underline","fixiebug");
|
|
tag.SetRuntimeAttribute("style",null,"fixiebug");
|
|
}
|
|
}));
|
|
}
|
|
|
|
|
|
this.ExecInsertTable=function(anchor,tag,usetemplate)
|
|
{
|
|
var sp=this.SaveLogContent();
|
|
|
|
var list;
|
|
if(!tag)
|
|
{
|
|
var snode=this.GetPointNode();
|
|
if(snode&&snode.GetNameLower()=="table")
|
|
tag=snode;
|
|
}
|
|
|
|
if(!tag)
|
|
{
|
|
var columns=this._config.default_table_cols||5;
|
|
var rows=this._config.default_table_rows||3;
|
|
|
|
var table=this.ParseHtmlCode(this._config.default_code_table)[0];
|
|
var tbody=table.GetChildAt(0);
|
|
for(var y=0;y<rows;y++)
|
|
{
|
|
var row=this.ParseHtmlCode(this._config.default_code_tr)[0];
|
|
(tbody||table).AppendChild(row);
|
|
for(var x=0;x<columns;x++)
|
|
{
|
|
var td=this.ParseHtmlCode(this._config.default_code_td)[0];
|
|
row.AppendChild(td);
|
|
}
|
|
}
|
|
|
|
tag=table;
|
|
|
|
if(!this.InsertNode(tag))
|
|
return;
|
|
}
|
|
|
|
this.SelectControl(tag);
|
|
|
|
var option={width:550,height:420,targetnode:tag,anchor:anchor};
|
|
|
|
this.ShowTagDialog(this.BuildDialogUrl(usetemplate?"inserttabletemplate.xml":"properties.xml"),option,sp,this.delegate(function()
|
|
{
|
|
this.SaveLogIndex(sp+1)
|
|
this.Focus();
|
|
this.SelectControl(tag);
|
|
|
|
if(jsml.msie5678)
|
|
{
|
|
this.InsertHTML(tag.GetHtmlCode());
|
|
}
|
|
|
|
}));
|
|
}
|
|
|
|
this.ExecInsertTemplate=function(anchor)
|
|
{
|
|
var sp=this.SaveLogContent(true);
|
|
|
|
var option={width:640,height:420,anchor:anchor};
|
|
|
|
this.ShowXmlDialog(this.BuildDialogUrl("inserttemplate.xml?"+Math.random()),option);
|
|
}
|
|
|
|
this.ExecInsertDocument=function(anchor,tag)
|
|
{
|
|
var sp=this.SaveLogContent(true);
|
|
|
|
var oktext=null;
|
|
|
|
var list;
|
|
if(!tag)
|
|
{
|
|
oktext=this.GetLangText("INSERT");
|
|
|
|
tag=new $rte.LinkElement("a");
|
|
// tag.SetAttribute("href","http://")
|
|
var list=this.SurroundNodes(tag);
|
|
if(!list&&list.length==0)
|
|
return;
|
|
var p=tag;
|
|
while(true)
|
|
{
|
|
var p=p.GetParent();
|
|
if(!p)break;
|
|
if(p.GetNameLower()=="a")
|
|
tag=p;
|
|
}
|
|
if(tag.GetChildAt(0)==null)
|
|
{
|
|
var tn=new $rte.TextNode();
|
|
tn.SetText(this._config.default_link_text||"new_link");
|
|
tag.AppendChild(tn);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
list=[tag];
|
|
}
|
|
this.SelectControl(tag);
|
|
|
|
var option={width:640,height:420,targetnode:tag,anchor:anchor,oktext:oktext};
|
|
|
|
this.ShowTagDialog(this.BuildDialogUrl("insertdocument.xml"),option,sp,this.delegate(function()
|
|
{
|
|
for(var i=0;i<list.length;i++)
|
|
this.RemoveInnerLink(list[i]);
|
|
this.SaveLogIndex(sp+1)
|
|
this.Focus();
|
|
this.SelectContent(tag);
|
|
}));
|
|
}
|
|
|
|
this.ExecInsertVideo=function(anchor,img)
|
|
{
|
|
var sp=this.SaveLogContent();
|
|
|
|
if(!img&&this.GetSelectionType()=="Control")
|
|
{
|
|
var node=this.GetPointNode();
|
|
if(node.GetNameLower()=="iframe")
|
|
{
|
|
img=node;
|
|
}
|
|
}
|
|
var oktext=null;
|
|
if(img==null)
|
|
{
|
|
oktext=this.GetLangText("INSERT");
|
|
|
|
img=new $rte.ObjectElement("iframe");
|
|
img.InsertType="Video";
|
|
img.SetStyle("width","480px");
|
|
img.SetStyle("height","320px");
|
|
img.SetStyle("border-width","0px");
|
|
img.SetAttribute("src",this.GetPlayerUrl()+"?type=video&file=&autoplay=1&autoloop=1&allowmenu=1&transparency=1&showcontrols=1&allowfullscreen=1");
|
|
|
|
this.DeleteSelection();
|
|
if( ! this.InsertNode(img) )
|
|
{
|
|
this.LoadLogIndex(sp);
|
|
return;
|
|
}
|
|
}
|
|
|
|
var option={width:640,height:450,targetnode:img,anchor:anchor};
|
|
|
|
this.ShowTagDialog(this.BuildDialogUrl("insertvideo.xml"),option,sp,this.delegate(function()
|
|
{
|
|
this.SaveLogIndex(sp+1)
|
|
this.Focus();
|
|
this.SelectControl(img);
|
|
}));
|
|
}
|
|
this.ExecInsertImage=function(anchor,img)
|
|
{
|
|
var sp=this.SaveLogContent();
|
|
|
|
if(!img&&this.GetSelectionType()=="Control")
|
|
{
|
|
var node=this.GetPointNode();
|
|
if(node.GetNameLower()=="img")
|
|
{
|
|
img=node;
|
|
}
|
|
}
|
|
var oktext=null;
|
|
if(img==null)
|
|
{
|
|
oktext=this.GetLangText("INSERT");
|
|
|
|
img=new $rte.GenericElement("img");
|
|
img.SetAttribute("alt","");
|
|
|
|
this.DeleteSelection();
|
|
if( ! this.InsertNode(img) )
|
|
{
|
|
this.LoadLogIndex(sp);
|
|
return;
|
|
}
|
|
|
|
img.GetViewNode().setAttribute("src",this._config.folder+"images/imageholder.gif");
|
|
|
|
}
|
|
|
|
var option={width:640,height:450,targetnode:img,anchor:anchor,oktext:oktext};
|
|
|
|
this.ShowTagDialog(this.BuildDialogUrl("insertimage.xml"),option,sp,this.delegate(function()
|
|
{
|
|
this.SaveLogIndex(sp+1)
|
|
this.Focus();
|
|
this.SelectControl(img);
|
|
}));
|
|
}
|
|
this.ExecInsertGallery=function(anchor)
|
|
{
|
|
var img=new $rte.GenericElement("img");
|
|
|
|
var option={width:640,height:400,targetnode:img,anchor:anchor};
|
|
option.callback=this.delegate(function(res,err)
|
|
{
|
|
if(!res)
|
|
{
|
|
this.Focus();
|
|
return;
|
|
}
|
|
this.Focus();
|
|
this.InsertNode(img);
|
|
this.SelectControl(img);
|
|
})
|
|
this.ShowXmlDialog(this.BuildDialogUrl("insertgallery.xml"),option);
|
|
}
|
|
|
|
this.ExecImageEditor=function(anchor,img)
|
|
{
|
|
if(!img&&this.GetSelectionType()=="Control")
|
|
{
|
|
var node=this.GetPointNode();
|
|
if(node.GetNameLower()=="img")
|
|
{
|
|
img=node;
|
|
}
|
|
}
|
|
|
|
if(img==null)
|
|
return;
|
|
var editor=this;
|
|
|
|
|
|
editor.FindStorage(["Gallery","Image"],img.GetAttribute("src"),function(storage,fileitem)
|
|
{
|
|
if(!storage)return;
|
|
editor.ShowImageEditor(img,storage,fileitem);
|
|
});
|
|
}
|
|
|
|
this.ExecInsertImageMap=function(anchor,img)
|
|
{
|
|
if(!img&&this.GetSelectionType()=="Control")
|
|
{
|
|
var node=this.GetPointNode();
|
|
if(node.GetNameLower()=="img")
|
|
{
|
|
img=node;
|
|
}
|
|
}
|
|
|
|
if(img==null)
|
|
return;
|
|
|
|
var sp=this.SaveLogContent();
|
|
|
|
var map=null;
|
|
var usemap=img.GetAttribute("usemap");
|
|
if(usemap)
|
|
{
|
|
if(usemap.charAt(0)=="#")
|
|
{
|
|
usemap=usemap.substring(1);
|
|
map=this.FindNodeByName(usemap);
|
|
}
|
|
else
|
|
{
|
|
usemap=null;
|
|
}
|
|
}
|
|
|
|
var oktext=null;
|
|
|
|
if(map==null)
|
|
{
|
|
oktext=this.GetLangText("INSERT");
|
|
|
|
map=new $rte.ContainerElement("map");
|
|
if(!usemap)
|
|
{
|
|
for(var i=1;true;i++)
|
|
{
|
|
usemap="automap"+i;
|
|
if(!this.FindNodeByName(usemap))
|
|
break;
|
|
}
|
|
}
|
|
|
|
img.SetAttribute("usemap","#"+usemap);
|
|
|
|
map.SetAttribute("name",usemap);
|
|
map.SetAttribute("id",usemap);
|
|
|
|
this.GetBodyNode().InsertAt(map,0);
|
|
}
|
|
|
|
this.SelectControl(img);
|
|
|
|
var option={width:540,height:360,targetnode:map,targetimg:img,anchor:anchor,oktext:oktext};
|
|
option.callback=this.delegate(function(res,err)
|
|
{
|
|
if(!res)
|
|
{
|
|
this.LoadLogIndex(sp);
|
|
this.Focus();
|
|
if(err)this.Alert(err.message||err);
|
|
return;
|
|
}
|
|
this.SaveLogIndex(sp+1)
|
|
this.Focus();
|
|
this.SelectControl(img);
|
|
});
|
|
this.ShowXmlDialog(this.BuildDialogUrl("insertimagemap.xml"),option);
|
|
}
|
|
|
|
this.ExecFindAndReplace=function(anchor)
|
|
{
|
|
var option={width:380,height:150};
|
|
this.ShowXmlDialog(this.BuildDialogUrl("findandreplace.xml"),option);
|
|
}
|
|
|
|
this.ExecColorDropDown=function(anchor,cmd)
|
|
{
|
|
var option={command:cmd,preview:true}
|
|
option.setcolor=this.delegate(function(val)
|
|
{
|
|
this.ExecCommand(cmd,val);
|
|
});
|
|
this.ExecShowXmlFloatbox(anchor,"colorpicker.xml",option);
|
|
}
|
|
|
|
this.ExecCleanCode=function(anchor)
|
|
{
|
|
var option={width:560,height:330}
|
|
option.anchor=anchor
|
|
this.ShowXmlDialog(this.BuildDialogUrl("cleancode.xml"),option);
|
|
}
|
|
|
|
this.ExecSave=function(anchor)
|
|
{
|
|
var mode=this._config.savebuttonmode
|
|
|
|
if(!mode)return;
|
|
mode=mode.toLowerCase();
|
|
|
|
var sres=true;
|
|
var scode=this._config.savebuttonscript;
|
|
if(scode)
|
|
{
|
|
var func=new Function("editor",scode);
|
|
sres=func.apply(this,[]);
|
|
if(sres===false)
|
|
return;
|
|
}
|
|
|
|
if(mode=="submit")
|
|
{
|
|
if(this._config.savebuttonsubmit)
|
|
{
|
|
var func=new Function("",this._config.savebuttonsubmit);
|
|
func();
|
|
}
|
|
else
|
|
{
|
|
var inp=document.getElementsByName(this._config.uniqueid)[0];
|
|
if(!inp)
|
|
return;
|
|
var form=inp.parentNode;
|
|
for(;form!=null;form=form.parentNode)
|
|
{
|
|
if(form.nodeName=="FORM")
|
|
break;
|
|
}
|
|
if(!form)
|
|
return;
|
|
form.submit();
|
|
}
|
|
}
|
|
}
|
|
|
|
this.ExecHelp=function(anchor)
|
|
{
|
|
var option={width:793,height:480}
|
|
option.title=this.GetLangText("help");
|
|
var helpurl=this._config.editor_help_url;
|
|
if(!helpurl)helpurl=this._config.folder+"help/home.htm";
|
|
option.htmlcode="<iframe style='width:793px;height:480px;' frameborder=0 src='"+jsml.html_encode(helpurl)+"'></iframe>";
|
|
this.ShowXmlDialog(this.BuildDialogUrl("htmlpreview.xml"),option);
|
|
}
|
|
|
|
this._FindStorageArray=function(arr,url,callback)
|
|
{
|
|
var index=-1;
|
|
var editor=this;
|
|
function FindNext()
|
|
{
|
|
index++;
|
|
var category=arr[index];
|
|
if(!category)
|
|
{
|
|
callback(null,null);
|
|
return;
|
|
}
|
|
editor.FindStorage(category,url,function(storage,fileitem)
|
|
{
|
|
if(storage&&fileitem)
|
|
{
|
|
callback(storage,fileitem);
|
|
return;
|
|
}
|
|
FindNext();
|
|
});
|
|
}
|
|
FindNext();
|
|
}
|
|
this.FindStorage=function(category,url,callback)
|
|
{
|
|
if(!category)return;
|
|
if(!category.length)return;
|
|
if(!url)return;
|
|
if(!callback)return;
|
|
|
|
if(typeof(category)!="string"&&category.concat)
|
|
{
|
|
this._FindStorageArray(category,url,callback);
|
|
return;
|
|
}
|
|
|
|
if(url.charAt(0)!="/")
|
|
{
|
|
if(url.indexOf("://")==-1)
|
|
return;
|
|
|
|
if(url.indexOf('://')==-1)
|
|
return;
|
|
var urlbase=this.GetUrlBase();
|
|
if(url.charAt(urlbase.length)!='/')
|
|
return;
|
|
if(url.substring(0,urlbase.length)!=urlbase)
|
|
return;
|
|
url=url.substring(urlbase.length);
|
|
}
|
|
|
|
var editor=this;
|
|
var storages;
|
|
var storage;
|
|
var folderpath;
|
|
var filename;
|
|
|
|
function onstorages(res)
|
|
{
|
|
if(res.Error)return;
|
|
storages=res.ReturnValue;
|
|
|
|
for(var i=0;i<storages.length;i++)
|
|
{
|
|
var store=storages[i];
|
|
var prefix=store.UrlPrefix;
|
|
if(!prefix)continue;
|
|
prefix+="/";
|
|
if(url.substring(0,prefix.length)!=prefix)
|
|
continue;
|
|
folderpath=url.substring(prefix.length-1);
|
|
var pos=folderpath.lastIndexOf("/");
|
|
if(pos==-1)
|
|
continue;
|
|
filename=folderpath.substring(pos+1);
|
|
folderpath=folderpath.substring(0,pos+1);
|
|
storage=store;
|
|
break;
|
|
}
|
|
if(!storage)
|
|
{
|
|
callback(null,null);
|
|
return;
|
|
}
|
|
|
|
storage.UrlPath=folderpath;
|
|
editor.CallAjax("AjaxFindPathItem",onfindpathitem,storage,filename);
|
|
}
|
|
|
|
function onfindpathitem(res)
|
|
{
|
|
if(res.Error)return;
|
|
var fileitem=res.ReturnValue;
|
|
if(!fileitem||fileitem.IsFolder)return;
|
|
callback(storage,fileitem);
|
|
}
|
|
|
|
editor.AsyncGetStoragesWithCache(category,onstorages);
|
|
}
|
|
this.AsyncGetStoragesWithCache=function(category,callback)
|
|
{
|
|
var editor=this;
|
|
|
|
var key="_storagescache"+category;
|
|
var res=editor[key];
|
|
if(res)
|
|
{
|
|
if(!callback)return;
|
|
setTimeout(function()
|
|
{
|
|
callback(res);
|
|
},1);
|
|
return;
|
|
}
|
|
|
|
function onstorages(res)
|
|
{
|
|
editor[key]=res;
|
|
if(callback)callback(res);
|
|
}
|
|
editor.CallAjax("AjaxGetStorages",onstorages,category);
|
|
}
|
|
|
|
this.ShowImageEditor=function(imgnode,storage,fileitem)
|
|
{
|
|
var editor=this;
|
|
var newoption={storage:storage,fileitem:fileitem}
|
|
var rect=jsml.get_body_rect();
|
|
newoption.width=Math.min(900,rect.width-100);
|
|
newoption.height=Math.min(600,rect.height-100);
|
|
newoption.callback=function(res,err)
|
|
{
|
|
if(!res)return;
|
|
}
|
|
newoption.onsaveimage=function(pathitem)
|
|
{
|
|
imgnode.ResyncAttributeToView("src");
|
|
}
|
|
editor.ShowXmlDialog(editor.BuildDialogUrl("imageeditor.xml"),newoption);
|
|
}
|
|
|
|
this.LoadAnchors=function(callback)
|
|
{
|
|
if(!callback)return;
|
|
|
|
var group={text:"anchors",groups:[],links:[]};
|
|
|
|
function ScanAnchors(node)
|
|
{
|
|
if(node.GetNameLower()=="a")
|
|
{
|
|
var name=node.GetAttribute("name");
|
|
if(name)
|
|
{
|
|
var link={text:"#"+name,href:"#"+name}
|
|
group.links.push(link);
|
|
}
|
|
}
|
|
if(!node.GetChildCount)return;
|
|
var c=node.GetChildCount();
|
|
if(!c)return;
|
|
for(var i=0;i<c;i++)
|
|
{
|
|
ScanAnchors(node.GetChildAt(i))
|
|
}
|
|
}
|
|
|
|
ScanAnchors(this.GetBodyNode());
|
|
|
|
setTimeout(function()
|
|
{
|
|
callback(group);
|
|
});
|
|
}
|
|
|
|
this.LoadLinks=function(callback)
|
|
{
|
|
var config=this._config;
|
|
|
|
var group=this._linkrootgroup;
|
|
if(group)
|
|
{
|
|
if(callback)
|
|
setTimeout(function(){callback(group);},1);
|
|
return;
|
|
}
|
|
|
|
group={text:"links",groups:config.linkgrouparray||[],links:config.linkitemarray||[]};
|
|
|
|
var links=config.linkurlarray||[];
|
|
if(!config.disablestaticlinks)
|
|
{
|
|
links.push(config.folder+"config/staticlinks.xml?"+(config._debugmode?new Date().getTime():config._urlsuffix));
|
|
}
|
|
var index=-1;
|
|
|
|
function mergenodes(group,parent)
|
|
{
|
|
var cns=parent.childNodes;
|
|
for(var ci=0;ci<cns.length;ci++)
|
|
{
|
|
var cn=cns.item(ci);
|
|
if(cn.nodeName=="link")
|
|
{
|
|
var text=cn.getAttribute("text")||"";
|
|
var href=cn.getAttribute("href")||"";
|
|
group.links.push({text:text,href:href});
|
|
continue;
|
|
}
|
|
if(cn.nodeName!="group")
|
|
continue;
|
|
|
|
var subgroup=null;
|
|
var text=cn.getAttribute("text")||"";
|
|
var ggs=group.groups;
|
|
for(var gi=0;gi<ggs.length;gi++)
|
|
{
|
|
if(ggs[gi].text==text)
|
|
{
|
|
subgroup=ggs[gi];
|
|
break;
|
|
}
|
|
}
|
|
if(!subgroup)
|
|
{
|
|
subgroup={text:text,groups:[],links:[]};
|
|
ggs.push(subgroup);
|
|
}
|
|
mergenodes(subgroup,cn);
|
|
}
|
|
}
|
|
|
|
var nexturl=this.delegate(function()
|
|
{
|
|
index++;
|
|
var url=links[index];
|
|
if(!url)
|
|
{
|
|
this._linkrootgroup=group;
|
|
if(callback)
|
|
callback(group);
|
|
return;
|
|
}
|
|
|
|
xh=jsml.xmlhttp();
|
|
xh.onreadystatechange=this.delegate(function()
|
|
{
|
|
if(xh.readyState<4)return;
|
|
xh.onreadystatechange=jsml.empty_function;
|
|
|
|
setTimeout(nexturl,1);
|
|
|
|
if(xh.status==0)
|
|
return;
|
|
if(xh.status!=200)
|
|
return;
|
|
if(xh.responseXML==null||xh.responseXML.documentElement==null)
|
|
return;
|
|
|
|
mergenodes(group,xh.responseXML.documentElement);
|
|
});
|
|
xh.open("GET",url,true);
|
|
xh.send("");
|
|
});
|
|
|
|
setTimeout(nexturl,1);
|
|
}
|
|
|
|
|
|
this.LoadTemplates=function(callback)
|
|
{
|
|
var config=this._config;
|
|
|
|
var group=this._templaterootgroup;
|
|
if(group)
|
|
{
|
|
if(callback)
|
|
setTimeout(function(){callback(group);},1);
|
|
return;
|
|
}
|
|
|
|
group={text:"templates",groups:config.templategrouparray||[],templates:config.templateitemarray||[]};
|
|
|
|
var templates=config.templateurlarray||[];
|
|
if(!config.disablestatictemplates)
|
|
{
|
|
templates.push(config.folder+"config/statictemplates.xml?"+(config._debugmode?new Date().getTime():config._urlsuffix));
|
|
}
|
|
var index=-1;
|
|
|
|
function mergenodes(group,parent)
|
|
{
|
|
var cns=parent.childNodes;
|
|
for(var ci=0;ci<cns.length;ci++)
|
|
{
|
|
var cn=cns.item(ci);
|
|
if(cn.nodeName=="template")
|
|
{
|
|
var text=cn.getAttribute("text")||"";
|
|
var href=cn.getAttribute("href")||"";
|
|
group.templates.push({text:text,href:href,code:jsml.get_node_innertext(cn)});
|
|
continue;
|
|
}
|
|
if(cn.nodeName!="group")
|
|
continue;
|
|
|
|
var subgroup=null;
|
|
var text=cn.getAttribute("text")||"";
|
|
var ggs=group.groups;
|
|
for(var gi=0;gi<ggs.length;gi++)
|
|
{
|
|
if(ggs[gi].text==text)
|
|
{
|
|
subgroup=ggs[gi];
|
|
break;
|
|
}
|
|
}
|
|
if(!subgroup)
|
|
{
|
|
subgroup={text:text,groups:[],templates:[]};
|
|
ggs.push(subgroup);
|
|
}
|
|
mergenodes(subgroup,cn);
|
|
}
|
|
}
|
|
|
|
var loadtempfiles=this.delegate(function()
|
|
{
|
|
this._templaterootgroup=group;
|
|
if(callback)
|
|
callback(group);
|
|
});
|
|
|
|
var nexturl=this.delegate(function()
|
|
{
|
|
index++;
|
|
var url=templates[index];
|
|
if(!url)
|
|
{
|
|
loadtempfiles();
|
|
return;
|
|
}
|
|
|
|
xh=jsml.xmlhttp();
|
|
xh.onreadystatechange=this.delegate(function()
|
|
{
|
|
if(xh.readyState<4)return;
|
|
xh.onreadystatechange=jsml.empty_function;
|
|
|
|
setTimeout(nexturl,1);
|
|
|
|
if(xh.status==0)
|
|
return;
|
|
if(xh.status!=200)
|
|
return;
|
|
if(xh.responseXML==null||xh.responseXML.documentElement==null)
|
|
return;
|
|
|
|
mergenodes(group,xh.responseXML.documentElement);
|
|
});
|
|
xh.open("GET",url,true);
|
|
xh.send("");
|
|
});
|
|
|
|
setTimeout(nexturl,1);
|
|
}
|
|
|
|
this.FindNodeByName=function(name,node)
|
|
{
|
|
if(!node)node=this.GetBodyNode();
|
|
if(node.nodeType!=1)
|
|
return;
|
|
if(node.GetAttribute("name")==name)
|
|
return node;
|
|
|
|
if(!node.GetChildCount)return;
|
|
var c=node.GetChildCount();
|
|
if(!c)return;
|
|
for(var i=0;i<c;i++)
|
|
{
|
|
var subnode=node.GetChildAt(i)
|
|
if(!subnode)
|
|
continue;
|
|
subnode=this.FindNodeByName(name,subnode);
|
|
if(subnode)
|
|
return subnode;
|
|
}
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|