blob: c2edd331641417253c8e474c8f1e39781d25d1c7 [file] [log] [blame]
dojo.provide("dojo.widget.ContentPane");
dojo.require("dojo.widget.*");
dojo.require("dojo.io.*");
dojo.require("dojo.widget.HtmlWidget");
dojo.require("dojo.string");
dojo.require("dojo.string.extras");
dojo.require("dojo.html.style");
dojo.widget.defineWidget("dojo.widget.ContentPane",dojo.widget.HtmlWidget,function(){
this._styleNodes=[];
this._onLoadStack=[];
this._onUnloadStack=[];
this._callOnUnload=false;
this._ioBindObj;
this.scriptScope;
this.bindArgs={};
},{isContainer:true,adjustPaths:true,href:"",extractContent:true,parseContent:true,cacheContent:true,preload:false,refreshOnShow:false,handler:"",executeScripts:false,scriptSeparation:true,loadingMessage:"Loading...",isLoaded:false,postCreate:function(_1,_2,_3){
if(this.handler!==""){
this.setHandler(this.handler);
}
if(this.isShowing()||this.preload){
this.loadContents();
}
},show:function(){
if(this.refreshOnShow){
this.refresh();
}else{
this.loadContents();
}
dojo.widget.ContentPane.superclass.show.call(this);
},refresh:function(){
this.isLoaded=false;
this.loadContents();
},loadContents:function(){
if(this.isLoaded){
return;
}
if(dojo.lang.isFunction(this.handler)){
this._runHandler();
}else{
if(this.href!=""){
this._downloadExternalContent(this.href,this.cacheContent&&!this.refreshOnShow);
}
}
},setUrl:function(_4){
this.href=_4;
this.isLoaded=false;
if(this.preload||this.isShowing()){
this.loadContents();
}
},abort:function(){
var _5=this._ioBindObj;
if(!_5||!_5.abort){
return;
}
_5.abort();
delete this._ioBindObj;
},_downloadExternalContent:function(_6,_7){
this.abort();
this._handleDefaults(this.loadingMessage,"onDownloadStart");
var _8=this;
this._ioBindObj=dojo.io.bind(this._cacheSetting({url:_6,mimetype:"text/html",handler:function(_9,_a,_b){
delete _8._ioBindObj;
if(_9=="load"){
_8.onDownloadEnd.call(_8,_6,_a);
}else{
var e={responseText:_b.responseText,status:_b.status,statusText:_b.statusText,responseHeaders:_b.getAllResponseHeaders(),text:"Error loading '"+_6+"' ("+_b.status+" "+_b.statusText+")"};
_8._handleDefaults.call(_8,e,"onDownloadError");
_8.onLoad();
}
}},_7));
},_cacheSetting:function(_d,_e){
for(var x in this.bindArgs){
if(dojo.lang.isUndefined(_d[x])){
_d[x]=this.bindArgs[x];
}
}
if(dojo.lang.isUndefined(_d.useCache)){
_d.useCache=_e;
}
if(dojo.lang.isUndefined(_d.preventCache)){
_d.preventCache=!_e;
}
if(dojo.lang.isUndefined(_d.mimetype)){
_d.mimetype="text/html";
}
return _d;
},onLoad:function(e){
this._runStack("_onLoadStack");
this.isLoaded=true;
},onUnLoad:function(e){
dojo.deprecated(this.widgetType+".onUnLoad, use .onUnload (lowercased load)",0.5);
},onUnload:function(e){
this._runStack("_onUnloadStack");
delete this.scriptScope;
if(this.onUnLoad!==dojo.widget.ContentPane.prototype.onUnLoad){
this.onUnLoad.apply(this,arguments);
}
},_runStack:function(_13){
var st=this[_13];
var err="";
var _16=this.scriptScope||window;
for(var i=0;i<st.length;i++){
try{
st[i].call(_16);
}
catch(e){
err+="\n"+st[i]+" failed: "+e.description;
}
}
this[_13]=[];
if(err.length){
var _18=(_13=="_onLoadStack")?"addOnLoad":"addOnUnLoad";
this._handleDefaults(_18+" failure\n "+err,"onExecError","debug");
}
},addOnLoad:function(obj,_1a){
this._pushOnStack(this._onLoadStack,obj,_1a);
},addOnUnload:function(obj,_1c){
this._pushOnStack(this._onUnloadStack,obj,_1c);
},addOnUnLoad:function(){
dojo.deprecated(this.widgetType+".addOnUnLoad, use addOnUnload instead. (lowercased Load)",0.5);
this.addOnUnload.apply(this,arguments);
},_pushOnStack:function(_1d,obj,_1f){
if(typeof _1f=="undefined"){
_1d.push(obj);
}else{
_1d.push(function(){
obj[_1f]();
});
}
},destroy:function(){
this.onUnload();
dojo.widget.ContentPane.superclass.destroy.call(this);
},onExecError:function(e){
},onContentError:function(e){
},onDownloadError:function(e){
},onDownloadStart:function(e){
},onDownloadEnd:function(url,_25){
_25=this.splitAndFixPaths(_25,url);
this.setContent(_25);
},_handleDefaults:function(e,_27,_28){
if(!_27){
_27="onContentError";
}
if(dojo.lang.isString(e)){
e={text:e};
}
if(!e.text){
e.text=e.toString();
}
e.toString=function(){
return this.text;
};
if(typeof e.returnValue!="boolean"){
e.returnValue=true;
}
if(typeof e.preventDefault!="function"){
e.preventDefault=function(){
this.returnValue=false;
};
}
this[_27](e);
if(e.returnValue){
switch(_28){
case true:
case "alert":
alert(e.toString());
break;
case "debug":
dojo.debug(e.toString());
break;
default:
if(this._callOnUnload){
this.onUnload();
}
this._callOnUnload=false;
if(arguments.callee._loopStop){
dojo.debug(e.toString());
}else{
arguments.callee._loopStop=true;
this._setContent(e.toString());
}
}
}
arguments.callee._loopStop=false;
},splitAndFixPaths:function(s,url){
var _2b=[],_2c=[],tmp=[];
var _2e=[],_2f=[],_30=[],_31=[];
var str="",_33="",fix="",_35="",tag="",_37="";
if(!url){
url="./";
}
if(s){
var _38=/<title[^>]*>([\s\S]*?)<\/title>/i;
while(_2e=_38.exec(s)){
_2b.push(_2e[1]);
s=s.substring(0,_2e.index)+s.substr(_2e.index+_2e[0].length);
}
if(this.adjustPaths){
var _39=/<[a-z][a-z0-9]*[^>]*\s(?:(?:src|href|style)=[^>])+[^>]*>/i;
var _3a=/\s(src|href|style)=(['"]?)([\w()\[\]\/.,\\'"-:;#=&?\s@]+?)\2/i;
var _3b=/^(?:[#]|(?:(?:https?|ftps?|file|javascript|mailto|news):))/;
while(tag=_39.exec(s)){
str+=s.substring(0,tag.index);
s=s.substring((tag.index+tag[0].length),s.length);
tag=tag[0];
_35="";
while(_30=_3a.exec(tag)){
_33="";
_37=_30[3];
switch(_30[1].toLowerCase()){
case "src":
case "href":
if(_3b.exec(_37)){
_33=_37;
}else{
_33=(new dojo.uri.Uri(url,_37).toString());
}
break;
case "style":
_33=dojo.html.fixPathsInCssText(_37,url);
break;
default:
_33=_37;
}
fix=" "+_30[1]+"="+_30[2]+_33+_30[2];
_35+=tag.substring(0,_30.index)+fix;
tag=tag.substring((_30.index+_30[0].length),tag.length);
}
str+=_35+tag;
}
s=str+s;
}
_38=/(?:<(style)[^>]*>([\s\S]*?)<\/style>|<link ([^>]*rel=['"]?stylesheet['"]?[^>]*)>)/i;
while(_2e=_38.exec(s)){
if(_2e[1]&&_2e[1].toLowerCase()=="style"){
_31.push(dojo.html.fixPathsInCssText(_2e[2],url));
}else{
if(_30=_2e[3].match(/href=(['"]?)([^'">]*)\1/i)){
_31.push({path:_30[2]});
}
}
s=s.substring(0,_2e.index)+s.substr(_2e.index+_2e[0].length);
}
var _38=/<script([^>]*)>([\s\S]*?)<\/script>/i;
var _3c=/src=(['"]?)([^"']*)\1/i;
var _3d=/.*(\bdojo\b\.js(?:\.uncompressed\.js)?)$/;
var _3e=/(?:var )?\bdjConfig\b(?:[\s]*=[\s]*\{[^}]+\}|\.[\w]*[\s]*=[\s]*[^;\n]*)?;?|dojo\.hostenv\.writeIncludes\(\s*\);?/g;
var _3f=/dojo\.(?:(?:require(?:After)?(?:If)?)|(?:widget\.(?:manager\.)?registerWidgetPackage)|(?:(?:hostenv\.)?setModulePrefix|registerModulePath)|defineNamespace)\((['"]).*?\1\)\s*;?/;
while(_2e=_38.exec(s)){
if(this.executeScripts&&_2e[1]){
if(_30=_3c.exec(_2e[1])){
if(_3d.exec(_30[2])){
dojo.debug("Security note! inhibit:"+_30[2]+" from being loaded again.");
}else{
_2c.push({path:_30[2]});
}
}
}
if(_2e[2]){
var sc=_2e[2].replace(_3e,"");
if(!sc){
continue;
}
while(tmp=_3f.exec(sc)){
_2f.push(tmp[0]);
sc=sc.substring(0,tmp.index)+sc.substr(tmp.index+tmp[0].length);
}
if(this.executeScripts){
_2c.push(sc);
}
}
s=s.substr(0,_2e.index)+s.substr(_2e.index+_2e[0].length);
}
if(this.extractContent){
_2e=s.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im);
if(_2e){
s=_2e[1];
}
}
if(this.executeScripts&&this.scriptSeparation){
var _38=/(<[a-zA-Z][a-zA-Z0-9]*\s[^>]*?\S=)((['"])[^>]*scriptScope[^>]*>)/;
var _41=/([\s'";:\(])scriptScope(.*)/;
str="";
while(tag=_38.exec(s)){
tmp=((tag[3]=="'")?"\"":"'");
fix="";
str+=s.substring(0,tag.index)+tag[1];
while(_30=_41.exec(tag[2])){
tag[2]=tag[2].substring(0,_30.index)+_30[1]+"dojo.widget.byId("+tmp+this.widgetId+tmp+").scriptScope"+_30[2];
}
str+=tag[2];
s=s.substr(tag.index+tag[0].length);
}
s=str+s;
}
}
return {"xml":s,"styles":_31,"titles":_2b,"requires":_2f,"scripts":_2c,"url":url};
},_setContent:function(_42){
this.destroyChildren();
for(var i=0;i<this._styleNodes.length;i++){
if(this._styleNodes[i]&&this._styleNodes[i].parentNode){
this._styleNodes[i].parentNode.removeChild(this._styleNodes[i]);
}
}
this._styleNodes=[];
try{
var _44=this.containerNode||this.domNode;
while(_44.firstChild){
dojo.html.destroyNode(_44.firstChild);
}
if(typeof _42!="string"){
_44.appendChild(_42);
}else{
_44.innerHTML=_42;
}
}
catch(e){
e.text="Couldn't load content:"+e.description;
this._handleDefaults(e,"onContentError");
}
},setContent:function(_45){
this.abort();
if(this._callOnUnload){
this.onUnload();
}
this._callOnUnload=true;
if(!_45||dojo.html.isNode(_45)){
this._setContent(_45);
this.onResized();
this.onLoad();
}else{
if(typeof _45.xml!="string"){
this.href="";
_45=this.splitAndFixPaths(_45);
}
this._setContent(_45.xml);
for(var i=0;i<_45.styles.length;i++){
if(_45.styles[i].path){
this._styleNodes.push(dojo.html.insertCssFile(_45.styles[i].path,dojo.doc(),false,true));
}else{
this._styleNodes.push(dojo.html.insertCssText(_45.styles[i]));
}
}
if(this.parseContent){
for(var i=0;i<_45.requires.length;i++){
try{
eval(_45.requires[i]);
}
catch(e){
e.text="ContentPane: error in package loading calls, "+(e.description||e);
this._handleDefaults(e,"onContentError","debug");
}
}
}
var _47=this;
function asyncParse(){
if(_47.executeScripts){
_47._executeScripts(_45.scripts);
}
if(_47.parseContent){
var _48=_47.containerNode||_47.domNode;
var _49=new dojo.xml.Parse();
var _4a=_49.parseElement(_48,null,true);
dojo.widget.getParser().createSubComponents(_4a,_47);
}
_47.onResized();
_47.onLoad();
}
if(dojo.hostenv.isXDomain&&_45.requires.length){
dojo.addOnLoad(asyncParse);
}else{
asyncParse();
}
}
},setHandler:function(_4b){
var fcn=dojo.lang.isFunction(_4b)?_4b:window[_4b];
if(!dojo.lang.isFunction(fcn)){
this._handleDefaults("Unable to set handler, '"+_4b+"' not a function.","onExecError",true);
return;
}
this.handler=function(){
return fcn.apply(this,arguments);
};
},_runHandler:function(){
var ret=true;
if(dojo.lang.isFunction(this.handler)){
this.handler(this,this.domNode);
ret=false;
}
this.onLoad();
return ret;
},_executeScripts:function(_4e){
var _4f=this;
var tmp="",_51="";
for(var i=0;i<_4e.length;i++){
if(_4e[i].path){
dojo.io.bind(this._cacheSetting({"url":_4e[i].path,"load":function(_53,_54){
dojo.lang.hitch(_4f,tmp=";"+_54);
},"error":function(_55,_56){
_56.text=_55+" downloading remote script";
_4f._handleDefaults.call(_4f,_56,"onExecError","debug");
},"mimetype":"text/plain","sync":true},this.cacheContent));
_51+=tmp;
}else{
_51+=_4e[i];
}
}
try{
if(this.scriptSeparation){
delete this.scriptScope;
this.scriptScope=new (new Function("_container_",_51+"; return this;"))(_4f);
}else{
var djg=dojo.global();
if(djg.execScript){
djg.execScript(_51);
}else{
var djd=dojo.doc();
var sc=djd.createElement("script");
sc.appendChild(djd.createTextNode(_51));
(this.containerNode||this.domNode).appendChild(sc);
}
}
}
catch(e){
e.text="Error running scripts from content:\n"+e.description;
this._handleDefaults(e,"onExecError","debug");
}
}});