var PopUp = Class.create({
  initialize: function(elem, closeOnClickOut){
    this.closeOnClickOut = closeOnClickOut;
    this.leftOffset = 0;
    if(!this.dlg) {
      document.body.appendChild($(elem));
      this.dlg = $(elem);
      this.dlg.style.position = 'absolute';
      this.dlg.style.zIndex = 9999;
      if(this.closeOnClickOut)
        Event.observe(document, 'click', this.getcoords.bind(this));
      if (this.dlg && !Boolean(this.shim) && Com.isIE6()) {
        var fid = "ie_shim_hack_" + Date.parse(new Date());
        this.shim = document.createElement('iframe');
        this.shim.id = fid;
        this.shim.name = fid;
        this.shim.fid = fid;
        this.shim.frameBorder = '0';
        this.shim.style.cssText = "position:absolute; top:0; left:0; z-index:-1;";
        this.shim.style.width = this.dlg.getWidth();
        this.shim.style.height = this.dlg.getHeight();        
        this.dlg.appendChild(this.shim);
        this.shim = document.getElementById(fid);
      }
    }
  },

  getcoords: function(e) {
  	cX = e.pointerX(e);
  	cY = e.pointerY(e);
    var boxleft = this.dlg.cumulativeOffset()['left'];
  	var boxright = boxleft + this.dlg.getWidth();
  	var boxtop = this.dlg.cumulativeOffset()['top'];
  	var boxbottom = boxtop + this.dlg.getHeight();
    if(cX > boxright || cX < boxleft || cY > boxbottom || cY < boxtop){
      this.close();
    }
  },

  screenCenter: function(){
    this.dlg.style.left = document.viewport.getScrollOffsets()['left'] +
                          (document.viewport.getWidth() - $(this.dlg).getWidth())/2 + 'px' ;
    this.dlg.style.top = document.viewport.getScrollOffsets()['top'] +
                          (document.viewport.getHeight() - $(this.dlg).getHeight())/2 + 'px' ;
  },

  open: function(){
    this.dlg.style.display = "block";
    this.screenCenter();
    if (this.shim) {
      this.shim.style.height = this.dlg.getHeight();
    }
  },

  close: function(){
    this.dlg.style.display = "none";
    if(this.closeOnClickOut)
      Event.stopObserving(document, 'click', this.getcoords.bind(this));
  }
});
