var SlideShow = new Class({
	options: {
		slides : [],
		startIndex : 0,
		wrap : true
	},

	initialize: function(options){
		this.setOptions(options);

		this.slides = [];
		this.addSlides(this.options.slides);
		
		if (this.slides.length)
			this.showSlide(this.options.startIndex);
	},

	Implements : [Options, Events],

	/**
	 * Добавление слайдов в слайдшоу
	 */
	addSlides: function(slides){
		$$(slides).each(function(slide){
			this.slides.include($(slide));
			slide.addEvent('click', this.cycleForward.bind(this));
		}, this);
	},
	
	/**
	 * Добавление одного слайда
	 */
	addSlide: function(slide){
		this.addSlides([slide]);
	},

	/**
	 * Прокрутка слайдов вперед
	 */
	cycleForward: function(event){
		if($chk(this.now) && this.now < this.slides.length-1)
			this.showSlide(this.now+1);
		else if (this.now && this.options.wrap)
			this.showSlide(0);
		else if(!$defined(this.now))
			this.showSlide(this.options.startIndex);
	},

	/**
	 * Прокрутка слайдов назад
	 */
	cycleBack: function(){
		if(this.now > 0)
			this.showSlide(this.now-1);
		else if(this.options.wrap)
			this.showSlide(this.slides.length-1);
	},

	/**
	 * Показ слайда
	 */
	showSlide: function(iToShow){
		var now = this.now;
		var current = this.slides[now];
		var slide = this.slides[iToShow];
		if(slide){
			if($chk(now) && now != iToShow){
				var hideEffect = new Fx.Morph(current, {duration: 'long'});
				hideEffect.start({'opacity':0}).chain(
					function(){
						current.setStyle('display','none');
						slide.setStyles({
							'display':'block',
							'opacity':'0'
						});
						var showEffect = new Fx.Morph(slide, {duration: 'long'});
						showEffect.start({'opacity':1});
					}.bind(this)
				);
			} else {
				slide.setStyle('display','block');
			}
		}
		this.now = iToShow;
	}
});


/**
 * Слайдшоу для изображений. Этот класс
 * является потомком класса SlideShow
 */
var ImageSlideShow = new Class({
	options: {
		imgUrls: [], // URL изображений
		container: false // ID контейнера
	},
	
	Extends : SlideShow,

	initialize: function(options){
		this.parent(options);
		// получаем ссылку на контейнер
		this.container = $(this.options.container);
		if(!this.container) {
			return;		// нет такого контейнера, завершаем работу
		}
		this.options.imgUrls.each(this.addImg.bind(this));
		this.showSlide(this.options.startIndex);
	},

	/**
	 * Добавление изображений в контейнер
	 */
	addImg: function(url){
			var img = new Element('img', {
				src: url,
				styles: {
					display: 'none'
				}
			}).injectInside($(this.options.container))
		this.addSlide(img);
	}
});

/**
 * Слайдшоу для ленты новостей.
 * Потомок класса SlideShow
 */
var RssSlideShow = SlideShow.extend({
	options : {
		rssUrl : '',
		container : false
	},

	interval : null,	// интервал слайдшоу (setInterval)

	initialize : function(options){
		this.parent(options);
		this.container = $(this.options.container);
		if (!this.container) {
			return;
		}
		this.initChannel();
	},
	
	/**
	 * Получение канала rss через прокси rssproxy.php,
	 * в параметре get указываем URL канала
	 */
	initChannel : function(){
		if (!this.options.rssUrl || this.options.rssUrl == '') {
			return;
		}
		
		// получаем содержимое ленты новостей используя AJAX
		var request = new Request({
			url : 'rssproxy.php?get='+encodeURI(this.options.rssUrl),
			method : 'post',
			onSuccess : this.addNews.bind(this)
		}).send();

	},

	/**
	 * Добавление слайдов с новостями в контейнер
	 */
	addNews : function(txt, xml) {
		var items = xml.getElementsByTagName('item');
		for (var i=0, len=items.length; i<len; i++){
			var title = items[i].getElementsByTagName('title')[0];
			var desc = items[i].getElementsByTagName('description')[0];
			var slide = new Element('div', {
					'class': 'rssSlide',
					styles: {
						display: 'none'
					}
				});
			slide.setHTML('<h4>'+title.firstChild.nodeValue+'</h4><p>'+desc.firstChild.nodeValue+'</p>');
			slide.injectInside(this.container)
			this.addSlide(slide);
		}
		this.start();
	},
	
	/**
	 * Запуск слайдшоу
	 */
	start : function(){
		this.showSlide(this.options.startIndex);
		var that = this;
		this.interval = setInterval(function(){that.cycleForward()}, 10000);
	},
	
	/**
	 * Остановка слайдшоу
	 */
	stop : function(){
		clearInterval(this.interval);
	}
});