function slideshow( dataNode, pfad_images, mainElement ){

    this.imagesData = dataNode;
    this.actualImage = 0;
    this.totalImages = 0;
    this.pfadImages = pfad_images;
    this.slideIsRunning = false;  // number if slideshow is running (value returned by setInterval)
    this.mainElement = mainElement;
    
    // selektory jQuery do wybierania elementów struktury
    // w razie potrzeby można je zmodyfikować nadpisując w implementacji klienta
    this.selNaviFirst = '#zurueck_2';
    this.selNaviPrev = '#zurueck_1';
    this.selNaviNext = '#vor_1';
    this.selNaviLast = '#vor_2';
    this.selNaviImg = '#hotelbild';
    this.selNaviSpareImg = '#spare';
    this.selNaviSubline = '#subline';
    this.selNaviCounter = '#bildvon';
    this.selNaviAuto = '#auto';
    this.selNaviResize = '#resize';
    this.selMainElement = '#divImg';

    // inne zmienne konfiguracyjne
    this.tplAuto = ['AUTO','STOP'];
    this.tplAutoTitles = ['uruchom automatyczną zmianę zdjęć','zatrzymaj automatyczną zmianę zdjęć'];
    this.tplResize = ['<img src="'+this.pfadImages+'/lupe.png" alt="" class="varHeight" />','<img src="'+this.pfadImages+'/lupe.png" alt="" class="varHeight" />','<img src="'+this.pfadImages+'/lupe_minus.png" alt="" class="varHeight" />']
    this.cfgAllowAuto = true;
    this.cfgAllowResize = true;
    this.currentResize = (hib.config.slideshowInitialSize)?hib.config.slideshowInitialSize:0; // allowed 0(low), 1(middle), 2(normal)
    this.cfgAutoInterval = 4000;
    this.counterTpl = 'Zdjęcie {actual} / {total}';
	this.imagesAlreadyInHTML = false; // 2010.03.29 - 'true' gdy zdjęcia są już załadowane w kodzie np. przez PHP

    
    this.refreshCounter = function(){
        var actualImage= this.projector.getCurrentImageIndex();        
        // wpisanie do template licznika wartości
        var tmp = this.counterTpl.replace( /\{actual\}/, actualImage + 1 );
        tmp = tmp.replace( /\{total\}/, this.totalImages );
        // wyświetlenie zaktualizowanej wartości
        $( this.selNaviCounter, this.mainElement ).html( tmp );
        
        $( this.selNaviSubline, this.mainElement ).html( this.imagesData[ actualImage ].subline )

        this.refreshNavi();

    }

    this.refreshNavi = function(){
        
        var actualImage= this.projector.getCurrentImageIndex();
        
        $(this.selNaviFirst, this.mainElement ).attr('src', this.pfadImages+'/zurueck_2'+(actualImage==0?'_off':'')+'.gif').get(0).slideObj=(actualImage>0?this:null);
        $(this.selNaviPrev, this.mainElement ).attr('src', this.pfadImages+'/zurueck_1'+(actualImage==0?'_off':'')+'.gif').get(0).slideObj=(actualImage>0?this:null);
        $(this.selNaviNext, this.mainElement ).attr('src', this.pfadImages+'/vor_1'+(actualImage<this.totalImages-1?'':'_off')+'.gif').get(0).slideObj=(actualImage<this.totalImages-1?this:null);
        $(this.selNaviLast, this.mainElement ).attr('src', this.pfadImages+'/vor_2'+(actualImage<this.totalImages-1?'':'_off')+'.gif').get(0).slideObj=(actualImage<this.totalImages-1?this:null);
        with( $(this.selNaviAuto, this.mainElement ) ){
            get(0).slideObj=this;
            if (this.cfgAllowAuto) show(); else hide();
            html( this.tplAuto[ this.slideIsRunning?1:0 ] );
            attr('title', this.tplAutoTitles[ this.slideIsRunning?1:0 ])
        }
        with( $(this.selNaviResize, this.mainElement ) ){
            get(0).slideObj=this;
            html( this.tplResize[ this.currentResize ] );
            if (this.cfgAllowResize) show(); else hide();
        }
    }
    
    this.showNext = function(){
        this.projector.showNext();
        this.projector.preloadNext()
        this.refreshCounter();
      
    }
    this.showPrev = function(){
        this.projector.showPrev();
        this.refreshCounter();        
    }
    this.showLast = function(){
        this.projector.showLast();
        this.refreshCounter();        
    }
    this.showFirst = function(){
        this.projector.showFirst();
        this.refreshCounter();        
    }
    
    this.autoStepNext = function(){ 
        if (hib.slide.slideIsRunning) {
            if ($(hib.slide.selMainElement,hib.slide.mainElement).length==0) return;
            setTimeout(hib.slide.autoStepNext, hib.slide.cfgAutoInterval);
            hib.slide.showNext();
        }
    }
    
    this.auto = function(){
        if (this.slideIsRunning==false) { 
            this.slideIsRunning = true;
            this.autoStepNext()
        } else {
            this.slideIsRunning = false;
            this.refreshCounter()
        }
    }

    this.noImagesToDisplay = function(){
        $(this.selMainElement, this.mainElement ).hide();
        hib.fitHeight();
    }    


    // inicjalizacja

    this.init = function(){
        if (dataNode.length==0) {
            this.noImagesToDisplay();
            return;
        } else {

           $( this.selMainElement, this.mainElement).removeClass('zoom0 zoom1 zoom2').addClass('zoom'+this.currentResize);
    
            this.projector = new projector();
            with (this.projector) {
                setMainElement($(this.selMainElement, mainElement));
    
                //setDisplayMode('center');
					 //setDisplayMode('fitParentHeightWidth');
					 setDisplayMode(hib.config.displayModeForSlideShow);
                //setCssClassForImages('varHeight');
            }
        
            for (var n in dataNode ) {
                    
                var imageData = dataNode[ n ];
      
                if (!this.cfgAllowResize) {
                    var image = imageData.name
                } else if (this.cfgAllowResize && !imageData.name) {
                    
                    switch (this.currentResize) {
                        case 2 : var image = imageData.nameSizeHigh;
                            break
        
                        case 1 : var image = imageData.nameSizeMiddle;
                            break
        
                        default : var image = imageData.nameSizeLow;
                    }
                    
                } else if (this.cfgAllowResize && imageData.name){
                    var tmp = imageData.name;
                    tmp = tmp.replace( /\/middle\// ,'/{x}/' );
                    tmp = tmp.replace( /\/low\// ,'/{x}/' );
                    tmp = tmp.replace( /\/high\// ,'/{x}/' );
                    
                    switch (this.currentResize) {
                        case 2  : var image = tmp.replace ( /\/{x}\// ,'/high/' );
                            break
        
                        case 1  : var image = tmp.replace ( /\/{x}\// ,'/middle/' );
                            break
        
                        default : var image = tmp.replace ( /\/{x}\// ,'/low/' );
                    }
                    
                } else {
                    alert('#img error');
                }
                //this.projector.add( [image] );
                
				if(!this.imagesAlreadyInHTML) {
					$(this.selMainElement,mainElement).append('<img src="'+image+'"  style="display:none" class="varHeight" />');
				}
				
				this.totalImages++;
                
            }
			this.projector.addImagesFromElement( $(this.selMainElement,mainElement)  );
            this.showFirst();
        }   
    }
}
