/*

    dhtml.js cross-browser javascript library for dhtml
    Copyright (C) <2002> Michael Lahr <m.lahr@msh.net>

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation, version 2.

    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public
    License along with this library; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

*/

var dhtml = new DHTML(document);
var dom = new DOM(document);

function DHTML(doc) {

  if (!doc)
    doc = document;

  //var dom     = new DOM(doc);
  var tracker = new Tracker();

  this.getDom = function () {
    return dom;
  }

  this.dom = function() {
    return dom;
  }

  this.getWidth = function(id) {
    if(dom.isNS4())
      return dom.getElementById(id).clip.width;
    else
      return dom.getElementById(id).offsetWidth;
  }

  this.getHeight = function(id) {
    if(dom.isNS4())
      return dom.getElementById(id).clip.height;
    else
      return dom.getElementById(id).offsetHeight;
  }

  this.getElementById = function(id) {
    return dom.getElementById(id);
  }

  this.trackMouse = function(name,group,func_in,func_out) {
    tracker.setOnMouse(name,group,func_in,func_out);
  }

  this.dumpTrackerInFunctions = function() {
    var fun  = tracker.getInFunctions();
    var dump = "length is "+fun.length;
    for(var i=0;i<fun.length;i++)
      dump += fun[i];

    return dump;
  }

  this.dumpTrackerOutFunctions = function() {
    var fun  = tracker.getOutFunctions();
    var dump = "length is "+fun.length;
    for(var i=0;i<fun.length;i++)
      dump += fun[i];

    return dump;
  }

  this.visible = function (id,visibility) {
    
    if (dom.isNS4())
      doc.layers[id].visibility = visibility ? 'show' : 'hide';
    else if(dom.isDOM())
      doc.getElementById(id).style.visibility = visibility ? 'visible' : 'hidden';
    else if (dom.isIE4())
      doc.all[id].style.display = visibility ? 'inline' : 'none';

  }

  this.changeVisibility = function (id) {

    if (dom.isNS4())
      doc.layers[id].visibility = (doc.layers[id].visibility == "show") ? 'hide' : 'show';
    else if(dom.isDOM()) {
      doc.getElementById(id).style.visibility = (
				      (doc.getElementById(id).style.visibility != 'hidden') && 
		      		      (doc.getElementById(id).style.visibility != 'HIDDEN') &&
				      (doc.getElementById(id).style.visibility != '')
						  ) ? 'hidden' : 'visible';
    }
    else if (dom.isIE4())
      doc.all[id].style.display = (doc.all[id].style.display != 'none') ? 'none' : 'inline';
  
  }

  this.moveAbsolute = function (id,left,top) {

    if (dom.isNS4()) {
      doc.layers[id].left = left;
      doc.layers[id].top  = top;
    } else if(dom.isDOM()) {
      doc.getElementById(id).style.left = left;
      doc.getElementById(id).style.top  = top;
    } else if (dom.isIE4()) {
      doc.all[id].style.left = left;
      doc.all[id].style.top  = top;
    }

  }

  this.moveRelative = function (id,to,left,top) {

    var coords = getCoords(to);

    if (dom.isNS4()) {
      doc.layers[id].left = coords[0] + left;
      doc.layers[id].top  = coords[1] + top;
    } else if(dom.isDOM()) {
      doc.getElementById(id).style.left = coords[0] + left;
      doc.getElementById(id).style.top  = coords[1] + top;
    } else if (dom.isIE4()) {
      doc.all[id].style.left = coords[0] + left;
      doc.all[id].style.top  = coords[1] + top;
    }

  }

  function getCoords(id) {

    var coords = new Array(null,null);

    if (dom.isNS4()) {
      coords[0] = doc.layers[id].left;
      coords[1] = doc.layers[id].top;
    } else if(dom.isDOM() || dom.isIE4()) {
      coords[0] = doc.getElementById(id).offsetLeft;
      coords[1] = doc.getElementById(id).offsetTop;
    }

    return coords;

  }

}

function DOM(doc) {
  
  if (!doc)
    doc = document;

  this.isIE4 = function() {
    if ( (doc.all) && ( !isDOM() ) )
      return true;
    else
      return false;
  }

  this.isIE = function() {
    if (doc.all)
      return true;
    else
      return false;
  }

  this.isDOM = function() {
    if (doc.getElementById)
      return true;
    else
      return false;
  }
 
  this.isNS4 = function() {
    if (doc.layers)
      return true;
    else
      return false;
  }

 this.type = function() {
   if (this.isIE4()) 
     return "IE4"; 
   if (this.isNS4()) 
     return "NS4"; 
   if (this.isDOM()) 
     return "DOM"; 
 }

  this.getElementById = function(id,doc) {
    d = document;
    if(doc != null)
      d = doc;

    if (this.isDOM())
      return d.getElementById(id);
    else if (this.isNS4())
      return d.layers[id];
    else if (this.isIE4())
      return d.all[id];
    else
      return null;
  }
 
}



function Tracker() {

  //var dom       = new DOM(document);
  var tracker   = this;
  var groups    = new Array();
  var inFunctions  = new Array();
  var outFunctions = new Array();

  this.getInFunctions = function() {
    return inFunctions;
  }

  this.getOutFunctions = function() {
    return OutFunctions;
  }

  this.setOnMouse = function(n,g,fin,fout) {

    var group = new Group(n,g,['mouseisin','mouseisout']);
    groups[groups.length] = group;

    inFunctions[inFunctions.length]   = fin;
    outFunctions[outFunctions.length] = fout;
  
    for (var i=0;i < g.length;i++) {
      var elem = dom.getElementById(g[i]);
      /*
      if (dom.isNS4()) {
	elem.captureEvents(Event.MOUSEOUT);
	elem.captureEvents(Event.MOUSEOVER);
      }
      */
      elem.onmouseout  = function() { tracker.trackMouseOut(elem);return true};
      elem.onmouseover = function() { tracker.trackMouseOver(elem);return true;}
    }

  }

  this.execFunc = function(id,key) {
    for(var i=0;i<groups.length;i++) {
      if(groups[i].hasMember(id)) {
	if(key == "mouseisin") {
	  inFunctions[i]();
	} else if(key == "mouseisout") {
	  outFunctions[i]();
	}
      }
    }
  }

  this.setFlag = function(id,key,val) {
    for(var i=0;i<groups.length;i++) {
      groups[i].setFlag(id,key,val);
    }
  }

  this.trackMouseOver = function(elem) {

    if(elem != null)
      var id = elem.id;
    else
      var id = this.id;

    tracker.setFlag(id,"mouseisout",false);
    tracker.setFlag(id,"mouseisin",true);
    if(tracker.hasTrueFlag(id,'mouseisin'))
      tracker.execFunc(id,'mouseisin');
    return true;
  }

  this.trackMouseOut = function(elem) {

    if(elem != null)
      var id = elem.id;
    else 
      var id = this.id;

    tracker.setFlag(id,"mouseisout",true);
    tracker.setFlag(id,"mouseisin",false);
    if(!tracker.hasTrueFlag(id,'mouseisin'))
      tracker.execFunc(id,'mouseisout');
    return true;
  }

  this.flagsAreNotFalse = function(id,flag) {
    for(var i=0;i<groups.length;i++) {
      if(groups[i].hasMember(id)) {
        var members = groups[i].getMembers();
        for(var j=0;j<members.length;j++) {
          if(groups[i].getFlag(members[j],flag) == false)
            return false;
        }
      }
    }
    return true;
  }

  this.hasTrueFlag = function(id,flag) {
    for(var i=0;i<groups.length;i++) {
      if(groups[i].hasMember(id)) {
        var members = groups[i].getMembers();
        for(var j=0;j<members.length;j++) {
          if(groups[i].getFlag(members[j],flag) == true)
            return true;
        }
      }
    }
    return false;
  }

  this.flagsAreTrue = function(id,flag) {
    for(var i=0;i<groups.length;i++) {
      if(groups[i].hasMember(id)) {
        var members = groups[i].getMembers();
        for(var j=0;j<members.length;j++) {
          if(groups[i].getFlag(members[j],flag) != true)
            return false;
        }
      }
    }
    return true;
  }

}

function Group(n,g,keys) {

  this.name    = n;
  this.members = g;

  this.flags = new Array(keys.length);
  for(var i=0;i<keys.length;i++) {
    this.flags[keys[i]] = new Array(this.members.length);
  }

  this.getFlag = function(member,key) {
    for(var i=0;i<this.members.length;i++) {
      if(this.members[i] == member) {
	return this.flags[key][i];
      }
    }
    return null;
  }

  this.setFlag = function(member,key,val) {
    for(var i=0;i<this.members.length;i++) {
      if(this.members[i] == member) {
	this.flags[key][i] = val;
      }
    }
  }

  this.hasMember = function(id) {
    var has = false;
    for(var i=0;i<this.members.length;i++) {
      if(this.members[i] == id)
	return true;
    }
    return has;
  }

  this.getMember = function(i) {
    return this.members[i];
  }

  this.setMember = function(m,i) {
    this.members[i] = m;
  }

  this.addMember = function(m) {
    this.members[this.members.length] = m;
  }

  this.getMembers = function() {
    return this.members;
  }

  this.getName = function() {
    return this.name;
  }

}


