/**
 * @author skyh
 */

var iesa = iesa || {};

/**
 * Создание баннера с переходами
 */

iesa.Banner = function (el, url) {
	var T = this;

	T.el = el;              /** Элемент, в котором все отображается */
	T.url = url || "";      /** URL для списка слайдов (XHR) */
	T.control_overlay = {}; /** Блок с кнопочками и циферками */ 
	
	T.config = {};          /** Все данные тут */
	
	T.running = false;      /** Если в данный момент происходит смена слайдов */
	T.playing = null;		/** Если включен автоплей */
	T.delay = 2000;         /** @deprecated Время перехода слайда */

	T.current_frame_idx = -1;   /** Текущий слайд */
	
	T.current_frame = null; /** Слой для отображения содержимого */
	T.next_frame = null;    /** Слой для плавного перехода */
	T.control = null;       /** Кнопки с номерами слайдов */
	T.next_button = null;   /** Кнопка "следующий слайд" */
	T.prev_button = null;   /** Кнопка "предыдущий слайд" */
	T.change_timer = null;  /** Таймер автоперехода */
	T.play_pause = null;    /** Кнопка Play */
}

iesa.Banner.prototype = {
	
	load_config: function () {

		var T = this;
			if (!T.url) { // Если URL не указан - пытаемся достать JSON в .config
				var config_el = $(".config", T.el);
				T.config = eval(config_el.text());
			}
			else { // получаем настройки через XHR
				$.ajaxSetup({
					async: false
				});
				$.getJSON(T.url, null, function (config) {
					T.config = config;
				});
			}
			
			if (!T.config) {
				return false;
			}
			
			T.frames = T.config.frames; // alias
			
			return true;
	},
	
	toString: function () {
		return "[object iesa.Banner]";
	},
	
	/**
	 * Загрузка данных и создание элементов навигации
	 */
	init: function () {
		var T = this;
		
		if (!T.load_config()) {return false;}
		
		// предзагрузка картинок
		for (var i = 0, frame; frame = T.frames[i]; ++i) {
			var x = new Image;
			x.src = frame.src;
		}
		
		// сборка элементов управления
		var code = '<div class="banner_content"><div class="frame"></div><div class="overframe"></div></div><div class="control_overlay"><div class="play_pause pause"></div><div class="left"><!--\u25C4--></div><div class="num_wrapper"><ul>';
		for (var i = 0, l = T.frames.length; i < l; ++i) {
			code += '<li>' + (i + 1) + '</li>';
		}
		code += '</ul><i class="c t l"><i></i></i><i class="c t r"><i></i></i><i class="c b l"><i></i></i><i class="c b r"><i></i></i></div><div class="right"><!--\u25BA--></div></div>';

		$(code).appendTo(T.el);

		T.current_frame = $(".frame", T.el).get(0);
		T.next_frame = $(".overframe", T.el).get(0);
		
		// элементы управления
		T.control_overlay = $(".control_overlay", T.el);
		
		$(".control_overlay li", T.el).click(function(){
			T.show(parseInt($(this).text()) - 1);
			T.stop();
		});
		
		if (T.config['show_navigation']) {
			T.control_overlay.show();
		}
		
		(T.prev_button = $(".left", T.el)).click(function(){
			T.prev();
		});

		(T.next_button = $(".right", T.el)).click(function(){
			T.next();
		});
		//переход по ссылке
		$(".frame", T.el).click(function(){
			location.href = T.frames[T.current_frame_idx].href;
		});
		
		(T.play_pause = $(".play_pause", T.el)).click(function () {
			if (T.playing) {
				T.stop();
			} else {
				T.start();
			}
		});
		
		if (T.config['show_play_button']) {
			T.play_pause.show();
		}
		
		T.show(0);

		if (T.config['autostart']) {
			T.start();
		}
		
	},
	
	/**
	 * Включение автоперехода и изменение задержки. Если delay не указан, будет использован по умолчанию
	 */
	start: function (delay) {
		var T = this;
		
		// установка новой задержки
		if (delay) {
			T.config['delay'] = delay;
		}
		
		if (T.playing) {
			return;
		}
		
		T.change_timer = setInterval(function(){
			T.next.call(T);
		}, T.config['delay']);

		T.playing = true;

		T.play_pause.removeClass("paused");
	},
	
	/**
	 * Остановка автопереходов
	 */
	stop: function () {
		var T = this;
		clearInterval(T.change_timer);
		T.playing = false;
		T.play_pause.addClass("paused");
	},
	
	/**
	 * Показ слайда с номером 
	 * @param {Number} slide
	 */
	show: function (frame_idx) {
		var T = this;
		
		/* Если меняем на тот же самый, выходим */
		if (T.current_frame_idx == frame_idx) { return };
		if (T.running) { return };
		
		var start_after_show = false; 
		if (T.playing) {
			start_after_show = true;
			T.stop();
		}
		
		var old = $(".control_overlay li:eq(" + T.current_frame_idx + ")", T.el);
		var li = $(".control_overlay li:eq(" + frame_idx +")", T.el);
		var image_url = "url('" + T.frames[frame_idx].src + "')";
		$(old).removeClass("active");
		$(li).addClass("active");

		T.current_frame_idx = frame_idx;
		 
		T.next_frame.style.display = "none";
		T.next_frame.style.backgroundImage = image_url; 
		
		T.running = true;
		$(T.next_frame).fadeIn("slow", function () {
			T.current_frame.style.backgroundImage = image_url;
			T.next_frame.style.display = "none"
			T.running = false;
		});
		
		if (start_after_show) {
			T.start();
		}
	},
	
	show_error: function (message) {
		var m = "ошибка загрузки данных";
		if (message) {
			m += ":<br/>" + message;
		}
		this.el.innerHTML = m;
	},
	
	next: function () {
		this.show((this.current_frame_idx + this.frames.length + 1) % this.frames.length);
	},
	
	prev: function () {
		this.show((this.current_frame_idx + this.frames.length - 1) % this.frames.length);
	}
}

