// wyswietla popupa
//   el_id -- id elementu (diva) ktory ma sie pokazywac, powinien on miec odpowiednie atrybuty (position, display, filter)
//   noauto -- nieobowiazkowy, jak true to element pojawi sie dopiero po wywolaniu Show()
//   onShow -- nieobowiazkowy, funkcja wywolywana na poczatku pokazywania, po display='block' ale jak jeszcze pelna przezroczystosc
//   onHide -- nieobowiazkowy, funkcja wywolywana na koncu znikania, przed display='none' ale jak juz pelna przezroczystosc
function PopupElement(el_id, onShow, onHide, noauto)
{
  var Show=function(instant)
  {
    if(this.opacity)
      Hide(true);
    this.el.style.display='block';
    if(typeof(this.onShow)=='function')
      this.onShow();
    if(instant)
    {
      this.opacity=100;
      this.SetOpacity();
    }else
    {
      var that=this;  // zaby sie scope zachowalo
      this.timer=setTimeout(function() { that.Showing(); }, this.timeout_step);
    };
  }

  var Hide=function(instant)
  {
    if(this.timer)
    {
      clearTimeout(this.timer);
      this.timer=null;
    };
    if(instant)
    {
      this.opacity=0;
      this.SetOpacity();
      if(typeof(this.onHide)=='function')
        this.onHide();
      this.el.style.display='none';
    }else
    {
      var that=this;  // zaby sie scope zachowalo
      this.timer=setTimeout(function() { that.Hiding(); }, this.timeout_step);
    };
  }

  var Showing=function()
  {
    this.opacity+=this.opacity_step;
    if(this.opacity>100)
    {
      this.opacity=100;
      this.timer=null;
    }else
    {
      var that=this;  // zaby sie scope zachowalo
      this.timer=setTimeout(function() { that.Showing(); }, this.timeout_step);
    };
    this.SetOpacity();
  }

  var Hiding=function()
  {
    this.opacity-=this.opacity_step;
    if(this.opacity<0)
    {
      this.timer=null;
      this.opacity=0;
      this.SetOpacity();
      if(this.onHide)
      {
        this.onHide(this.el);
        this.onHide=null;
      };
      this.el.style.display='none';
    }else
    {
      var that=this;  // zaby sie scope zachowalo
      this.timer=setTimeout(function() { that.Hiding(); }, this.timeout_step);
    };
    this.SetOpacity();
  }

  var SetOpacity=function()
  {
    if(this.el.style.filter) this.el.style.filter='alpha(opacity='+this.opacity+')';
    if(this.el.style.opacity) this.el.style.opacity=this.opacity/100.0;
  }

  this.Show=Show;
  this.Hide=Hide;
  this.Showing=Showing;
  this.Hiding=Hiding;
  this.SetOpacity=SetOpacity;
  this.onShow=onShow;
  this.onHide=onHide;

  this.timer=null;
  this.timeout_step=50;
  this.opacity_step=40;

  this.el_id=el_id;
  this.el=document.getElementById(this.el_id);
  if(!this.el)
    return null;

  this.opacity=0;
  this.SetOpacity();
  if(!noauto)
    this.Show();

  return this;
}
