function loadSlideshow(gallery, imgCount, timer ){
    
    // set variables
    var galleryId       = $(gallery);
    var arrCount        = imgCount-1;
    var imgNum          = 0;
    var timer           = timer != undefined ? parseInt(timer) : 5;
    
    // load first image
    loadImage( gallery, imgNum );
	
	// run slideshow
    var slideshowPE = new PeriodicalExecuter(function() { 
        if(++imgNum>arrCount){imgNum=0;}
        loadImage( gallery, imgNum, timer, slideshowPE );
    }, timer);
    
    // set arrows callback
    $$('.linksContainer a.link').each(function(el){
		el.href = 'javascript:void(0)';
		el.observe('click', function() {
            if(el.hasClassName('ajaxPrevLink')){
                imgNum = imgNum>0 ? imgNum-1 : arrCount;
            }else{
                imgNum = imgNum==arrCount ? 0 : imgNum+1;
            }
            if(slideshowPE != undefined) slideshowPE.stop();
            loadImage( gallery, imgNum, timer, slideshowPE );
		});
	});
}

function loadImage( gallery, imgNum, timer, slideshowPE ){
    var ajaxContainer   = $(gallery).down('.ajaxContent');
    var ajaxurl         = GAI_URL;
    var ajaxParam       = 'gallery/' + gallery + '/' + 
                          'image/' + imgNum + '/' + 
                          'type/image/';
    var ajaxBlockUrl    = ajaxurl + ajaxParam;
    new Ajax.Updater(ajaxContainer, ajaxBlockUrl, {
        method: 'post',
        onLoading: function(transport) {
            var imgContainer    = $(gallery).down('.ajaxImage');
            var textContainer   = $(gallery).down('.imageText');
            if(imgContainer != undefined) new Effect.Opacity(imgContainer, { from: 1.0, to: 0, duration: 1.0 });
            if(textContainer != undefined) new Effect.Opacity(textContainer, { from: 1.0, to: 0, duration: 1.0 });
        },
        onComplete: function(transport) {
            var imgContainer    = $(gallery).down('.ajaxImage');
            var textContainer   = $(gallery).down('.imageText');
            if(imgContainer != undefined){
                new Effect.Opacity(imgContainer, { from: 0, to: 1.0, duration: 1.0 });
                imgContainer.observe('mouseover', function() {
        	        if(slideshowPE != undefined) slideshowPE.pause();
                });
        	    imgContainer.observe('mouseout', function() {
        	        if(slideshowPE != undefined) slideshowPE.restart();
                });
            }
            if(textContainer != undefined){ 
                new Effect.Opacity(textContainer, { from: 0, to: 1.0, duration: 1.0 });
                textContainer.observe('mouseover', function() {
        	        if(slideshowPE != undefined) slideshowPE.pause();
                });
        	    textContainer.observe('mouseout', function() {
        	        if(slideshowPE != undefined) slideshowPE.restart();
                });
            }
        	$$('.linksContainer a.link').each(function(el){
                var linkVars = el.rel.split(',');
                var gallery  = delquote(linkVars[0]);
                var imgCount = parseInt(linkVars[1]);
                var currImg  = parseInt(linkVars[2]);
        	    el.href = 'javascript:void(0)';
        	    el.observe('click', function() {
        	        if(el.hasClassName('ajaxPrevLink')){
        	            if(slideshowPE != undefined) slideshowPE.stop();
        	            goPrevious(gallery, imgCount, currImg, timer, slideshowPE);
        	            return false;
                    }else{
        	            if(slideshowPE != undefined) slideshowPE.stop();
                        goNext(gallery, imgCount, currImg, timer, slideshowPE);
                        return false;
                    }
                });
        	});
        	$$('.imageList li a').each(function(el){
                var imgVars = el.rel.split(',');
                var gallery = delquote(imgVars[0]);
                var imgNum  = parseInt(imgVars[1]);
        	    el.href = 'javascript:void(0)';
        	    el.observe('mouseover', function() {
        	        loadThumb( el, gallery, imgNum );
        	        el.next('.thumb').show();
        	        if(slideshowPE != undefined) slideshowPE.pause();
                });
        	    el.observe('mouseout', function() {
        	        el.next('.thumb').hide();
        	        if(slideshowPE != undefined) slideshowPE.restart();
                });
        	    el.observe('click', function() {
        	        if(slideshowPE != undefined) slideshowPE.stop();
        	        loadImage( gallery, imgNum, timer, slideshowPE );
                });
            });
        }
    });
}

function loadThumb( el, gallery, imgNum ){
    var element         = el.next('.thumb');
    var ajaxurl         = GAI_URL;
    var ajaxParam       = 'gallery/' + gallery + '/' + 
                          'image/' + imgNum + '/' + 
                          'type/thumb/';
    var ajaxBlockUrl    = ajaxurl + ajaxParam;
    if(!element.hasClassName('displayed')){
        new Ajax.Updater(element,ajaxBlockUrl,{
            method:'post',
            onComplete:function(transport){
                var thumbLeft   = (element.getWidth()/2)-8;
                element.addClassName('displayed');
                element.setStyle({left:'-' + thumbLeft + 'px'});
            }
        });
    }
}

function goPrevious( gallery, imgCount, currImg, timer, slideshowPE ){
    var arrCount        = imgCount-1;
    var imgNum          = currImg>0 ? currImg-1 : arrCount;
    loadImage( gallery, imgNum, timer, slideshowPE );
}

function goNext( gallery, imgCount, currImg, timer, slideshowPE ){
    var arrCount        = imgCount-1;
    var imgNum          = currImg==arrCount ? 0 : currImg+1;
    loadImage( gallery, imgNum, timer, slideshowPE );
}

PeriodicalExecuter.addMethods({
    initialize: function(callback, frequency) {
        this.callback           = callback;
        this.frequency          = frequency;
        this.currentlyExecuting = false;
        this.lastExec           = this.now();
        this.paused             = false;
        this.pausedAt           = 0;
        this.accumTimePaused    = 0;
        this.registerCallback();
    },
    registerCallback: function() {
        this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
    },
    execute: function() {
        this.callback(this);
    },
    start: function(){
        if (!this.timer) this.registerCallback();
    },
    pause: function(){
        if (this.paused) return;
        this.stop();
        this.paused = true;
        this.pausedAt = this.now();
        return true;
    },
    timeLeft: function(){
        if(this.paused){
            return this.frequency - (this.pausedAt - this.accumTimePaused - this.lastExec);
        }else if(this.timer==null){
            return null;
        }else{
            return this.frequency - (this.now() - this.accumTimePaused - this.lastExec);
        }
    },
    restart: function(){
        if (this.paused){
            if(this.resheduledJob>0){clearTimeout(this.resheduledJob)}
            this.resheduledJob = setTimeout(this.reJobCallback.bind(this),this.timeLeft()*1000);
            this.accumTimePaused += this.now() - this.pausedAt;
        }else if(this.timer == null){
            this.registerCallback();
        }
        this.pausedAt = null;
        this.paused = false;
    },
    reJobCallback : function(){
        this.onTimerEvent();
        this.registerCallback();
        this.accumTimePaused = 0;
    },
    now: function(){ return new Date().getTime() / 1000; },
    stop: function() {
        if (!this.timer) return;
        clearInterval(this.timer);
        this.timer = null;
    },
    onTimerEvent: function() {
        if (!this.currentlyExecuting) {
            try {
                try {
                    this.currentlyExecuting = true;
                    this.execute();
                } finally {
                    this.currentlyExecuting = false;
                    this.lastExec = this.now();
                }
            } catch(e) {
                this.currentlyExecuting = false;
                throw e;
            }
        }
    }
});

function delquote(str){
    return (str=str.replace(/["']{1}/gi,''));
} 

document.observe('dom:loaded', function() {
    var version = parseFloat(navigator.appVersion.split('MSIE')[1]);
    if ((version >= 5.5) && (version < 7) && (document.body.filters)) {
        document.getElementsByClassName('ie-fix-opacity').each(function(poElement){
            var cBGImg = poElement.currentStyle.backgroundImage;
            var cImage = cBGImg.substring(cBGImg.indexOf('"') + 1, cBGImg.lastIndexOf('"'));
            poElement.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + cImage + "', sizingMethod='scale')";
            poElement.style.backgroundImage = "none";
        });
    }
});

