forked from extern/egroupware
289 lines
7.2 KiB
JavaScript
289 lines
7.2 KiB
JavaScript
/*
|
|
DynAPI Distribution
|
|
DynDocument Class
|
|
|
|
The DynAPI Distribution is distributed under the terms of the GNU LGPL license.
|
|
|
|
requires: dynapi.api.DynElement
|
|
*/
|
|
|
|
function DynDocument(frame) {
|
|
this.DynElement = DynElement;
|
|
this.DynElement();
|
|
this.frame = frame;
|
|
this.doc = this.frame.document;
|
|
this._dyndoc = this;
|
|
this.x = 0;
|
|
this.y = 0;
|
|
this.w = 0;
|
|
this.h = 0;
|
|
this._topZIndex = 10000;
|
|
var o = this;
|
|
this.frame.onresize = function() {o._handleResize()};
|
|
this.onResizeNS4 = "reload"; // or "redraw"
|
|
this._created = false;
|
|
};
|
|
var p = dynapi.setPrototype('DynDocument','DynElement');
|
|
p._remove = function() {
|
|
this.elm=null;
|
|
this.doc=null;
|
|
this.frame=null;
|
|
};
|
|
p.getBgColor = function() {
|
|
return this.bgColor;
|
|
};
|
|
p.getX = p.getY = p.getPageX = p.getPageY = dynapi.functions.Zero;
|
|
p.getWidth = function() {
|
|
if (!this.w) this.findDimensions();
|
|
return this.w;
|
|
};
|
|
p.getHeight = function() {
|
|
if (!this.h) this.findDimensions();
|
|
return this.h;
|
|
};
|
|
p.getXScroll = function ()
|
|
{
|
|
return (dynapi.ua.ns)? this.frame.pageXOffset : this.elm.scrollLeft;
|
|
}
|
|
p.getYScroll = function ()
|
|
{
|
|
return (dynapi.ua.ns)? this.frame.pageYOffset : this.elm.scrollTop;
|
|
}
|
|
p.findDimensions = function() {
|
|
this.w=(dynapi.ua.ns||dynapi.ua.opera)? this.frame.innerWidth : (dynapi.ua.ie6) ?
|
|
this.doc.documentElement.clientWidth : this.elm.clientWidth;
|
|
this.h=(dynapi.ua.ns||dynapi.ua.opera)? this.frame.innerHeight : (dynapi.ua.ie6) ?
|
|
this.doc.documentElement.clientHeight : this.elm.clientHeight;
|
|
};
|
|
p.setBgColor = function(color) {
|
|
if (color == null) color='';
|
|
if (dynapi.ua.ns4 && color == '') color = '#ffffff';
|
|
this.bgColor = color;
|
|
this.doc.bgColor = color;
|
|
};
|
|
p.setFgColor = function(color) {
|
|
if (color == null) color='';
|
|
if (dynapi.ua.ns4 && color == '') color='#ffffff';
|
|
this.fgColor = color;
|
|
this.doc.fgColor = color;
|
|
};
|
|
p.insertChild = function(c,pos,usebp) { // Blueprint Enabled
|
|
if (c && !c.isInline && c.parent == this) {
|
|
if(pos) c.setPosition(pos);
|
|
DynElement._flagPreCreate(c);
|
|
if(usebp)
|
|
c.isInline=c._noInlineValues=true;
|
|
else {
|
|
this.doc.write(c.getOuterHTML());
|
|
c._inserted = true;
|
|
}
|
|
}
|
|
};
|
|
p.insertAllChildren = function(usebp,bpSrc) { // Blueprint Enabled
|
|
var i,c,str =[''];
|
|
var ch=this.children;
|
|
for(i=0;i<ch.length;i++) {
|
|
c = ch[i];
|
|
if(!c.isInline && !c._inserted){
|
|
DynElement._flagPreCreate(c);
|
|
if(usebp)
|
|
c.isInline=c._noInlineValues=true;
|
|
else {
|
|
str[i]=c.getOuterHTML();
|
|
c._inserted = true;
|
|
}
|
|
}
|
|
}
|
|
if(this._hBuffer.length) this.doc.write(this._hBuffer.join('')); // used by addHTML()
|
|
if(usebp){
|
|
if(bpSrc) dynapi.frame.document.write('<script type="text/javascript" language="JavaScript" src="'+bpSrc+'"><\/script>');
|
|
}
|
|
else {
|
|
this.doc.write(str.join('\n'));
|
|
this.doc.close();
|
|
}
|
|
};
|
|
|
|
p._create = function() {
|
|
var ua=dynapi.ua;
|
|
this._created = true;
|
|
if (ua.ns4) {
|
|
this.css = this.doc;
|
|
this.elm = this.doc;
|
|
}
|
|
else {
|
|
this.elm = this.frame.document.body;
|
|
this.css = this.frame.document.body.style;
|
|
if (ua.ie) {
|
|
this._overflow = this.css.overflow || '';
|
|
}
|
|
if (this._cursor) this.css.cursor = this._cursor;
|
|
}
|
|
this.elm._dynobj = this;
|
|
this.doc._dynobj = this; // DynKeyEvent needs this!
|
|
this.findDimensions();
|
|
|
|
this.fgColor = this.doc.fgColor||'';
|
|
this.bgColor = this.doc.bgColor||'';
|
|
|
|
var divs;
|
|
// create divs object - speeds up DOM browsers on Win32. Linux & Mac?
|
|
if (ua.ie||ua.dom) {
|
|
divs={};
|
|
var dv,all=(ua.ie||ua.opera)? document.all.tags('div') : document.getElementsByTagName('div');
|
|
var i=0,l=all.length; // very important!
|
|
while (i<l){
|
|
dv=all[i];
|
|
divs[dv.id]=dv;
|
|
i++;
|
|
}
|
|
}
|
|
|
|
var c,ch=this.children;
|
|
for(i=0;i<ch.length;i++){
|
|
c=ch[i];
|
|
if (c._inserted) c._createInserted(divs);
|
|
else if(c.isInline) c._createInline(divs);
|
|
else c._create();
|
|
};
|
|
this._updateAnchors();
|
|
|
|
if(ua.ie && this._textSelectable==false) this.doc.onselectstart = dynapi.functions.Deny;
|
|
|
|
if (this.captureMouseEvents) this.captureMouseEvents();
|
|
if (this.captureKeyEvents) this.captureKeyEvents();
|
|
this.invokeEvent('load');
|
|
};
|
|
p.destroyAllChildren = function() {
|
|
for (var i=0;i<this.children.length;i++) {
|
|
this.children[i]._destroy();
|
|
delete this.children[i];
|
|
}
|
|
this.children = [];
|
|
};
|
|
p._destroy = function() {
|
|
this.destroyAllChildren();
|
|
delete DynObject.all;
|
|
this.elm = null;
|
|
this.css = null;
|
|
this.frame = null;
|
|
};
|
|
|
|
p._handleResize = function() {
|
|
var w = this.w;
|
|
var h = this.h;
|
|
this.findDimensions();
|
|
if (this.w!=w || this.h!=h) {
|
|
if (dynapi.ua.ns4) {
|
|
if (this.onResizeNS4=="redraw") {
|
|
for (var i=0;i<this.children.length;i++) {
|
|
this.children[i].elm = null;
|
|
if (this.children[i]._created) {
|
|
this.children[i]._created = false;
|
|
this.children[i]._create();
|
|
}
|
|
}
|
|
this.invokeEvent('resize');
|
|
}
|
|
else if (this.onResizeNS4=="reload") {
|
|
this.doc.location.href = this.doc.location.href;
|
|
}
|
|
}
|
|
else {
|
|
this.invokeEvent('resize');
|
|
this._updateAnchors();
|
|
}
|
|
}
|
|
};
|
|
p.getCursor = function() {return (this._cursor=='pointer')? 'hand':this._cursor};
|
|
p.setCursor = function(c) {
|
|
if (!c) c = 'default';
|
|
else c=(c+'').toLowerCase();
|
|
if (!dynapi.ua.ie && c=='hand') c='pointer';
|
|
if (this._cursor!=c) {
|
|
this._cursor = c;
|
|
if (this.css) this.css.cursor = c;
|
|
}
|
|
};
|
|
p.setTextSelectable = function(b){
|
|
this._textSelectable = b;
|
|
if(!dynapi.ua.ie) this.captureMouseEvents();
|
|
else{
|
|
if (this.doc) this.doc.onselectstart = b? dynapi.functions.Allow : dynapi.functions.Deny;
|
|
}
|
|
if (!b) this.setCursor('default');
|
|
};
|
|
p.showScrollBars = function(b){
|
|
if(b==this._showScroll) return;
|
|
else this._showScroll=b;
|
|
if(dynapi.ua.ie){
|
|
window.setTimeout('document.body.scroll="'+((b)? 'yes':'no')+'"',100);
|
|
}else if(dynapi.ua.ns||dynapi.ua.opera){
|
|
if(b){
|
|
this._docSize=[document.width,document.height];
|
|
document.width = this.frame.innerWidth;
|
|
document.height = this.frame.innerHeight;
|
|
}else if(this._docSize){
|
|
document.width = this._docSize[0];
|
|
document.height = this._docSize[1];
|
|
}
|
|
}
|
|
};
|
|
p.writeStyle = function(s){
|
|
// note: don't ever add \n to the end of the following strings or ns4 will choke!
|
|
if(!s) return;
|
|
var css ='<style><!-- ';
|
|
for(var i in s) css +='.'+i+' {'+s[i]+';} ';
|
|
css += ' --></style>';
|
|
document.write(css);
|
|
};
|
|
|
|
p._hBuffer = [];
|
|
p.addHTML = function(html){
|
|
var elm,ua = dynapi.ua;
|
|
var hbuf=this._hBuffer;
|
|
var cnt=(this._hblc)? this._hblc++:(this._hblc=1);
|
|
if (ua.ns4) {
|
|
html='<nobr>'+html+'<nobr>';
|
|
if(!this._created) hbuf[cnt]=html;
|
|
else {
|
|
elm=new Layer(0,this.frame);
|
|
elm.left=elm.top=0;
|
|
var doc=elm.document;
|
|
elm.clip.width=dynapi.document.w;
|
|
elm.clip.height=dynapi.document.h;
|
|
doc.open();doc.write(html);doc.close();
|
|
elm.visibility = 'inherit';
|
|
}
|
|
}
|
|
else {
|
|
var pelm=this.elm;
|
|
if(!this._created) hbuf[cnt]=html;
|
|
else {
|
|
if(ua.ie){
|
|
pelm.insertAdjacentHTML("beforeEnd",html);
|
|
elm = pelm.children[pelm.children.length-1];
|
|
}
|
|
else{
|
|
var r = pelm.ownerDocument.createRange();
|
|
r.setStartBefore(pelm);
|
|
var ptxt = r.createContextualFragment(html);
|
|
pelm.appendChild(ptxt);
|
|
elm = pelm.lastChild;
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
function main() {
|
|
if (dynapi.document==null) {
|
|
dynapi.document = new DynDocument(dynapi.frame);
|
|
if (dynapi.loaded) dynapi.document._create();
|
|
else dynapi.onLoad(function() {
|
|
dynapi.document._create();
|
|
});
|
|
}
|
|
};
|
|
if (!dynapi.loaded) main();
|
|
|