    
    var iFx = function() {
    
        var _timer_interval = 30;
        var _delta = 10;
        var _startDelta = 3;
        var _range = 0.8;
    
        var _timer = null;
        var _x = 0;
        var _max_x = 0;
        
        var _wrapper;
        var _el;
        var _els;
        var _settings;
        
        var _mouseover = false;
        var _mousePosX = 0;
        
        var _wrapperWidth = 0;
        var _tmpDelta = 9999;
                  
        
        var _button_left= false;
        var _button_right = false;
              
        var _direct = 'right';
                  
        return {
              
            build: function(wrapper, el, els, settings) {
            
                _wrapper = wrapper;
                _el = el;
                _els = els;
                _settings = settings;
                _wrapperWidth = _wrapper.offsetWidth;
                
                _els.setStyle('width', _settings.min_size[0] + 'px');
                _els.setStyle('height', _settings.min_size[1] + 'px');
                _els.setStyle('position', 'relative');
                _el.setStyle('width', parseInt(_els.length * (_settings.min_size[0] + _settings.margin * 2)) + 'px');
                _max_x = _els.length * (_settings.min_size[0] + _settings.margin * 2) - _wrapper.offsetWidth; 
                _els.setStyle('top', parseInt(((_settings.max_size[1] - _settings.min_size[1]) / 3) * 2) + 'px');
                
                _timer = setInterval( function() { iFx.timer() }, _timer_interval );
                
                _wrapper.addEvent('mouseenter', function() { _mouseover = true; });
                _wrapper.addEvent('mouseleave', function() { _mouseover = false; });
                _wrapper.addEvent('mousemove', function(e) { _mousePosX = e.client.x - _wrapper.getPosition().x; });
                if(_settings.button_left) {
                    _settings.button_left.addEvent('mousedown', function() { _button_left = true;  });
                    _settings.button_left.addEvent('mouseup', function() { _button_left = false;  });
                }
                if(_settings.button_right) {
                    _settings.button_right.addEvent('mousedown', function() { _button_right = true;  });
                    _settings.button_right.addEvent('mouseup', function() { _button_right = false;  });
                }        
                        
            },
            
            timer: function() {
                
                var d = _tmpDelta;
                  
                if(_button_left) { 
                    d = _delta * -1;
                    _tmpDelta = 0;
                }
                else if(_button_right) {
                    d = _delta;
                    _tmpDelta = 0;  
                }
                else if(!_mouseover) {
                    if( _tmpDelta == 9999) { // jeste neni 
                        
                        if(_direct == 'right') {                
                            if(parseInt(_max_x * _range) < _x) {
                                d = Math.max(0.5, Math.min(parseInt((_max_x - _x) * _delta) / (_max_x * _range) * _delta, _delta));
                                if(d > _startDelta) d = _startDelta;
                                
                            }                                  
                            else {
                                d = _startDelta;
                                
                            }
                            if(d < 1) _direct = 'left';
                        }
                        
                        else if(_direct == 'left') {                
                            if(parseInt(_max_x * (1 - _range)) > 0) {
                                d = Math.max(0.5, Math.min(parseInt((_max_x - _x) * _delta) / (_max_x * _range) * _delta, _delta));
                                if(d > _startDelta) d = _startDelta;
                            }                                  
                            else {
                                d = _startDelta;
                            }
                            
                            
                            if(_x < 1) _direct = 'right';
                            d = -d;
                            
                        }
                        
                       
                                       
                    }
                } else {
                    d = ((Math.cos(_mousePosX * 2 * Math.PI / _wrapperWidth) + 1) / 2) * _delta * (_wrapperWidth / 2 < _mousePosX? 1: -1);    
                    _tmpDelta = d;
                    
                }
                
                _x += d;
                
                if(_x < 0) _x = 0;
                if(_x > _max_x) _x = _max_x;
                _el.setStyle('left', - _x + 'px');
                //if(_x >= _max_x)
                //    clearInterval(_timer);
                
                var halfWi = (_settings.min_size[0] + _settings.margin * 2)/ 2;
                
                var nww = 0;
                // zvetsi obrazky
                for(i = 0; i < _els.length; i++)
                {
                    var k = _els[i];
                    var xk = k.getPosition(_wrapper).x + halfWi; 
                    
                    if(xk > 0 && xk <= _wrapperWidth) 
                    {
                        var cos = 1 - ((Math.cos(xk * 2 * Math.PI / _wrapperWidth) + 1) / 2);
                        
                        var nw = parseInt(_settings.min_size[0] + ((_settings.max_size[0] - _settings.min_size[0]) * cos));
                        var nh = parseInt(_settings.min_size[1] + ((_settings.max_size[1] - _settings.min_size[1]) * cos));  
                        k.setStyle('width', nw + 'px');
                        k.setStyle('height', nh + 'px');
                        k.setStyle('top', parseInt(((_settings.max_size[1] - nh) / 3) * 2) + 'px');
                        //k.setStyle('z-index', nw);
                        nww += nw + _settings.margin * 2;
                    
                    } else { // nastavi mini rozmer
                        k.setStyle('width', _settings.min_size[0] + 'px');
                        k.setStyle('height', _settings.min_size[1] + 'px');
                        k.setStyle('top', parseInt(((_settings.max_size[1] - _settings.min_size[1]) / 3) * 2) + 'px');
                        //k.setStyle('z-index', '1');
                        nww += _settings.min_size[0] + _settings.margin * 2;    
                    }
                    
                }
                
                _el.setStyle('width', parseInt(nww + 1) + 'px');
                _max_x = (nww + 1) - _wrapper.offsetWidth; 
               
            }
            
        }
    
    }();
    
  
