/**
 * Image gallery. Shows 20 images in a 5x4 table. Uses $ 1.3.x and jquery-ui
 * effects
 * 
 * @author Andrei Ghiuta <andreighiuta@shareforce.eu>
 * @author Paul Comanici <paulcomanici@shareforce.eu>
 */

function ImageSliderClass() {
}

ImageSliderClass.prototype = {

    pagesMax : 0,
    pagesMin : 0,
    galleryNumber : 0,
    pageActive : true,
    activePageClick : true,
    populatePageUrl : '',
    populatePageParams : {},
    animationSpeed : 0,
    ajaxLoaderImg : '/images/ajax-loader.gif',
    nextImg : '/images/next-page.png',
    prevImg : '/images/prev-page.png',
    nextImgInactive : '/images/next-page-inactive.png',
    prevImgInactive : '/images/prev-page-inactive.png',
    ajaxCount : 0,

    init : function(options) {
        this.pagesMax = parseInt(options.pagesMax, 10) || this.pagesMax;
        this.pagesMin = parseInt(options.pagesMin, 10) || this.pagesMin;
        this.galleryNumber = options.galleryNumber || this.galleryNumber;
        this.activePageClick = options.activePageClick || this.activePageClick;
        this.populatePageUrl = options.populatePageUrl || this.populatePageUrl;
        this.populatePageParams = options.populatePageParams || this.populatePageParams;
        this.animationSpeed = options.animationSpeed || this.animationSpeed;
        
        var objInstance = this;
        $("#FI_archivePageNext" + this.galleryNumber + " img").die();
        $("#FI_archivePageNext" + this.galleryNumber + " img").live("click", function() {
            objInstance.nextClick();
        });
        $("#FI_archivePagePrev" + this.galleryNumber + " img").die();
        $("#FI_archivePagePrev" + this.galleryNumber + " img").live("click", function() {
            objInstance.previousClick();
        });

        this.populatePage("1", "currentPage", function(){
          objInstance.populatePage("2", "nextPage");
        });
        $("#gallery" + this.galleryNumber + " .pageNr").live('click', function() {
            var className = $(this).attr('class');
            var pageNr = parseInt(className.replace(/pageNr/g, ''), 10);
            objInstance.goToPage(pageNr);
        });
    },
    reloadPages : function(){
    	$('#gallery' + this.getCurrentGalleryNr() + ' .FI_center').html('');
    	var currentObj = this;
    	this.populatePage("1", 'currentPage', function(){currentObj.populatePage("2", "nextPage")});
    	this.setCurrentPageNr(1);
    	$("#FI_archivePageNext" + this.galleryNumber + " img").die();
      $("#FI_archivePageNext" + this.galleryNumber + " img").live("click", function() {
        currentObj.nextClick();
      });
      $("#FI_archivePagePrev" + this.galleryNumber + " img").die();
      $("#FI_archivePagePrev" + this.galleryNumber + " img").live("click", function() {
        currentObj.previousClick();
      });
    },
    setPopulatePageParams : function(params){
    	this.populatePageParams = params;
    },
    getPopulatePageParams : function(){
    	return this.populatePageParams;
    },
    setActivePageClick : function() {
        this.pageActive = true;
    },
    unsetActivePageClick : function() {
        this.pageActive = false;
    },
    getActivePageClick : function() {
        return this.pageActive;
    },
    setPagesMax : function(pages) {
      this.pagesMax = pages;
      $('#gallery' + this.galleryNumber + ' .totalPages').html(pages);
    },
    getPagesMax : function() {
        return this.pagesMax;
    },
    getPagesMin : function() {
        return this.pagesMin;
    },
    setCurrentGalleryNr : function(newGalleryNr) {
        this.galleryNumber = newGalleryNr;
    },
    getCurrentGalleryNr : function() {
        return this.galleryNumber;
    },
    populatePage : function(pageNumber, pageId, callback) {
        pageNumber = parseInt(pageNumber, 10);
        var currentPageNr = this.getCurrentPageNr();
        this.unsetActivePageClick();
        if (this.getPagesMax() >= pageNumber && this.getPagesMin() <= pageNumber) {
            var postData = this.populatePageParams;
            postData.page = pageNumber;
            var objInstance = this;
            if ($('#' + pageId + this.getCurrentGalleryNr()).length != 0)
            {
                $('#' + pageId + this.getCurrentGalleryNr()).removeAttr('id');
            }
            if ($('#gallery' + this.getCurrentGalleryNr() + ' .FI_center .FIGpage'+pageNumber).length == 0 || $('#gallery' + this.getCurrentGalleryNr() + ' .FI_center .FIGpage'+pageNumber).html() == '')
            {
                $('#gallery' + this.getCurrentGalleryNr() + ' .FI_center .FIGpage'+pageNumber).remove();
                $('#gallery' + this.getCurrentGalleryNr() + ' .FI_center').append(
                        '<div id="'+pageId + this.getCurrentGalleryNr()+'" class="FIGpage FIGpage'+pageNumber+'" style="display:none"></div>');
                $.ajax({
//                    async : false,
                    type : "GET",
                    url : this.populatePageUrl,
                    data : postData,
                    dataType : 'html',
                    success : function(data) {
                        $('#' + pageId + objInstance.getCurrentGalleryNr()).html(data);
                        var maxPages = parseInt($('#gallery'+ objInstance.getCurrentGalleryNr()).find('.totalPagesSearch').first().html(), 10);
                        if (0 != maxPages && !isNaN(maxPages))
                          {
                          objInstance.setPagesMax(maxPages)
                          }
                        if ('currentPage' == pageId)
                        {
                            $('#' + pageId + objInstance.getCurrentGalleryNr()).show();
                        }
                        if (currentPageNr == objInstance.getPagesMax()) {
                          jQuery("#FI_archivePageNext" + objInstance.getCurrentGalleryNr() + ' img').attr('src', objInstance.nextImgInactive);
                        } else {
                          jQuery("#FI_archivePageNext" + objInstance.getCurrentGalleryNr() + ' img').attr('src', objInstance.nextImg);
                        }
                        if (currentPageNr == objInstance.getPagesMin()) {
                          jQuery("#FI_archivePagePrev" + objInstance.getCurrentGalleryNr() + ' img').attr('src', objInstance.prevImgInactive);
                        } else {
                          jQuery("#FI_archivePagePrev" + objInstance.getCurrentGalleryNr() + ' img').attr('src', objInstance.prevImg);
                        }
                        if (callback)
                        {
                            callback();
                        }
                        objInstance.setActivePageClick();
                    },
                    error : function(errMsg) {
                    },
                    beforeSend : function(){
                        objInstance.ajaxCount = objInstance.ajaxCount + 1;
                        objInstance.unsetActivePageClick();
                        if (currentPageNr == pageNumber)
                        {
                            $('#gallery' + objInstance.getCurrentGalleryNr() + ' .FI_overlay').show();
                        }
                        else if (currentPageNr < pageNumber)
                        {
                            $("#FI_archivePageNext" + objInstance.getCurrentGalleryNr() + ' img').attr('src', objInstance.ajaxLoaderImg);
                        }
                        else
                        {
                            $("#FI_archivePagePrev" + objInstance.getCurrentGalleryNr() + ' img').attr('src', objInstance.ajaxLoaderImg);
                        }
                    },
                    complete : function(XMLHttpRequest, textStatus) {
                        objInstance.ajaxCount = objInstance.ajaxCount - 1;
                        if (currentPageNr == pageNumber)
                        {
                            $('#gallery' + objInstance.getCurrentGalleryNr() + ' .FI_overlay').hide();
                        }
                        else if (currentPageNr < pageNumber)
                        {
                            $("#FI_archivePageNext" + objInstance.getCurrentGalleryNr() + ' img').attr('src', objInstance.nextImg);
                        }
                        else
                        {
                            $("#FI_archivePagePrev" + objInstance.getCurrentGalleryNr() + ' img').attr('src', objInstance.prevImg);
                        }
                    }
                });
            }
            else
            {
                $('#gallery' + this.getCurrentGalleryNr() + ' .FI_center .FIGpage'+pageNumber).attr('id', pageId + this.getCurrentGalleryNr());
                if (callback)
                {
                    callback();
                }
                this.setActivePageClick();
            }
        } else {
            this.setActivePageClick();
        }
        if (currentPageNr == this.getPagesMax()) {
          jQuery("#FI_archivePageNext" + this.getCurrentGalleryNr() + ' img').attr('src', this.nextImgInactive);
        } else {
          jQuery("#FI_archivePageNext" + this.getCurrentGalleryNr() + ' img').attr('src', this.nextImg);
        }
        if (currentPageNr == this.getPagesMin()) {
          jQuery("#FI_archivePagePrev" + this.getCurrentGalleryNr() + ' img').attr('src', this.prevImgInactive);
        } else {
          jQuery("#FI_archivePagePrev" + this.getCurrentGalleryNr() + ' img').attr('src', this.prevImg);
        }
//        var min = (this.getPagesMin() >= (currentPageNr - 10)) ? this.getPagesMin() : (currentPageNr - 10);
//        var max = (this.getPagesMax() <= (currentPageNr + 9)) ? this.getPagesMax() : (currentPageNr + 9);
//        for ( var i = min; i <= max; i++) {
//            $("#gallery" + this.getCurrentGalleryNr() + " .pageNr" + i).show();
//        }
//        for ( var i = 1; i < min; i++) {
//            $("#gallery" + this.getCurrentGalleryNr() + " .pageNr" + i).hide();
//        }
//        for ( var i = max+1; i <= this.getPagesMax(); i++) {
//            $("#gallery" + this.getCurrentGalleryNr() + " .pageNr" + i).hide();
//        }
    },
    setCurrentPageNr : function(newPageNr) {
//        $('#gallery' + this.getCurrentGalleryNr() + ' .pageNrCurrent').removeClass('pageNrCurrent').addClass('pageNr');
//        $('#gallery' + this.getCurrentGalleryNr() + ' .pageNr' + newPageNr).addClass('pageNrCurrent');
        $('#gallery' + this.getCurrentGalleryNr() + ' .pageNr').html(newPageNr);
    },
    getCurrentPageNr : function() {
        return parseInt($('#gallery' + this.getCurrentGalleryNr() + ' .pageNr').html(), 10);
    },
    goForwardToPage : function(pageNr) {
        var galleryNumber = this.getCurrentGalleryNr();
        var objInstance = this;
        this.setCurrentPageNr(pageNr);
        this.populatePage(pageNr, 'nextPage', function(){
            $("#currentPage" + galleryNumber).hide('slide', {
                direction : 'left'
            }, objInstance.animationSpeed, function() {
            });
            $("#nextPage" + galleryNumber).show('slide', {
                direction : 'right'
            }, objInstance.animationSpeed, function() {
                $("#previousPage" + galleryNumber).attr('id', 'previousPageTemp');
                $("#currentPage" + galleryNumber).attr('id', 'previousPage' + galleryNumber);
                $("#nextPage" + galleryNumber).attr('id', 'currentPage' + galleryNumber);
                $("#previousPageTemp").attr('id', 'nextPage' + galleryNumber);
    
                objInstance.populatePage(pageNr + 1, 'nextPage');
                if (pageNr - 1 >= objInstance.getPagesMin()) {
                    objInstance.populatePage(pageNr - 1, 'previousPage');
                }
            });
        });
    },
    goBackwardToPage : function(pageNr) {
        var galleryNumber = this.getCurrentGalleryNr();
        var objInstance = this;
        this.setCurrentPageNr(pageNr);
        this.populatePage(pageNr, 'previousPage', function(){
            $("#currentPage" + galleryNumber).hide('slide', {
                direction : 'right'
            }, objInstance.animationSpeed, function() {
            });
            $("#previousPage" + galleryNumber).show('slide', {
                direction : 'left'
            }, objInstance.animationSpeed, function() {
                $("#nextPage" + galleryNumber).attr('id', 'previousPageTemp');
                $("#currentPage" + galleryNumber).attr('id', 'nextPage' + galleryNumber);
                $("#previousPage" + galleryNumber).attr('id', 'currentPage' + galleryNumber);
                $("#previousPageTemp").attr('id', 'previousPage' + galleryNumber);
    
                if (pageNr + 1 <= objInstance.getPagesMax()) {
                    objInstance.populatePage(pageNr + 1, 'nextPage');
                }
                objInstance.populatePage(pageNr - 1, 'previousPage');
            });
        });
    },
    goToPage : function(pageNr) {
        if (this.getActivePageClick() && 0 == this.ajaxCount) {
            this.unsetActivePageClick();
            if (pageNr <= this.getPagesMax() && pageNr > this.getCurrentPageNr()) {
                this.goForwardToPage(pageNr);
            } else if (pageNr >= this.getPagesMin() && pageNr < this.getCurrentPageNr()) {
                this.goBackwardToPage(pageNr);
            } else {
                this.setActivePageClick();
            }
        }
    },
    nextClick : function() {
        if (this.getActivePageClick() && 0 == this.ajaxCount) {
            var currentPageNr = this.getCurrentPageNr();
            this.unsetActivePageClick();
            var objInstance = this;
            if (currentPageNr < this.getPagesMax()) {
                var galleryNumber = this.getCurrentGalleryNr();
                $("#currentPage" + galleryNumber).hide('slide', {
                    direction : 'left'
                }, this.animationSpeed, function() {
                });
                $("#nextPage" + galleryNumber).show('slide', {
                    direction : 'right'
                }, this.animationSpeed, function() {
                    $("#previousPage" + galleryNumber).attr('id', 'previousPageTemp');
                    $("#currentPage" + galleryNumber).attr('id', 'previousPage' + galleryNumber);
                    $("#nextPage" + galleryNumber).attr('id', 'currentPage' + galleryNumber);
                    $("#previousPageTemp").attr('id', 'nextPage' + galleryNumber);

                    currentPageNr = currentPageNr + 1;
                    objInstance.setCurrentPageNr(currentPageNr);
                    objInstance.populatePage(currentPageNr + 1, 'nextPage');
                });

            } else {
                this.setActivePageClick();
            }
        }
    },

    previousClick : function() {
        if (this.getActivePageClick() && 0 == this.ajaxCount) {
            var currentPageNr = this.getCurrentPageNr();
            this.unsetActivePageClick();
            var galleryNumber = this.getCurrentGalleryNr();
            var objInstance = this;
            if (currentPageNr > this.getPagesMin()) {
                $("#currentPage" + galleryNumber).hide('slide', {
                    direction : 'right'
                }, this.animationSpeed, function() {
                });
                $("#previousPage" + galleryNumber).show('slide', {
                    direction : 'left'
                }, this.animationSpeed, function() {
                    $("#nextPage" + galleryNumber).attr('id', 'previousPageTemp');
                    $("#currentPage" + galleryNumber).attr('id', 'nextPage' + galleryNumber);
                    $("#previousPage" + galleryNumber).attr('id', 'currentPage' + galleryNumber);
                    $("#previousPageTemp").attr('id', 'previousPage' + galleryNumber);

                    currentPageNr = currentPageNr - 1;
                    objInstance.setCurrentPageNr(currentPageNr);
                    objInstance.populatePage(currentPageNr - 1, 'previousPage');

                });

            } else {
                this.setActivePageClick();
            }
        }
    }
};

