function PhotoGallery03(_listHolder, overlayId, bigImageHolderId)
{
  var listHolder;
  var photoList;
  var overlay;
  var bigImageHolder;
  var bigImageCont;
  var int1;
  var curOverlayAlpha;
  var curImageAlpha;
  var imageHolder;
  var testIMG;
  var curSRC;
  var fps = 30;
  var curTestTime;
  var curDelay = 0;
  var easyMode = false;
  var titleTag;
  var prevLink;
  var prev;
  var nextLink;
  var next;
  var w;
  var h;
  var imageW;
  var imageH;
  var marginHor = 50;
  var paddingHor = 20;
  var paddingBttm = 20;
  var topPanelHeight = 86;
  var maxW = 840;
  var maxH = 600+20+86;
  listHolder = _listHolder;
  
  if(listHolder == null)
  {
    return false;
  }
  
  init();
  
  function init()
  {
    var i;
    var closeBtn;
    
    overlay = document.getElementById(overlayId);
    bigImageHolder = document.getElementById(bigImageHolderId);
    
    
    
    imageHolder = getElementsByClass(bigImageHolder, "PGImageHolder")[0];
    bigImageCont = getElementsByClass(bigImageHolder, "PGBigImageContent")[0];
    closeBtn = getElementsByClass(bigImageHolder, "Close")[0];
    titleTag = getElementsByClass(bigImageHolder, "Title")[0];
    prevLink = getElementsByClass(bigImageHolder, "Prev")[0];
    nextLink = getElementsByClass(bigImageHolder, "Next")[0];
    closeBtn.onclick = _closeClickHandler;
    prevLink.onclick = _prevClickHandler;
    nextLink.onclick = _nextClickHandler;
    photoList = getElementsByAttr(listHolder, "rel", "lnk");
    
    for(i = 0; i<photoList.length; i++)
    {
      photoList[i].prev = null;
      if(i>0)
      {
        photoList[i].prev = photoList[Number(i-1)];
      }
      photoList[i].onclick = _itemClickHandler;
      photoList[i].next = null;
      if(i<photoList.length-1)
      {
        photoList[i].next = photoList[Number(i+1)];
      }
    }
    
  }
  function _itemClickHandler(obj)
  { 
    var ths;
    var date;
    var title;
    var overlayHeight = (window.scrollMaxY+window.innerHeight) || document.body.scrollHeight;
    var sels;
    //alert("!!");
    sels = getElementsByAttr(document, "tagName", "SELECT");
    for(i in sels)
    {
      sels[i].style.visibility = "hidden";
    }
    ths = this;
    if(obj === "prev")
    {
      easyMode = true;
      ths = prev;
    }
    if(obj === "next")
    {
      easyMode = true;
      ths = next;
    }
    prev = ths.prev;
    next = ths.next;
    prevLink.className = "";
    prevLink.onclick = _prevClickHandler;
    if(prev === null)
    {
      prevLink.className = "Passive";
      prevLink.onclick = function (){return false};
    }
    nextLink.className = "";
    nextLink.onclick = _nextClickHandler;
    if(next === null)
    {
      nextLink.className = "Passive";
      nextLink.onclick = function (){return false};
    }
    prevLink.parentNode.style.display = "";
    if((next === null) && (prev === null))
    {
      prevLink.parentNode.style.display = "none";
    }
    title = getElementsByTagName(ths, "IMG")[0].alt;
    titleTag.innerHTML = title;
    overlay.style.display = "block";
    overlay.style.height = overlayHeight+"px";
    curOverlayAlpha = 0;
    calcSize();
    testIMG = new Image();
    testIMG.onload = _bigImageLoadHandler;
    curSRC = "/thumbnails/w" + imageW + "h" + imageH + ths.rev;
    date = new Date();
    curTestTime = date.getTime();
    showOverlay();
    if(!easyMode)
    {
      int1 = setInterval(showOverlay, fps);
    }
    return false;
  }
  function showOverlay()
  {
    var val;
    var date;
    if(easyMode)
    {
      clearInterval(int1);
      testIMG.src = curSRC;
      showBigImageHolder();
      return false;
    }
    date = new Date();
    curDelay = date.getTime()-curTestTime;
    if(curDelay>60)
    {
      easyMode = true;
    }
    curTestTime = date.getTime();
    curOverlayAlpha += 0.25;
    
    if(curOverlayAlpha > 0.8)
    {
      clearInterval(int1);
      testIMG.src = curSRC;
      showBigImageHolder();
      return false;
    }
    
    setOpacity(overlay, curOverlayAlpha);
  }
  function calcSize()
  {
    if(window.innerWidth){
      width = window.innerWidth;
      height = window.innerHeight;
    } else if(document.body && document.body.clientWidth){
      width = document.body.clientWidth;
      height = document.documentElement.clientHeight;
    }
    w = width-marginHor*2;
    if(w>maxW)
    {
      w = maxW;
    }
    h = height-100;
    if(h>maxH)
    {
      h = maxH;
    }
    imageW = w-paddingHor*2;
    imageH = h-topPanelHeight-paddingBttm;
    
    
  }
  function showBigImageHolder()
  {
    var scrollY = window.scrollY || document.documentElement.scrollTop;
    var topPos;
    var bigImageTable = getElementsByClass(bigImageHolder, "PGImageTable")[0];
    bigImageCont.style.width = w+"px";
    bigImageCont.style.height = h+"px";
    imageHolder.style.width = imageW+"px";
    imageHolder.style.height = imageH+"px";
    bigImageTable.style.height = imageH+"px";
    bigImageHolder.style.display = "block";
    topPos = height/2 - bigImageHolder.scrollHeight/2;
    topPos += scrollY;
    if(topPos<0)
    {
      topPos = 0;
    }
    
    bigImageHolder.style.top = topPos+"px";
  }
  function _bigImageLoadHandler()
  {
    imageHolder.appendChild(testIMG);
    setOpacity(testIMG, 0);
    curImageAlpha = 0;
    int1 = setInterval(showImage, fps);
  }
  function showImage()
  {
    var val;
    curImageAlpha += 0.25;
    if(curImageAlpha > 1)
    {
      clearInterval(int1);
      curImageAlpha = 1;
    }
    setOpacity(testIMG, curImageAlpha);
  }
  function _closeClickHandler()
  {
    var sels;
    sels = getElementsByAttr(document, "tagName", "SELECT");
    for(i in sels)
    {
      sels[i].style.visibility = "visible";
    }
    clearInterval(int1);
    overlay.style.display = "none";
    bigImageHolder.style.display = "none";
    imageHolder.innerHTML = "";
  }
  function _prevClickHandler()
  {
    imageHolder.innerHTML = "";
    _itemClickHandler("prev");
    return false;
  }
  function _nextClickHandler()
  {
    imageHolder.innerHTML = "";
    _itemClickHandler("next");
    return false;
  }
}
