/**
 * Content Management System
 *
 * This script is protected by copyright. It's use, copying, modification
 * and distribution without written consent of the author is prohibited.
 *
 * @author      Krzysztof Kardasz <kardasz@nweb.pl>
 * @copyright   Copyright (c) 2008 Prospekta Ernest Wagner
 */

    var Images = new Array();
    var Page   = 0;
    var Limit  = 4;

    var ActiveImage = 0;
    var ActivePage  = 0;

    var IsNextPage  = false;
    var IsPrevPage  = false;

    var IsNextImage = false;
    var IsPrevImage = false;

    var Big     = new Array();
    var Medium  = new Array();
    var Mini    = new Array();

    var ButtonNextImage;
    var ButtonPrevImage;

    var ButtonNextPage;
    var ButtonPrevPage;

    var ButtonPreview;

    var TextContainer;
    var MiniContainer;
    var MediumContainer;
    var ProgressContainer;

    /**
     * Dodaje zdjęcie właściwe do tablicy galerii
     *
     * @access public
     * @param string file ścieżka do pliku
     * @param string description opis zdjęcia
     * @return boolean
     **/
    function setBigImage(file, description) {
        var i = Big.length;
        Big[i] = new Array(file, description);
    }

    /**
     * Dodaje średnie zdjęcie do tablicy galerii
     *
     * @access public
     * @param string file ścieżka do pliku
     * @return boolean
     **/
    function setMediumImage(file) {
        var i = Medium.length;
        Medium[i] = file;
    }

    /**
     * Dodaje małe zdjęcie do tablicy galerii
     *
     * @access public
     * @param string file ścieżka do pliku
     * @return boolean
     **/
    function setMiniImage(file) {
        var i = Mini.length;
        Mini[i] = file;
    }

    /**
     * Dodaje zdjęcie do galerii
     *
     * @access public
     * @param string big_file ścieżka do zdjęcia właściwego
     * @param string medium_file ścieżka do średniej miniaturki
     * @param string mini_file ścieżka do małej miniaturki
     * @param string description opis zdjęcia
     * @return boolean
     **/
    function setImage(big_file, medium_file, mini_file, description) {
        setBigImage(big_file, description);
        setMediumImage(medium_file);
        setMiniImage(mini_file);
    }

    /**
     * Ustawia aktywne zdjęcie (które jest podglądane)
     *
     * @access public
     * @return boolean
     **/
    function setButtonNextImage(val) {
        ButtonNextImage = $(val);
    }

    /**
     * Ustawia aktywne zdjęcie (które jest podglądane)
     *
     * @access public
     * @return boolean
     **/
    function setButtonPrevImage(val) {
        ButtonPrevImage = $(val);
    }

    /**
     * Ustawia aktywne zdjęcie (które jest podglądane)
     *
     * @access public
     * @return boolean
     **/
    function setButtonPreview(val) {
        ButtonPreview = $(val);
    }

    /**
     * Ustawia aktywne zdjęcie (które jest podglądane)
     *
     * @access public
     * @return boolean
     **/
    function setTextContainer(val) {
        TextContainer = $(val);
    }

    /**
     * Ustawia aktywne zdjęcie (które jest podglądane)
     *
     * @access public
     * @return boolean
     **/
    function setMiniContainer(val) {
        MiniContainer = $(val);
    }

    /**
     * Ustawia aktywne zdjęcie (które jest podglądane)
     *
     * @access public
     * @return boolean
     **/
    function setMediumContainer(val) {
        MediumContainer = $(val);
    }

    /**
     * Ustawia kontener postępu
     *
     * @access public
     * @return boolean
     **/
    function setProgressContainer(val) {
        ProgressContainer = $(val);
    }

    /**
     * Ustawia aktywne zdjęcie (które jest podglądane)
     *
     * @access public
     * @return boolean
     **/
    function setButtonNextPage(val) {
        ButtonNextPage = $(val);
    }

    /**
     * Ustawia aktywne zdjęcie (które jest podglądane)
     *
     * @access public
     * @return boolean
     **/
    function setButtonPrevPage(val) {
        ButtonPrevPage = $(val);
    }

    /**
     * Preloader zdjęć galerii
     *
     * @access public
     * @return void
     **/
    function PreloadImages() {
        var preload_im = new Array();

    	for(i=0; i < Big.length; i++) {
    	   preload_im[i] = new Array();
           preload_im[i][1] = new Image();
           preload_im[i][1].src = Mini[i];

           preload_im[i][2] = new Image();
           preload_im[i][2].src = Medium[i];
    	}
    }

    /**
     * Ustawia aktywne zdjęcie (które jest podglądane)
     *
     * @access public
     * @return boolean
     **/
    function _setActiveImage(i) {
        ActiveImage = i;
        if(isNextPage()) {
            PageNextEnable();
        } else {
            PageNextDisable();
        }

        if(isPrevPage()) {
            PagePrevEnable();
        } else {
            PagePrevDisable();
        }

        if(isNextImage()) {
            ImageNextEnable();
        } else {
            ImageNextDisable();
        }

        if(isPrevImage()) {
            ImagePrevEnable();
        } else {
            ImagePrevDisable();
        }
    }

    /**
     * Ustawia aktywną stronę (która jest otwarta)
     *
     * @access public
     * @return boolean
     **/
    function _setActivePage(i) {
        ActivePage = i;
        if(isNextPage()) {
            PageNextEnable();
        } else {
            PageNextDisable();
        }

        if(isPrevPage()) {
            PagePrevEnable();
        } else {
            PagePrevDisable();
        }

        if(isNextImage()) {
            ImageNextEnable();
        } else {
            ImageNextDisable();
        }

        if(isPrevImage()) {
            ImagePrevEnable();
        } else {
            ImagePrevDisable();
        }
    }

    /**
     * Zwraca flagę czy jest następne zdjęcie
     *
     * @access public
     * @return boolean
     **/
    function isNextImage() {
        return (Big.length > (ActiveImage + 1))
    }

    /**
     * Zwraca flagę czy jest następne zdjęcie
     *
     * @access public
     * @return boolean
     **/
    function isPrevImage() {
        return (ActiveImage > 0);
    }


    /**
     * Zwraca flagę czy jest następne strona
     *
     * @access public
     * @return boolean
     **/
    function isNextPage() {
        return (Big.length > (Limit * ActivePage));
    }

    /**
     * Zwraca flagę czy jest poprzednia strona
     *
     * @access public
     * @return boolean
     **/
    function isPrevPage() {
        return (ActivePage > 1);
    }


    /**
     * Zwraca flagę czy jest poprzednia strona
     *
     * @access public
     * @return boolean
     **/
    function _appendImage (i, medium_file, big_file, description, set_active) {
          var img_medium  = document.createElement("img");
              img_medium.src  = medium_file;
              img_medium.style.display = 'none';
              if(set_active == true) {
                _setActiveImage(i);
              }
              MediumContainer.children('img').fadeOut("slow");
              MediumContainer.html(img_medium);

              MediumContainer.children('img').fadeIn("slow");
              ButtonPreview.children('a').attr('href', big_file);
              TextContainer.html(description);
    }

    /**
     * Zwraca flagę czy jest poprzednia strona
     *
     * @access public
     * @return boolean
     **/
    function _preloadImage (i, medium_file, big_file, description, set_active) {
              /** Przygaszenie na czas ładowania **/
              MediumContainer.children('img').fadeTo(1, 0.4);
              ProgressContainer.show();

	          var loaded = false;

              var preload = new Image();
              preload.src = medium_file;

              preload.onload = function() {
                  ProgressContainer.hide();
                  _appendImage (i, medium_file, big_file, description, set_active);
                  loaded = true;
              };

              if(preload.complete && loaded == false) {
                  ProgressContainer.hide();
                  _appendImage (i, medium_file, big_file, description, set_active);

              }
    }

    /**
     * Dodaje miniaturkę do listy zdjęć
     *
     * @access public
     * @return void
     **/
    function _createImage (i, big_file, medium_file, mini_file, description) {

          var img = document.createElement("img");
              img.style.display = 'none';
    	      img.src     = mini_file;
    	      img.onclick = function () {
                _preloadImage (i, medium_file, big_file, description, true);
              };

          MiniContainer.append(img);
    }

    /**
     * Ładowanie zdjęć z aktualnie wybranej strony
     *
     * @access public
     * @return void
     **/
    function _loadImages() {

        MiniContainer.children('img').fadeOut("slow");
        MiniContainer.children('img').remove();

        if(Big.length > 0) {
            if(Big.length < ActivePage*Limit) {
                var end = Big.length;
            } else {
                var end = ActivePage*Limit;
            }

            _setActiveImage(((ActivePage-1)*Limit));
            for (var i = ((ActivePage-1)*Limit); i < end; i++) {
                _createImage(i, Big[i][0], Medium[i], Mini[i], Big[i][1]);
            }

            MiniContainer.children('img').fadeIn("slow");
        } else {
            PageNextDisable();
            PagePrevDisable();
            ImageNextDisable();
            ImagePrevDisable();
        }
    }

    /**
     * Jedno zdjęcie wstecz
     *
     * @access public
     * @return void
     **/
    function PrevImage() {
        if(IsPrevImage) {
            if((ActiveImage%Limit == 0) && (isPrevPage() == true)) {
                PrevImages();
                _setActiveImage((ActiveImage+3));
            } else {
                _setActiveImage((ActiveImage-1));
            }

            _preloadImage (ActiveImage, Medium[ActiveImage], Big[ActiveImage][0], Big[ActiveImage][1], false);
        }
    }

    /**
     * Następne zdjęcie
     *
     * @access public
     * @return void
     **/
    function NextImage() {
        if(IsNextImage) {
            if(((ActiveImage+1)%Limit) == 0 && ActiveImage > 0) {
                NextImages();
            } else {
                _setActiveImage((ActiveImage+1));
            }

            _preloadImage (ActiveImage, Medium[ActiveImage], Big[ActiveImage][0], Big[ActiveImage][1], false);
        }
    }

    /**
     * Następna strona
     *
     * @access public
     * @return boolean
     **/
    function NextImages() {
        _setActivePage((ActivePage+1));
        _loadImages();
    }

    /**
     * Poprzednia strona
     *
     * @access public
     * @return boolean
     **/
    function PrevImages() {
        _setActivePage((ActivePage-1));
        _loadImages();
    }


    /**
     * Zresetowanie zdjęcia średniego, ustawienie pierwszego zdjęcia z aktualnej strony
     *
     * @access public
     * @return void
     **/
    function _mediumRefresh() {
        var i = (ActivePage-1)*Limit;

        _preloadImage (i, Medium[i], Big[i][0], Big[i][1], true);
    }

    /**
     * Blokuje przycisk poprzedniej strony
     *
     * @access public
     * @return void
     **/
    function PagePrevDisable() {
        IsPrevPage  = false;
    	ButtonPrevPage.children('a img').fadeTo(1, 0.4);
    	ButtonPrevPage.children('a').css("cursor","default");
    }

    /**
     * Odblokuje przycisk poprzedniej strony
     *
     * @access public
     * @return void
     **/
    function PagePrevEnable() {
        IsPrevPage  = true;
    	ButtonPrevPage.children('a img').fadeTo(1, 1);
    	ButtonPrevPage.children('a').css("cursor","pointer");
    }

    /**
     * Blokuje przycisk następnej strony
     *
     * @access public
     * @return void
     **/
    function PageNextDisable() {
        IsNextPage  = false;
    	ButtonNextPage.children('a img').fadeTo(1, 0.4);
    	ButtonNextPage.children('a').css("cursor","default");
    }

    /**
     * Odblokuje przycisk następnej strony
     *
     * @access public
     * @return void
     **/
    function PageNextEnable() {
        IsNextPage  = true;
    	ButtonNextPage.children('a img').fadeTo(1, 1);
    	ButtonNextPage.children('a').css("cursor","pointer");
    }

    /**
     * Blokuje przycisk poprzedniego zdjęcia
     *
     * @access public
     * @return void
     **/
    function ImagePrevDisable() {
        IsPrevImage = false;
    	ButtonPrevImage.children('a img').fadeTo(1, 0.4);
    	ButtonPrevImage.children('a').css("cursor","default");
    }

    /**
     * Odblokuje przycisk poprzedniego zdjęcia
     *
     * @access public
     * @return void
     **/
    function ImagePrevEnable() {
        IsPrevImage = true;
    	ButtonPrevImage.children('a img').fadeTo(1, 1);
    	ButtonPrevImage.children('a').css("cursor","pointer");
    }

    /**
     * Blokuje przycisk następnego zdjęcia
     *
     * @access public
     * @return void
     **/
    function ImageNextDisable() {
        IsNextImage = false;
    	ButtonNextImage.children('a img').fadeTo(1, 0.4);
    	ButtonNextImage.children('a').css("cursor","default");
    }

    /**
     * Odblokuje przycisk następnego zdjęcia
     *
     * @access public
     * @return void
     **/
    function ImageNextEnable() {
        IsNextImage = true;
    	ButtonNextImage.children('a img').fadeTo(1, 1);
    	ButtonNextImage.children('a').css("cursor","pointer");
    }

    function _setImageEvents() {
    	ButtonPrevPage.children('a').click(function(){
            if(isPrevPage()) {
                PrevImages();
                _mediumRefresh();
            }
            return false;
    	});

    	ButtonNextPage.children('a').click(function(){
            if(isNextPage()) {
                NextImages();
                _mediumRefresh();
            }
            return false;
    	});

    	ButtonPrevImage.children('a').click(function(){
            if(isPrevImage()) {
    	       PrevImage();
            }
            return false;
    	});

    	ButtonNextImage.children('a').click(function(){
            if(isNextImage()) {
    	       NextImage();
            }
            return false;
    	});
    }

    /**
     * Inicjacja galerii
     *
     * @access public
     * @return boolean
     **/
    function InitImages() {
        _setActivePage(1);
        if(Big.length > 0) {
            _loadImages();
            _mediumRefresh();
            _setImageEvents();
        }
    }