function big_img(config)
{
  this.g_images=new Array();

  this.obj_overlay=null;
  this.obj_lightbox=null;
  this.obj_caption=null;
  this.obj_image=null;
  this.obj_loading_image=null;
  this.obj_lightbox_details=null;
  this.obj_next=null;
  this.obj_prev=null;

  this.obj_next_div=null;
  this.obj_prev_div=null;
  
  this.loading_img=config.loading_img;
  this.close_img=config.close_img;
  this.next_img=config.next_img;
  this.prev_img=config.prev_img;


  this.e_info=false;
  var self=this;

  this.group= function(name)
  {
    this.name=name;
    this.elements=new Array();
    var self1=this;
    this.add_element = function(el)
    {
      self1.elements[self1.elements.length]=el;
    }

    this.find_element = function(el)
    {
      for (var i=0,n=self1.elements.length;i<n;i++)
      {
        if (self1.elements[i]==el)
        {
          return i;
        }
      }
      return false;
    }

    this.get_neighbour = function(e_i)
    {
      var xprev=false;
      var xnext=false;
      if (typeof(self1.elements[e_i+1])!=='undefined') xnext=e_i+1;
      if (typeof(self1.elements[e_i-1])!=='undefined') xprev=e_i-1;
      return {prev:xprev,next:xnext};
    }

  }

  this.init_all = function()
  {
    var img_links=document.getElementsByTagName('a');
    for (var i=0,n=img_links.length;i<n;i++)
    {
      var img_link = img_links[i];

      var re = new RegExp(/^bi(\[(.+)\])?$/ig);
      var tmp01=null;
      if (img_link.getAttribute("href") && ((tmp01= re.exec(img_link.getAttribute("rel"))) !==null))
      {
        if (typeof(tmp01[2])=='undefined'||tmp01[2].length==0)
          self.add_element('undefined', img_link);
        else
          self.add_element(tmp01[2], img_link);
        img_link.onclick = function () {self.show(this); return false;}
      }
    }
    var objBody = document.getElementsByTagName("body").item(0);

    self.obj_overlay = document.createElement("div");
    self.obj_overlay.className='bi_overlay';
    self.obj_overlay.onclick = function () {self.hide(); return false;}
    self.obj_overlay.style.display = 'none';
    objBody.insertBefore(self.obj_overlay, objBody.firstChild);

    var imgPreloader = new Image();

    imgPreloader.onload=function()
    {
      var objLoadingImageLink = document.createElement("a");
      objLoadingImageLink.setAttribute('href','#');
      objLoadingImageLink.onclick = function () {self.hide(); return false;}
      self.obj_overlay.appendChild(objLoadingImageLink);

      self.obj_loading_image = document.createElement("img");
      self.obj_loading_image.src = self.loading_img;
      self.obj_loading_image.className='bi_loadingImage';
      objLoadingImageLink.appendChild(self.obj_loading_image);
      imgPreloader.onload=function(){}; //clear onLoad, as IE will flip out w/animated gifs
      return false;
    }
    imgPreloader.src = self.loading_img;

    self.obj_lightbox = document.createElement("div");
    self.obj_lightbox.className='bi_lightbox';
    self.obj_lightbox.style.display = 'none';
    objBody.insertBefore(self.obj_lightbox, self.obj_overlay.nextSibling);

    var objLink = document.createElement("a");
    objLink.setAttribute('href','#');
    objLink.setAttribute('title','Kliknij zeby zamknac');
    objLink.onclick = function () {self.hide(); return false;}
    self.obj_lightbox.appendChild(objLink);

    var imgPreloadCloseButton = new Image();
    imgPreloadCloseButton.onload=function()
    {
      var objCloseButton = document.createElement("img");
      objCloseButton.src = self.close_img;
      objCloseButton.className='bi_closeButton';
      objCloseButton.setAttribute('title',langV.getLV('bi_close'));
      objCloseButton.onclick = function () {self.hide(); return false;}
      self.obj_lightbox.appendChild(objCloseButton);

      return false;
    }
    imgPreloadCloseButton.src = self.close_img;

    var imgPreloadPrevButton = new Image();
    imgPreloadPrevButton.onload=function()
    {
      self.obj_prev= document.createElement("img");
      self.obj_prev.src = self.prev_img;
      self.obj_prev.className='bi_prevButton';
      self.obj_prev.setAttribute('title',langV.getLV('bi_prev'));
      self.obj_prev.onclick = function () {self.prev(); return false;}
      self.obj_lightbox.appendChild(self.obj_prev);

      return false;
    }
    imgPreloadPrevButton.src = self.prev_img;

    var imgPreloadNextButton = new Image();
    imgPreloadNextButton.onload=function()
    {
      self.obj_next= document.createElement("img");
      self.obj_next.src = self.next_img;
      self.obj_next.className='bi_nextButton';
      self.obj_next.setAttribute('title',langV.getLV('bi_next'));
      self.obj_next.onclick = function () {self.next(); return false;}
      self.obj_lightbox.appendChild(self.obj_next);

      return false;
    }
    imgPreloadNextButton.src = self.next_img;
    
    self.obj_image = document.createElement("img");
    objLink.appendChild(self.obj_image);

    self.obj_lightbox_details = document.createElement("div");
    self.obj_lightbox_details.className='bi_lightboxDetails';
    self.obj_lightbox.appendChild(self.obj_lightbox_details);

    self.obj_caption = document.createElement("div");
    self.obj_caption.className='bi_lightboxCaption';
    self.obj_caption.style.display = 'none';
    self.obj_lightbox_details.appendChild(self.obj_caption);

    var objKeyboardMsg = document.createElement("div");
    objKeyboardMsg.className='bi_keyboardMsg';
    objKeyboardMsg.innerHTML = langV.getLV('bi_esc');
    self.obj_lightbox_details.appendChild(objKeyboardMsg);

    self.obj_next_div = document.createElement("div");
    self.obj_next_div.className='bi_nextDiv';
    self.obj_next_div.onclick = function () {self.next(); return false;}
    self.obj_lightbox.appendChild(self.obj_next_div);

    self.obj_prev_div= document.createElement("div");
    self.obj_prev_div.className='bi_prevDiv';
    self.obj_prev_div.onclick = function () {self.prev(); return false;}
    self.obj_lightbox.appendChild(self.obj_prev_div);
  }

  this.get_group_index=function(group_name)
  {
    for (var i=0,n=self.g_images.length;i<n;i++)
    {
      if (self.g_images[i].name==group_name)
      {
        return i;
      }
    }
    return false;
  }

  this.add_element=function(group_name, el)
  {
    var idx=self.get_group_index(group_name);

    if (idx===false)
    {
      idx=self.g_images.length;
      self.g_images[idx]=new self.group(group_name);
    }
    self.g_images[idx].add_element(el);
  }

  this.get_group_by_element=function(el)
  {
    var e_i=false;
    for (var i=0,n=self.g_images.length;i<n;i++)
    {
      if ((e_i=self.g_images[i].find_element(el))!==false)
      {
        return {g_i:i,e_i:e_i};
      }
    }
    return false;
  }

  this.get_next_prev=function()
  {
    return self.g_images[self.e_info.g_i].get_neighbour(self.e_info.e_i);
  }

  this.next=function()
  {
    if (self.e_info!==false)
    {
      var xxx=self.get_next_prev();
      if (xxx.next!==false)
      {
        self.e_info.e_i=xxx.next;
        self.load_image();
        self.sh_next_prev();
      }
    }
  }

  this.prev=function()
  {
    if (self.e_info!==false)
    {
      var xxx=self.get_next_prev();
      if (xxx.prev!==false)
      {
        self.e_info.e_i=xxx.prev;
        self.load_image();
        self.sh_next_prev();
      }
    }
  }

  this.show=function(el)
  {
    var e_info=self.get_group_by_element(el);
    if (e_info!==false)
    {
      self.e_info=e_info;
      self.load_image();
      self.sh_next_prev();
    }
  }

  this.hide = function()
  {
    self.obj_overlay.style.display = 'none';
    self.obj_lightbox.style.display = 'none';

    self.sh_selects(true);

    document.onkeypress = '';
  }

  this.load_image=function()
  {
    var cur_element=self.g_images[self.e_info.g_i].elements[self.e_info.e_i];
    var imgPreload = new Image();

    var arrayPageSize = self.get_page_size();
    var arrayPageScroll = self.get_page_scroll();
    
    if (self.obj_loading_image) {
      self.obj_loading_image.style.top = (arrayPageScroll.y + ((arrayPageSize.w_h - 35 - self.obj_loading_image.height) / 2) + 'px');
      self.obj_loading_image.style.left = (((arrayPageSize.p_w - 20 - self.obj_loading_image.width) / 2) + 'px');
      self.obj_loading_image.style.display = 'block';
    }

    self.obj_overlay.style.height = (arrayPageSize.p_h + 'px');
    self.obj_overlay.style.display = 'block';
    imgPreload.onload=function()
    {
      self.obj_image.src = cur_element.href;
      var x_w = parseInt(imgPreload.width);
      var x_h = parseInt(imgPreload.height);
/*
      var max_w=parseInt(arrayPageSize.w_w/2);
      var max_h=parseInt(arrayPageSize.w_h/2);

      if (x_w>max_w||x_h>max_h)
      {
        if (x_w>max_w)
        {
          var prop = max_w/x_w;
          x_w=max_w;
          x_h=parseInt(x_h*prop);
        }
      
        if (x_h>max_h)
        {
          var prop = max_h/x_h;
          x_h=max_h;
          x_w=parseInt(x_w*prop);
        }
      }
      self.obj_image.style.width=x_w+'px';
      self.obj_image.style.height=x_h+'px';
*/
      var lightboxTop = arrayPageScroll.y + ((arrayPageSize.w_h - 35 - x_h) / 2);
      var lightboxLeft = ((arrayPageSize.p_w - 20 - x_w) / 2);

      self.obj_lightbox.style.top = ((lightboxTop < 0)?0:lightboxTop) + "px";
      self.obj_lightbox.style.left = ((lightboxLeft < 0)?0:lightboxLeft) + "px";
      self.obj_next.style.top=Math.round(x_h/2) + 'px';
      self.obj_prev.style.top=Math.round(x_h/2) + 'px';
      self.obj_lightbox_details.style.width = x_w + 'px';

      self.obj_next_div.style.width=(Math.round(x_w/2)-10) + 'px';
      self.obj_prev_div.style.width=(Math.round(x_w/2)-10) + 'px';
      self.obj_next_div.style.height=(x_h) + 'px';
      self.obj_prev_div.style.height=(x_h) + 'px';

      self.obj_next_div.style.top=10 + 'px';
      self.obj_prev_div.style.top=10 + 'px';

      if(cur_element.getAttribute('title'))
      {
        self.obj_caption.style.display = 'block';
        self.obj_caption.innerHTML = cur_element.getAttribute('title');
      } 
      else 
      {
        self.obj_caption.style.display = 'none';
      }

      if (navigator.appVersion.indexOf("MSIE")!=-1){self.pause(250);}

      if (self.obj_loading_image) { self.obj_loading_image.style.display = 'none'; }

      self.sh_selects(false);

      self.obj_lightbox.style.display = 'block';

      arrayPageSize = self.get_page_size();
      self.obj_overlay.style.height = (arrayPageSize.p_h + 'px');

      self.listen_key();

      return false;
    }
    imgPreload.src = cur_element.href;
  }

  this.sh_next_prev=function()
  {
    var xxx=self.g_images[self.e_info.g_i].get_neighbour(self.e_info.e_i);
    self.load_image();
    self.obj_next.style.display=((xxx.next===false)?'none':'block');
    self.obj_prev.style.display=((xxx.prev===false)?'none':'block');
  }

  this.sh_selects=function(show)
  {
    var selects = document.getElementsByTagName("select");
    for (i = 0; i != selects.length; i++) {
      selects[i].style.visibility = ((show)?"visible":"hidden");
    }
  }

  this.pause=function(numberMillis) 
  {
    var now = new Date();
    var exitTime = now.getTime() + numberMillis;
    while (true) 
    {
      now = new Date();
      if (now.getTime() > exitTime)
        return;
    }
  }


  this.listen_key=function() 
  { 
    document.onkeypress = function(e)
    {
      if (e == null) 
      { // ie
        keycode = event.keyCode;
      } 
      else 
      { // mozilla
        keycode = e.which;
      }
      if(keycode == 27 || keycode == 0)
      { 
        self.hide(); 
      }
    }
  }

  this.get_page_scroll = function()
  {
    var yScroll;

    if (self.pageYOffset) 
    {
      yScroll = self.pageYOffset;
    } else if (document.documentElement && document.documentElement.scrollTop)
    { // Explorer 6 Strict
      yScroll = document.documentElement.scrollTop;
    } else if (document.body) 
    { // all other Explorers
      yScroll = document.body.scrollTop;
    }

    arrayPageScroll = {x:'',y:yScroll}
    return arrayPageScroll;
  }

  this.get_page_size=function()
  {
    var xScroll, yScroll;

    if (window.innerHeight && window.scrollMaxY) 
    {
      xScroll = document.body.scrollWidth;
      yScroll = window.innerHeight + window.scrollMaxY;
    } else if (document.body.scrollHeight > document.body.offsetHeight)
    { // all but Explorer Mac
      xScroll = document.body.scrollWidth;
      yScroll = document.body.scrollHeight;
    } else 
    { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
      xScroll = document.body.offsetWidth;
      yScroll = document.body.offsetHeight;
    }

    var windowWidth, windowHeight;
    if (self.innerHeight) 
    { // all except Explorer
      windowWidth = self.innerWidth;
      windowHeight = self.innerHeight;
    } 
    else if (document.documentElement && document.documentElement.clientHeight) 
    { // Explorer 6 Strict Mode
      windowWidth = document.documentElement.clientWidth;
      windowHeight = document.documentElement.clientHeight;
    } 
    else if (document.body) 
    { // other Explorers
      windowWidth = document.body.clientWidth;
      windowHeight = document.body.clientHeight;
    }

    // for small pages with total height less then height of the viewport
    if(yScroll < windowHeight)
    {
      pageHeight = windowHeight;
    } 
    else 
    {
      pageHeight = yScroll;
    }

    // for small pages with total width less then width of the viewport
    if(xScroll < windowWidth)
      pageWidth = windowWidth;
    else 
      pageWidth = xScroll;

    arrayPageSize = {p_w:pageWidth,p_h:pageHeight,w_w:windowWidth,w_h:windowHeight};
    return arrayPageSize;
  }
  
  this.init_all();
}