//v3.0
//(c) 2006 DC PAK
function Gallery(id) {
  this.id = id;
  this.listFile = 'index.php?page=galeria_lista&amp;id=1';
  this.listType = 'full';   // images | full
  this.imgDir = '';
  this.thumbDir = '';
  this.txtDir = '';
  this.thumbPrefix = '';
  this.fullImageUrl = '';   //jeśli jest, obrazek otwiea się w poupie z taką stroną

  this.autoFit = false;             //automatyczne dopasowanie rozmiaru okna
  this.thumbsAlwaysVisible = true;  //miniaturki zawsze widoczne
  this.thumbsLabeled = false;       //podpisy pod miniaturkami
  this.thumbQuantity = 24;          //ilość miniaturek na stronie
  this.slideshowSpeed = 5;          //szybkosć slideshow [sekundy]
  this.maxWidth = 750;              //maxymalna szerokość okna
  this.maxHeight = 500;             //maxymalna wysokość okna
  this.extraWidth = 40;             //dodatkowa szerokość
  this.extraHeight = 100;           //dodatkowa wysokość

  this.currentImg = null;
  this.currentThumbPage = 0;

  this.imgs;
  this.thumbs;
  this.labels;
  this.autoTimer;
  this.mainElm = document.getElementById(this.id+'Element');

  this.nop = nop;
  this.getElementsByTagAndClass = getElementsByTagAndClass;
  this.init = init;
  this.finalizeInit = finalizeInit;
  this.slideshowStart = slideshowStart;
  this.slideshowStop = slideshowStop;
  this.slideshow = slideshow;
  this.autoSize = autoSize;
  this.showImg = showImg;
  this.imgLoaded = imgLoaded;
  this.setImgLabel = setImgLabel;
  this.showPrevImg = showPrevImg;
  this.showNextImg = showNextImg;
  this.showThumbPage = showThumbPage;
  this.showPrevThumbPage = showPrevThumbPage;
  this.showNextThumbPage = showNextThumbPage;

//
  function nop() {}

//zwraca tablicę elementów typu tag o stylu class, potomnych elementu o
  function getElementsByTagAndClass(o) {
  var tc = new Array();
    o = new Array(o);
    for(var i = 1; i < arguments.length; i++)
      tc.push(arguments[i]);
    return getElementsByTagClassArray(o, tc);
  }

//zwraca tablicę elementów typu tag o stylu class, potomnych elementu o
  function getElementsByTagClassArray(o, tc) {
  var r = new Array();
  var elms, tags;
  var tag, cls;
    try {
      if(tc.length > 1) {
        tag = tc.shift();
        cls = tc.shift();
        for(var i = 0; i < o.length; i++) {
          elms = o[i].getElementsByTagName(tag);
          tags = new Array();
          for(var j = 0; j < elms.length; j++)
            tags.push(elms[j]);
          for(var j = tags.length-1; j >= 0; j--)
            if(tags[j].className != cls)
              tags.splice(j, 1);
          r = r.concat(getElementsByTagClassArray(tags, tc));
        }
        return r;
      } else {
        return o;
      }
      return r;
    } catch(ex) { alert(ex); }
  }

//inicjalizacja galerii
  function init() {
    advAJAX.get({
      url: this.listFile
      , tag: this
      , onSuccess : function(obj) { try { obj.tag.finalizeInit(obj.responseText); } catch(ex) {} }
      , onError : function(obj) { try { alert('Error: ' + obj.status); } catch(ex) {} }
    });
  }

//generacja galerii (po otrzymaniu listy plików obrazków l)
  function finalizeInit(l) {
  var matchRE = /[^ ]*\.(jpg|jpeg|gif|png)$/;
  var splitRE = /\r\n|\n/;
  var matches;
  var list;
  var conts = new Array();
  var iConts;
    if(this.listType == 'images') {
      this.imgs = l.split(splitRE);
      for(var i = this.imgs.length-1; i >= 0; i--) {
        matches = this.imgs[i].match(matchRE);
        if(matches != null)
          this.imgs[i] = matches[0];
        else
          this.imgs.splice(i, 1);
      }
    } else {
      var data = l.split(splitRE);
      var dataLength = Math.floor(data.length/3);
      this.imgs = new Array(dataLength);
      this.thumbs = new Array(dataLength);
      this.labels = new Array(dataLength);
      for(var i = dataLength-1; i >= 0; i--) {
        this.thumbs[i] = data[i*3];
        this.imgs[i] = data[i*3+1];
        this.labels[i] = data[i*3+2] != ' ' ? data[i*3+2] : '';
      }
    }
    conts = this.getElementsByTagAndClass(this.mainElm, 'div', 'imgSect', 'div', 'navi');
    for(var i = 0; i < conts.length; i++) {
      iConts = conts[i].getElementsByTagName('a');
      for(var j = 0; j < iConts.length; j++)
        if(iConts[j].className == 'showPrev')
          iConts[j].href = 'javascript:'+this.id+'.showPrevImg();';
        else if(iConts[j].className == 'showNext')
          iConts[j].href = 'javascript:'+this.id+'.showNextImg();';
        else if(iConts[j].className == 'slideshowStart')
          iConts[j].href = 'javascript:'+this.id+'.slideshowStart();';
        else if(iConts[j].className == 'slideshowStop')
          iConts[j].href = 'javascript:'+this.id+'.slideshowStop();';
        else if(iConts[j].className == 'showThumbs')
          iConts[j].href = 'javascript:'+this.id+'.showThumbPage(0);';
    }
    conts = this.getElementsByTagAndClass(this.mainElm, 'div', 'thumbSect', 'div', 'navi');
    for(var i = 0; i < conts.length; i++) {
      iConts = conts[i].getElementsByTagName('a');
      for(var j = 0; j < iConts.length; j++)
        if(iConts[j].className == 'showPrev')
          iConts[j].href = 'javascript:'+this.id+'.showPrevThumbPage();';
        else if(iConts[j].className == 'showNext')
          iConts[j].href = 'javascript:'+this.id+'.showNextThumbPage();';
    }
    conts = this.getElementsByTagAndClass(this.mainElm, 'div', 'imgSect', 'div', 'navi', 'div', 'list');
    list = '';
    if(this.imgs.length > 1 && conts.length > 0) {
      for(var i = 0; i < this.imgs.length; i++)
        list += '<a href="javascript:'+this.id+'.showImg('+i+');" class="active">&nbsp;'+(i+1)+'&nbsp;</a> ';
      for(var i = 0; i < conts.length; i++)
        conts[i].innerHTML = list;
    }
    conts = this.getElementsByTagAndClass(this.mainElm, 'div', 'thumbSect', 'div', 'navi', 'div', 'list');
    list = '';
    if(this.thumbQuantity != null && conts.length > 0) {
      for(var i = 0; i < Math.ceil(this.imgs.length / this.thumbQuantity); i++)
        list += '<a href="javascript:'+this.id+'.showThumbPage('+i+');" class="active">&nbsp;'+(i+1)+'&nbsp;</a> ';
      for(var i = 0; i < conts.length; i++)
        conts[i].innerHTML = list;
    }
    if(this.currentImg != null) {
      this.showImg(this.currentImg-1);
      if(this.thumbsAlwaysVisible)
        this.showThumbPage(0);
    } else {
      this.showThumbPage(0);
    }
    if(this.thumbsAlwaysVisible || this.currentImg != null) {
      conts = this.getElementsByTagAndClass(this.mainElm, 'div', 'imgSect');
      for(var i = 0; i < conts.length; i++)
        conts[i].style.display = 'inline';
    }
    if(this.thumbsAlwaysVisible || this.currentImg == null) {
      conts = this.getElementsByTagAndClass(this.mainElm, 'div', 'thumbSect');
      for(var i = 0; i < conts.length; i++)
        conts[i].style.display = 'inline';
    }
    if(this.imgs.length > 0)
      this.mainElm.style.display = 'inline';
    else
      this.mainElm.style.display = 'none';
  }

//uruchomienie pokazu
  function slideshowStart() {
  var elms = this.getElementsByTagAndClass(this.mainElm, 'div', 'imgSect', 'div', 'navi', 'div', 'slideshow', 'a', 'slideshowStart');
  for(var i = 0; i < elms.length; i++)
    elms[i].style.display = 'none';
  elms = this.getElementsByTagAndClass(this.mainElm, 'div', 'imgSect', 'div', 'navi', 'div', 'slideshow', 'a', 'slideshowStop');
  for(var i = 0; i < elms.length; i++)
    elms[i].style.display = 'inline';
  this.autoTimer = setInterval(this.id+'.slideshow()', 1000*this.slideshowSpeed);
  this.slideshow();
  }

//zatrzymanie pokazu
  function slideshowStop() {
  var elms = this.getElementsByTagAndClass(this.mainElm, 'div', 'imgSect', 'div', 'navi', 'div', 'slideshow', 'a', 'slideshowStart');
    for(var i = 0; i < elms.length; i++)
      elms[i].style.display = 'inline';
    elms = this.getElementsByTagAndClass(this.mainElm, 'div', 'imgSect', 'div', 'navi', 'div', 'slideshow', 'a', 'slideshowStop');
    for(var i = 0; i < elms.length; i++)
      elms[i].style.display = 'none';
    if(this.autoTimer != undefined)
      clearInterval(this.autoTimer);
  }

//pokaz obrazków
  function slideshow() {
    if(++this.currentImg == this.imgs.length)
      this.showImg(0);
    else
      this.showImg(this.currentImg);
  }

//automatyczne wymiarowanie okienka
  function autoSize() {
  var wW = document.all?document.body.clientWidth:window.innerWidth;
  var wH = document.all?document.body.clientHeight:window.innerHeight;
  var o = document.getElementById('imgContent');
  var inners = o==null?null:o.getElementsByTagName('img');
    if(this.autoFit) {
      if(!document.all) {
        window.blur();
        window.resizeTo(2000, 150);
      }
      if(inners.length == 1)
        window.resizeBy(Math.min(inners[0].offsetWidth+extraWidth, maxWidth)-wW, Math.min(inners[0].offsetHeight+extraHeight, maxHeight)-wH);
//      else
//        window.resizeBy(listWidth-wW, listHeight-wH);
      window.focus();
    }
  }

//pokazanie obrazka o numerze n z listy
  function showImg(n) {
    if(this.fullImageUrl != '') {
      var popImage = window.open(this.fullImageUrl+n,'popGallery', 'width=930,height=760,scrollbars=yes,resizable=yes,toolbar=no,userbar=no,location=no,status=no,menubar=no,screenX=100,screenY=100');
    } else {
      var conts;
      var iConts;
        if(n < 0)
          n = 0;
        else if(n >= this.imgs.length)
          n = this.imgs.length-1;
        this.currentImg = n;
        conts = this.getElementsByTagAndClass(this.mainElm, 'div', 'imgSect', 'div', 'navi');
        for(var i = 0; i < conts.length; i++) {
          iConts = conts[i].getElementsByTagName('a');
          for(var j = 0; j < iConts.length; j++) {
            if(iConts[j].className == 'showPrev') {
              if(n == 0)
                iConts[j].style.visibility = 'hidden';
              else
                iConts[j].style.visibility = 'visible';
            } else if(iConts[j].className == 'showNext') {
              if(n == this.imgs.length-1)
                iConts[j].style.visibility = 'hidden';
              else
                iConts[j].style.visibility = 'visible';
            } else if(iConts[j].innerHTML == '&nbsp;'+(n+1)+'&nbsp;') {
              iConts[j].className = 'inactive'
            } else if(iConts[j].className == 'inactive') {
              iConts[j].className = 'active'
            }
          }
        }
        conts = this.getElementsByTagAndClass(this.mainElm, 'div', 'imgSect', 'div', 'content');
        for(var i = 0; i < conts.length; i++) {
          conts[i].innerHTML = '<img src="'+(this.imgDir+this.imgs[n])+'" alt="" />';
          conts[i].style.display = 'inline';
        }
        if(!this.thumbsAlwaysVisible) {
          conts = this.getElementsByTagAndClass(this.mainElm, 'div', 'imgSect');
          for(var i = 0; i < conts.length; i++)
            conts[i].style.display = 'inline';
          conts = this.getElementsByTagAndClass(this.mainElm, 'div', 'thumbSect');
          for(var i = 0; i < conts.length; i++)
            conts[i].style.display = 'none';
        }
        this.imgLoaded(n);
    }
  }

//finalizacja załadowanego obrazka
  function imgLoaded(n) {
    if(this.labels == null) {
      advAJAX.get({
        url: this.txtDir+this.imgs[n].replace(/\.(jpg|jpeg|gif|png)$/, '.txt')
        , tag: this
        , onSuccess : function(obj) {
          try {
            obj.tag.setImgLabel('<div>'+obj.responseText+'</div>');
            obj.tag.autoSize();
          } catch(ex) {}
        }
        , onError : function(obj) {
          try {
            obj.tag.setImgLabel('');
            obj.tag.autoSize();
          } catch(ex) {}
        }
      });
    } else {
      this.setImgLabel('<div>'+(this.labels!=null&&this.labels[n]!=null&&this.labels[n].length>0?this.labels[n]:'')+'</div>');
      this.autoSize();
    }
  }

//wpisuje opis do obrazka
  function setImgLabel(l) {
  var conts = this.getElementsByTagAndClass(this.mainElm, 'div', 'imgSect', 'div', 'label');
    for(var i = 0; i < conts.length; i++)
      conts[i].innerHTML = l;
  }

//pokazuje poprzedni obrazek
  function showPrevImg() {
    this.showImg(this.currentImg-1);
  }

//pokazuje następny obrazek
  function showNextImg() {
    this.showImg(this.currentImg+1);
  }

//pokazanie strony listy miniaturek o numerze n (pierwszej w przypadku braku numeru)
  function showThumbPage(n) {
  var list = '';
  var conts;
    this.slideshowStop();
    if(n < 0)
      n = 0;
    else if(this.thumbQuantity != null && n >= Math.ceil(this.imgs.length / this.thumbQuantity))
      n = Math.ceil(this.imgs.length / this.thumbQuantity)-1;
    this.currentThumbPage = n;
    conts = this.getElementsByTagAndClass(this.mainElm, 'div', 'thumbSect', 'div', 'navi');
    for(var i = 0; i < conts.length; i++) {
      iConts = conts[i].getElementsByTagName('a');
      for(var j = 0; j < iConts.length; j++) {
        if(iConts[j].className == 'showPrev') {
          if(n == 0 || this.thumbQuantity == null)
            iConts[j].style.visibility = 'hidden';
          else
            iConts[j].style.visibility = 'visible';
        } else if(iConts[j].className == 'showNext') {
          if(n >= Math.ceil(this.imgs.length / this.thumbQuantity)-1 || this.thumbQuantity == null)
            iConts[j].style.visibility = 'hidden';
          else
            iConts[j].style.visibility = 'visible';
        } else if(iConts[j].innerHTML == '&nbsp;'+(n+1)+'&nbsp;') {
          iConts[j].className = 'inactive';
        } else if(iConts[j].className == 'inactive') {
          iConts[j].className = 'active';
        }
      }
    }
    for(var i = (this.thumbQuantity==null?0:this.thumbQuantity*n); i < (this.thumbQuantity==null?this.imgs.length:Math.min(this.thumbQuantity*(n+1), this.imgs.length)); i++)
      list += '<div class="thumb">'+
              '<img onClick="'+this.id+'.showImg('+i+');" onMouseOver="this.className=\'over\';" onMouseOut="this.className=\'\';" src="'+(this.thumbDir+this.thumbPrefix+(this.thumbs==null?this.imgs[i]:this.thumbs[i]))+'" alt="" />'+
              (this.thumbsLabeled ? '<div class="label">'+this.labels[i]+'</div>' : '')+
              '</div>';
    conts = this.getElementsByTagAndClass(this.mainElm, 'div', 'thumbSect', 'div', 'content');
    for(var i = 0; i < conts.length; i++)
      conts[i].innerHTML = '<div class="list">'+list+'</div><div class="breaker"></div>';
    conts = this.getElementsByTagAndClass(this.mainElm, 'div', 'thumbSect');
    for(var i = 0; i < conts.length; i++)
      conts[i].style.display = 'inline';
    if(!this.thumbsAlwaysVisible) {
      conts = this.getElementsByTagAndClass(this.mainElm, 'div', 'imgSect');
      for(var i = 0; i < conts.length; i++)
        conts[i].style.display = 'none';
      conts = this.getElementsByTagAndClass(this.mainElm, 'div', 'thumbSect');
      for(var i = 0; i < conts.length; i++)
        conts[i].style.display = 'inline';
    }
    this.autoSize();
  }

//pokazuje poprzednią stronę miniaturek
  function showPrevThumbPage() {
    this.showThumbPage(this.currentThumbPage-1);
  }

//pokazuje następną stronę miniaturek
  function showNextThumbPage() {
    this.showThumbPage(this.currentThumbPage+1);
  }

}
