/*
 * Модуль для смены рекламы в банере
 * @copyright Art. Lebedev Studio(http://artlebedev.ru)
 * @author Kotelnikov Dmitriy (dimonnot@design.ru)
 */
(function(){
	
	var 
		SEGMENT_SIZE = 60, // ширина сегмента px
		AUTOROTATE_INTERVAL = 10; // время ротирования в секундах
	
	/*
	 * Создаем класс баннера
	 */
	window.Banner = function( container ){
		container = container.find('.inner');
		this.container = container;
		this.isLocked = 0;
		this.images = container.find('img');
		this.timeout = 0;
		if( this.images.length > 1 ){
			this.selected = this.images.length - 1;
		
			$(this.images[this.selected]).addClass('selected');

			if( jQuery.browser.msie )
				this.container[0].style.filter = 'progid:DXImageTransform.Microsoft.Blinds(direction=\'RIGHT\')';
			else{
				addCanvas.apply(this);
			}
	
			resetPlay(this);
		}
	}
	
	window.Banner.prototype = {
		/*
		 * Обновление содержимого баннера с анимацией
		 * @param {String} html Новое содержимое баннера
		 */
		reset:function( html ){
			if( this.isLocked )
				return;
			this.isLocked = 1;
			var that = this;
			if( this.timeout ){
				updateBanner( that, html );
			}
			else
				this.onFinished = function(){
					updateBanner( that, html );
				};
		}
	}
	
	/*
	 * Обновляем баннер
	 */
	function updateBanner( banner, html ){
				
		clearTimeout(banner.timeout);
		if( !banner.images[banner.selected] )
			banner.selected = 0;
		$(banner.images[banner.selected]).after(html);
		banner.images = banner.container.find('img');
		play(banner);
		
		banner.onFinished = function(){
			banner.container.html(html);
			banner.images = banner.container.find('img');
			$(banner.images[0]).addClass('selected');
			banner.selected = 0;
			if( !$.browser.msie ){
				addCanvas.apply( banner );
			}
			if( banner.onChanged )
				banner.onChanged();
			banner.isLocked = 0;
		}
	}
	
	/*
	 * Добавляем холст для рисования
	 */
	function addCanvas(){
		this.canvas = document.createElement('canvas');
		this.canvasContainer = document.createElement('div');
		this.canvasContainer.className = 'segments';
		this.canvasContainer.style.display = 'none';
		this.canvasContainer.appendChild(this.canvas);
		this.container.append(this.canvasContainer);
		this.canvasContainer = $(this.canvasContainer);
		this.canvas = this.canvas.getContext('2d');
	}
	
	/*
	 * Переустанавливаем ротирование баннера
	 * @param {DOMElement} banner Элемент в котором содержатся меняющиеся картинки
	 */
	function resetPlay( banner ){
		if( banner.timeout )
			clearTimeout(banner.timeout);
			
		banner.timeout = setTimeout(
			function(){
				banner.timeout = 0;
				play(banner);
			},
			AUTOROTATE_INTERVAL * 1000
		);
	}
	
	/*
	 * Основная функция проигрывания баннера
	 */
	function play( banner ){

		if( banner.selected + 1 >= banner.images.length )
			banner.next = 0;
		else
			banner.next = banner.selected + 1;
		banner.segmentsCount = Math.round(banner.images[0].clientWidth / SEGMENT_SIZE + 0.5);
		
		if( jQuery.browser.msie ){
			banner.container[0].filters[0].Apply();
			banner.images.css('visibility', 'hidden');
			$(banner.images[banner.next]).css('visibility', 'visible');
			banner.container[0].filters[0].bands = banner.segmentsCount;
			banner.container[0].filters[0].Play(duration=0.2);
			
			banner.images.removeClass('selected');
			$(banner.images[banner.next]).addClass('selected');
			if( banner.onFinished ){
				banner.onFinished();
				banner.onFinished = 0;
			}
		}
		else{
			banner.image = new Image();
			$(banner.image).load(
				function(){
					banner.canvasContainer.find('canvas')[0].width = banner.image.width;
					banner.canvasContainer.find('canvas')[0].height = banner.image.height;
					animate(banner);
				}
			);
			banner.image.src = banner.images[banner.next].src;
		}
		banner.selected = banner.next;
		resetPlay(banner);
	}
	
	/*
	 * Анимационная смена баннеров
	 */
	function animate( that ){
		var i, k = 0;
		that.canvasContainer.show();
	
		jTweener.addPercent(
			{
				everyFrame : function(iPercent){
					that.canvas.save();
					that.canvas.beginPath();
					var offset;
					for(i = 0; i < that.segmentsCount; i++){
						offset = i * SEGMENT_SIZE;
						that.canvas.moveTo(offset, 0);
						that.canvas.lineTo(offset, that.image.height);
						that.canvas.lineTo(offset + Math.round(iPercent * SEGMENT_SIZE), that.image.height);
						that.canvas.lineTo(offset + Math.round(iPercent * SEGMENT_SIZE), 0);
						that.canvas.lineTo(offset, 0);
					}
					that.canvas.clip();
					try{
						that.canvas.drawImage(that.image, 0, 0, that.image.width, that.image.height);	
					}catch(e){}
					
					that.canvas.restore();					
				},
				onComplete:function(){
					that.canvasContainer.hide();
					that.images.removeClass('selected');
					$(that.images[that.next]).addClass('selected');
					if( that.onFinished ){
						that.onFinished();
						that.onFinished = 0;
					}
				},
				time : 0.8
			}
		);
	}
	
})();
