// Javascript Slideshow Class

Slider = Class.create();

Slider.prototype = {
    initialize: function(slideid, onlyArrows, nVisible, animSpeed) {
		
		if (nVisible == undefined) {
			this.nVisible = 1;
		} else {
			this.nVisible = nVisible;
		}
		if (onlyArrows == undefined)
			onlyArrows = false;
		
		this.slide = $(slideid);
		this.wrapper = this.slide.down('div');
		
		if (this.slide.down('.noJS'))
			this.slide.down('.noJS').removeClassName('noJS');
		
   		this.slider = this.wrapper.down('ul');
		this.desc = this.slide.down('.desc');
    	this.allLi = this.slider.select('li');		
    	this.totLi = this.allLi.length;

		var xs = this;
		if (navigator.userAgent.match('Safari')) {
			Event.observe(window, 'load', function() {
				xs.slideDim = xs.slider.down('li').getDimensions();
			});
		} else if(this.slider.down('li')) {
			this.slideDim = this.slider.down('li').getDimensions();
		}
		
		this.x = 0;
		this.isTweening = false;
		if (animSpeed == undefined) {
			this.animSpeed = 0.7;
		} else {
			this.animSpeed = animSpeed;
		}
		this.idle = true;
    	
    	if (this.totLi > this.nVisible) {
	    	this.index = 1;
	    	if (this.desc) 
				this.desc.update(this.slider.select('img')[this.index-1].alt);
			this.totLinks = 0;
			
			if (!this.slide.down('.slider-control')) {
				this.control = new Element('div', {'class': 'slider-control', 'style': 'display:none;'});
				Element.insert(this.control, new Element('ul'));
				Element.insert(this.slide, {top: this.control});
			}
			
			this.allLi.each(this.addLink.bind(this));
			if (!onlyArrows) {
				this.control.toggle();
			}
			
			if (this.slide.down('.prev')) {
    			this.slide.down('.prev').observe('click', this.prev.bindAsEventListener(this));
    			this.slide.down('.prev').addClassName('disabled');
    		}
    		if (this.slide.down('.next')) {
    			this.slide.down('.next').setStyle({'direction':'ltr'});
    			this.slide.down('.next').observe('click', this.next.bindAsEventListener(this));
    		}
    	} else {
    		if (this.slide.down('.prev'))
				this.slide.down('.prev').toggle();
			if (this.slide.down('.next'))
				this.slide.down('.next').toggle();
		}
		
		if (navigator.userAgent.match('Safari')) {
			Event.observe(window, 'load', function() {
				xs.control.setStyle({'position': 'absolute', 'top': (xs.slide.getHeight()-20)+'px', 'left': ((xs.slide.getWidth()/2)-(xs.control.down('a').getDimensions().width*xs.totLinks/2))+'px'});
			});
		}
    },
    addLink: function() {
    	this.totLinks++;
    	var li = new Element('li', { 'class': "mid" });
		var a = new Element('a', { href: "javascript:void(0)", 'class': (this.totLinks == this.index)?'selected':'' }).update(this.totLinks);
		Element.insert(li, a);
		a.observe('focus', function(e,ela) { ela.blur(); }.bindAsEventListener(this,a));
		a.observe('click', this.slideTo.bindAsEventListener(this,a));
		if (this.control.down('li.last')) {
			this.control.down('li.last').insert({ before: li });
		} else {
			if (!this.control.down('ul'))
				Element.insert(this.control, new Element('ul'));
			Element.insert(this.control.down('ul'), li);
		}
		this.control.setStyle({'position': 'absolute', 'top': (this.slide.getHeight()-20)+'px', 'left': ((this.slide.getWidth()/2)-(this.control.getWidth()/2))+'px'});
    },
    slideTo: function(e,a) {
    	Event.stop(e);
    	if (this.mov)
    		this.idle = this.mov.state == 'idle' || this.mov.state == 'finished';
    	if (!a.hasClassName('prev') && !a.hasClassName('next') && !a.hasClassName('selected') && this.idle) {
    		if ((this.index == 1 || this.index*this.nVisible == this.totLi || ((this.index*this.nVisible > this.totLi) && ((this.index-1)*this.nVisible < this.totLi))) && this.slide.down('.disabled'))
   				this.slide.down('.disabled').removeClassName('disabled');
    		this.slide.down('.selected').removeClassName('selected');
    		a.addClassName('selected');
    		var newIndex = parseInt(a.innerHTML);
    		if (newIndex*this.nVisible > this.totLi || (newIndex == 1 && this.totLi%this.nVisible != 0))
	    		this.mov = new Effect.Move(this.slider, { x: -((Math.round(this.slideDim.width))*(newIndex-this.index))*(this.totLi%this.nVisible), y: 0, mode: 'relative', duration: this.animSpeed });
    		else 
    			this.mov = new Effect.Move(this.slider, { x: -((Math.round(this.slideDim.width))*(newIndex-this.index))*this.nVisible, y: 0, mode: 'relative', duration: this.animSpeed });
			this.index = newIndex;
			if (this.desc) 
				this.desc.update(this.slider.select('img')[this.index-1].alt);
			if (this.index == 1 && this.slide.down('.prev'))
				this.slide.down('.prev').addClassName('disabled');
			if ((this.index*this.nVisible == this.totLi && this.slide.down('.next')) || ((this.index*this.nVisible > this.totLi) && ((this.index-1)*this.nVisible < this.totLi)))
				this.slide.down('.next').addClassName('disabled');
    	}
    },
    prev: function(e) {
    	Event.stop(e);
    	if (!this.slide.down('.prev').hasClassName('disabled'))
    		this.slideTo(e, this.slide.select('li.mid a')[this.index-2]);
    },
    next: function(e) {
    	Event.stop(e);
    	if (!this.slide.down('.next').hasClassName('disabled'))
    		this.slideTo(e, this.slide.select('li.mid a')[this.index]);
    }
}