
function GetRect(el) {
  var left = 0
  var top = 0
  this.width = el.offsetWidth
  this.height = el.offsetHeight
  while (el) {
    left += el.offsetLeft
    top += el.offsetTop
    el = el.offsetParent
  }
  this.left = left;
  this.top = top;
}

function CreateOverlapControler(layer) {

  this._Init = function(layer) {
    this.layer = layer;
    list = new Array();
    this._GetObjects("SELECT", list);
    this._GetObjects("OBJECT", list);
    this._objects = list;
  }

  this._GetObjects = function(tagName, result) {
    var list = document.getElementsByTagName(tagName);
    for (var i=0, len=list.length; i<len; i++)
      result.push( {layer:list.item(i), save:null} );
  };

  this._Overlap = function(obj1, obj2) {
    var r1 = new GetRect(obj1);
    var r2 = new GetRect(obj2);
    return ((r1.left < r2.left + r2.width) && (r1.left + r1.width > r2.left) && (r1.top < r2.top + r2.height) && (r1.top + r1.height > r2.top));
  };

  this.ChangeVisibility = function(val) {
    var list = this._objects;
    for (var i=0, len=list.length; i<len; i++) {
      var obj = list[i];
      if (val && obj.save!=null) {
        obj.layer.style.visibility = obj.save;
        obj.save = null;
      } else if (!val && obj.save==null && this._Overlap(obj.layer, this.layer)) {
        obj.save = obj.layer.style.visibility;
        obj.layer.style.visibility = 'hidden';
      }
    }
  };

  this._Init(layer);
  return this;
}

function ChangeOverlapedVisibility(layer, val) {
  if (!document.all) return;
  if (!layer._overlapObject) {
    layer._overlapObject = new CreateOverlapControler(layer);
  }
  layer._overlapObject.ChangeVisibility(val);
}


