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.
216 lines
6.4 KiB
216 lines
6.4 KiB
2 years ago
|
/*
|
||
|
DynAPI Distribution
|
||
|
TemplateManager Class
|
||
|
|
||
|
The DynAPI Distribution is distributed under the terms of the GNU LGPL license.
|
||
|
|
||
|
Requires: DynLayer
|
||
|
*/
|
||
|
|
||
|
TemplateManager = {};
|
||
|
TemplateManager.isDynLayer = function(c){
|
||
|
return (c.DynLayer||c._className=='DynLayer');
|
||
|
};
|
||
|
TemplateManager.isLayer = function(c) {
|
||
|
var b = (c.DynLayer||c._className=='DynLayer'); // DynLayer
|
||
|
b = (b||c.HTMLContainer||c._className=='HTMLContainer'); // HTMLContainer
|
||
|
return b;
|
||
|
};
|
||
|
|
||
|
|
||
|
function Template(html,x,y,w,h,color,image){
|
||
|
this.DynLayer = DynLayer;
|
||
|
this.DynLayer(null,x,y,w,h,color,image);
|
||
|
|
||
|
this._fields=[];
|
||
|
this.setHTML(html);
|
||
|
};
|
||
|
var p = dynapi.setPrototype('Template','DynLayer');
|
||
|
p._TemplateSetHTML = DynLayer.prototype.setHTML;
|
||
|
p._insertField = function(fld,value){
|
||
|
if(!this.html) return;
|
||
|
var re = new RegExp('\\{@'+fld+'\\}',"g"); // global
|
||
|
this.html = this.html.replace(re,value);
|
||
|
};
|
||
|
p._insertChild = function(c){
|
||
|
if(!c._created) DynElement._flagPreCreate(c);
|
||
|
var TM = TemplateManager;
|
||
|
var html=c.getOuterHTML();
|
||
|
if(!c._tmplFld) this.html+=html;
|
||
|
else {
|
||
|
var re = new RegExp('\\{@'+c._tmplFld+'\\}');
|
||
|
// Mozilla will collapse/expand table cells whenever the content of the layer changes. To solve this, specify a width for your table cells
|
||
|
if(TM.isLayer(c) && dynapi.ua.ns4) {
|
||
|
// NS4 inline layers does not honor <td align="right">, they're always left align. To solve this a <table> must be used to wrap the ilayers. This will also ensure that <ilayers> behave like block elements in DOM
|
||
|
html='<table cellpadding="0" cellspacing="0" border="0"><tr><td>'+html+'</td></tr></table>';
|
||
|
}
|
||
|
var bf = this.html; //before
|
||
|
var af = this.html.replace(re,html); //after
|
||
|
c.isInline = (bf!=af);
|
||
|
this.html = af;
|
||
|
}
|
||
|
};
|
||
|
p._parseFields = function(){ // retrieve hypertext component & container fields from template
|
||
|
// NOTE: This version of parseField does not support
|
||
|
// nested container fields - any ideas,solution to this?
|
||
|
var i,f,ar,rxC,rxH;
|
||
|
var t=this._template||'';
|
||
|
var exists = t.match(/<htc:.*?\/>/)||t.match(/\{\@(\w+?)\:\[/);
|
||
|
if(!exists) return;
|
||
|
t=t.replace(/\r\n|\n/g,'§'); // convert to single line text
|
||
|
if(dynapi.ua.ns4) {
|
||
|
// ns4 does not support non-greedy matching
|
||
|
rxC = /\{\@(\w+?)\:\[[^\[]*\]\}/g;
|
||
|
rxH = /\<htc\:[^:]*\/\>/g;
|
||
|
}
|
||
|
else{
|
||
|
rxC = /\{\@(\w+?)\:\[.*?\]\}/g;
|
||
|
rxH = /\<htc\:.*?\/\>/g;
|
||
|
}
|
||
|
ar = t.match(rxC); // get all container fields
|
||
|
htc = t.match(rxH); // get all HyperTextComponent fields
|
||
|
|
||
|
if(ar){
|
||
|
// Container field
|
||
|
for(i=0;i<ar.length;i++){
|
||
|
f=ar[i];
|
||
|
f=f.substr(2,f.length-4);
|
||
|
f=f.split(':[');
|
||
|
this._fields[f[0]]=f[1].replace(/§/g,'\n');
|
||
|
}
|
||
|
}
|
||
|
if(htc) {
|
||
|
// HyperText Component field - e.g. <htc:DynLayer(null,10,10,10,0,"Blue") @lyr1 />
|
||
|
for(i=0;i<htc.length;i++){
|
||
|
f=htc[i];
|
||
|
f=f.substr(5,f.length-7);
|
||
|
f=f.split('@');
|
||
|
this.addChild(eval('new '+f[0]),f[1].replace(/\s/g,''));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// replace container field with regular field
|
||
|
if(dynapi.ua.ns4) t=t.replace(/\{\@(\w+?)\:\[[^\[]*\]\}/g,'{@$1}');
|
||
|
else t=t.replace(/\{\@(\w+?)\:\[.*?\]\}/g,'{@$1}');
|
||
|
|
||
|
// replace hyper-text component field with regular field
|
||
|
if(dynapi.ua.ns4) t=t.replace(/<htc:[^:]*@(\w+)[^\/]*\/>/g,'{@$1}');
|
||
|
else t=t.replace(/<htc:.*?@(\w+).*?\/>/g,'{@$1}');
|
||
|
|
||
|
// replace § with \n
|
||
|
this._template = this.html = t.replace(/§/g,'\n');
|
||
|
};
|
||
|
p.addChild = function(c,fld){
|
||
|
if (!c) return dynapi.debug.print("Error: No object sent to [Template].addChild()");
|
||
|
if (c.isChild) c.removeFromParent();
|
||
|
c.isChild = true;
|
||
|
c.parent = this;
|
||
|
if (c._saveAnchor) {
|
||
|
c.setAnchor(c._saveAnchor);
|
||
|
c._saveAnchor = null;
|
||
|
delete c._saveAnchor;
|
||
|
}
|
||
|
c._alias = fld;
|
||
|
if(fld) {
|
||
|
var oc=this[fld];
|
||
|
if(oc && oc.removeFromParent) oc.removeFromParent(); // remove old child
|
||
|
this[fld]=c;
|
||
|
c.isInline=true;
|
||
|
c._tmplFld=fld;
|
||
|
c._noInlineValues=true;
|
||
|
}
|
||
|
var TM = TemplateManager;
|
||
|
if(TM.isDynLayer(c)) {
|
||
|
if(c._tmplFld) c.setPosition('relative');
|
||
|
// NS4 seems to create line breaks with inline layers that contains html
|
||
|
if(dynapi.ua.ns4) c.enableBlackboard(); // this will force a <layer> arround the inline html
|
||
|
}
|
||
|
this.children[this.children.length] = c;
|
||
|
return c;
|
||
|
};
|
||
|
p.addField = function(fld,adjFld,content){
|
||
|
if(!fld) return;
|
||
|
var rx,nFld='{@'+fld+'}';
|
||
|
if(content!=null) this._fields[fld] = content;
|
||
|
if(!adjFld) this.html=this._template+=nFld;
|
||
|
else {
|
||
|
nFld = '{@'+adjFld+'}'+nFld;
|
||
|
rx = new RegExp('\\{@'+adjFld+'\\}',"g"); // global
|
||
|
this._template=this.html=this._template.replace(rx,nFld);
|
||
|
}
|
||
|
};
|
||
|
p.clearTemplate = function(){
|
||
|
delete this._fields;
|
||
|
this.deleteAllChildren();
|
||
|
this._fields = [];
|
||
|
this._template = this.html = '';
|
||
|
this._parseFields();
|
||
|
this._TemplateSetHTML(' ');
|
||
|
};
|
||
|
p.cloneField = function(fld){
|
||
|
if(!fld) return;
|
||
|
var cFld='{@'+fld+'}';
|
||
|
var ar=arguments;
|
||
|
var vl=this._fields[fld];
|
||
|
var rx = new RegExp('\\{@'+fld+'\\}',"g"); // global
|
||
|
for(var i=1;i<ar.length;i++) {
|
||
|
this._fields[ar[i]]=vl;
|
||
|
cFld+='{@'+ar[i]+'}';
|
||
|
}
|
||
|
this._template = this.html = this._template.replace(rx,cFld);
|
||
|
};
|
||
|
// Template Object does not support enableBlackboard
|
||
|
p.enableBlackboard = dynapi.functions.Null;
|
||
|
p.getInnerHTML=function() {
|
||
|
var s = '', fld = this._fields;
|
||
|
var i,c,ch=this.children;
|
||
|
// insert fields
|
||
|
for(i in fld) this._insertField(i,fld[i]);
|
||
|
// insert child layers/objects
|
||
|
for (i=0;i<ch.length;i++) this._insertChild(ch[i]);
|
||
|
if (this.html!=null) {
|
||
|
if(!dynapi.ua.ns4) s+=this.html;
|
||
|
else {
|
||
|
if (this.w==null) s += '<nobr>'+this.html+'</nobr>';
|
||
|
else s+=this.html;
|
||
|
}
|
||
|
}
|
||
|
// replaced unused fields
|
||
|
if(this._defFld!=null) s=s.replace(/\{@(\w+?)\}/g,this._defFld);
|
||
|
else s=s.replace(/\{@(\w+?)\}/g,'<!--$1-->');
|
||
|
return s;
|
||
|
};
|
||
|
p.generate = function(){
|
||
|
// generate and display the changes made to the template
|
||
|
if(!this._created) return;
|
||
|
else {
|
||
|
this.html=this._template; // reset html to last template
|
||
|
var h=this.getInnerHTML();
|
||
|
var i,c,ch=this.children;
|
||
|
this.html = null;
|
||
|
this._TemplateSetHTML(h);
|
||
|
for (i=0;i<ch.length;i++) {
|
||
|
c=ch[i];
|
||
|
c.elm=c.css=null;
|
||
|
if(c.isClass('DynLayer')) DynLayer._assignElement(c);
|
||
|
if(!c._created) DynElement._flagCreate(c);
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
p.setHTML = function(html){
|
||
|
html=(html==null)? '': html+'';
|
||
|
if(this._template!=html){
|
||
|
this._template = this.html = html;
|
||
|
this._parseFields();
|
||
|
if(this._created) this.generate();
|
||
|
}
|
||
|
};
|
||
|
p.getField = function(fld) {return this._fields[fld]};
|
||
|
p.setField = function(fld,value){
|
||
|
this._fields[fld]=value;
|
||
|
};
|
||
|
p.setDefaultFieldValue = function(v){
|
||
|
// changes the default value to be used in unused fields
|
||
|
// from <!--fieldname--> to value specified
|
||
|
this._defFld=v;
|
||
|
};
|