/* 
 * Класс коннектора (цветные кнопки).
 * Отвечает за работу этих кнопок.
 * Когда окончательно принимает штамп, то передает его
 * соответствующему плагину и запускает работу этого плагина.
 *
 * @mkechinov: этот класс дублирует Vite.connect.
 * Просто потому, что некогда сделать единый коннект для ситуации, когда
 * на одной странице находятся две кнопки коннекта.
 * @todo: сделать единый класс коннекта, который присваивается объектам и позволяет иметь на одной странице любое количество кресто-кнопок.
 */

/**
 * Основной объект коннекта
 */
Vite.peopleConnect = {

	// Объекты кнопок-контролов, клики на которые обрабатываются модулем
	controls: {},

	// Массив набранных кнопкой кодов (стрелок)
	commandBuffer: [],

	// Максимальная длина строки команд
	bufferLength: 3,

	// Флаг, что штамп в процессе набора (слушаем нажатия на контролы)
	listening: false,

	// timestamp начала отсчета интервала времени для прослушивания нажатия кнопок формирования штампа
	start: -1, 

	// Идентификатор таймера функций проверки вводимого промпта
	stopwatch: -1,

	 // Максимальное время ожидания между командами до отправки очереди коман на сервер
	timeout: 1600,

	// HTML-объект индикатора штампа (обернуты в jQuery)
	statusBar: null,

	// Параметр сообщает, включать ли автозаполнение штампа при неактивности или сбрасывать штамп
	autofill: false,

	// Текущий плагин-обработчик штампа
	plugin: null

};


/**
 * Конфигуратор коннектора.
 * Вызывается в основной программе.
 * Принимает параметры:
 * @param params:object Объект параметров-контролов в виде {up: 'html-id1', down: 'html-id2', left: 'html-id3', right: 'html-id4'} - т.е. на каждый элемент штампа передается идентификатор DOM-элемента
 * @param plugin:object Модуль, которому передается штамп для последующей обработки
 */
Vite.peopleConnect.configure = function(params, plugin) {

	// Замыкание
	var _this = this;

	// ** Параметры контрола

	// Запоминаем список идентификаторов кнопок
	if( typeof(params.up) != 'undefined' ) {
		this.controls.up = params.up;
	}
	if( typeof(params.down) != 'undefined' ) {
		this.controls.down = params.down;
	}
	if( typeof(params.left) != 'undefined' ) {
		this.controls.left = params.left;
	}
	if( typeof(params.right) != 'undefined' ) {
		this.controls.right = params.right;
	}
	if( typeof(params.full) != 'undefined' ) {
		this.controls.full = params.full;
	}

	// Было ли задано свойство (автозаполнение штампа)
	if(params.autofill == true) {
		this.autofill = true;
	} else {
		this.autofill = false;
	}

	// ** Статусбар

	// Инициализируем индикатор штампа
	this.statusBar = $("#connect-current-stamp");
	this.resetStatusBar();

	// ** Плагин обработки штампа

	// Если ранее был указан модуль для обработки, деактивируем его
	if(this.plugin !== null) {
		
		// Остановить, если есть деактиватор
		if(typeof(this.plugin.stop) == 'function') {
			this.plugin.stop();
		}
		
		// Очистить текущий установленный модуль
		this.plugin = null;
		
	}

	// Если указан новый модуль, устанавливаем его
	if(plugin !== null && typeof(plugin) != 'undefined') {
		this.plugin = plugin;
	}

	// ** Инициализируем события на контрол

	if(typeof(this.controls.up) != 'undefined') {
		$('#' + this.controls.up + '').unbind().click(function(){
			_this.keyTouched(8);
		});
	}

	if(typeof(this.controls.down) != 'undefined') {
		$('#' + this.controls.down + '').unbind().click(function(){
			_this.keyTouched(2);
		});
	}

	if(typeof(this.controls.left) != 'undefined') {
		$('#' + this.controls.left + '').unbind().click(function(){
			_this.keyTouched(4);
		});
	}

	if(typeof(this.controls.right) != 'undefined') {
		$('#' + this.controls.right + '').unbind().click(function(){
			_this.keyTouched(6);
		});
	}

	// Для одиночной кнопки сразу заполняем штамп до 3 символов, чтобы вызвать запуск поиска
	if(typeof(this.controls.full) != 'undefined') {
		$('#' + this.controls.full + '').unbind().click(function(){
			_this.keyTouched(5);
		});
	}

}



/**
 * Принимает код нажатого контрола, записывает его в буфер.
 */
Vite.peopleConnect.keyTouched = function(code) {

	// Если плагин уже работает, остановить плагин
	if(this.plugin !== null && typeof(this.plugin.stop) == 'function') {
		this.plugin.stop();
	}


	// Если штамп еще не набирался (первое нажатие)
	if (!this.listening) {

		// Очищаем предыдущий статус
		this.resetStatusBar();

		// Отмечаем флаг, что штамп в процессе набора
		this.listening = true;

		// Делаем прозрачными все кнопки
		$('.button').addClass('transparent');

		// Снимаем прозрачность с кнопки промпта
		$('.stamp-button').removeClass('transparent');

		
	}

	// Добавляем код кнопки в буфер
	this.commandBuffer.push(code);

	// Отображаем текущий статус
	this.showStatusBar(code);

	// Отмечаем текущее время нажатия кнопки (в последующем проверяем, пора ли отключить набор или нет)
	this.start = new Date();//Date.now();

	// Проверяем текущий буфер: набралось нужное количество элементов или нет
	this.checkBuffer();

}



/**
 * Общий сброс модуля
 */
Vite.peopleConnect.reset = function() {

	// Очищаем список команд поиска контактов
	this.clearBuffer();

	// Убираем индикатор
	this.resetStatusBar();

}


/**
 * Очищает текущий введенный штамп
 */
Vite.peopleConnect.clearBuffer = function() {
	this.commandBuffer = [];
}


/**
 * Очищает индикатор текущего статуса
 */
Vite.peopleConnect.resetStatusBar = function() {

	// Очищаем индикатор промпта
	Vite.peopleConnect.statusBar.hide().empty();

	// Снимаем прозрачность со всех полей
	$('.button').removeClass('transparent');

}


/**
 * Отображает статусбар с текущим промптом
 */
Vite.peopleConnect.showStatusBar = function() {

	var html = '';

	// Перебираем текущий буфер и формируем HTML
	for(var i in this.commandBuffer) {
		if(this.commandBuffer.hasOwnProperty(i)) {

			switch(this.commandBuffer[i]) {
				case 8:
					html += '<div class="status-ident status-ident-up"></div>';
				break;
				case 2:
					html += '<div class="status-ident status-ident-down"></div>';
				break;
				case 4:
					html += '<div class="status-ident status-ident-left"></div>';
				break;
				case 6:
					html += '<div class="status-ident status-ident-right"></div>';
				break;
				case 5:
					html += '<div class="status-ident status-ident-center"></div>';
				break;
				case 0:
					html += '<div class="status-ident status-ident-empty"></div>';
				break;
			}

		}

	}

	// Добавляем текст в статусбар
	this.statusBar.html(html);

	// Отображаем блок
	this.statusBar.show();

}


/**
 * Проверяет текущий введенный буфер: пора ли его уже отправлять плагину или еще рано
 */
Vite.peopleConnect.checkBuffer = function() {

	// Если первое нажатие
	if (this.commandBuffer.length == 1) {

		// Запускаем таймер обработки промпта
		this.startStopwatch();

	} else if (this.commandBuffer.length >= this.bufferLength) {

		// ** Промпт стал длиной 3 символа

		// Останавливаем таймер обработки вводимого промпта
		this.stopStopwatch();

		// Запоминаем текущий промпт
		var stamp = this.commandBuffer.join("");

		// Очищаем буфер вводимых символов промпта
		this.clearBuffer();

		// Через секунду запускаем плагин
		setTimeout(
			function(){

				// Убираем промпт
				Vite.peopleConnect.resetStatusBar();

				// Запускаем плагин
				if(Vite.peopleConnect.plugin !== null && typeof(Vite.peopleConnect.plugin.start) == 'function') {

					Vite.peopleConnect.plugin.start(stamp);

				} else {

					console.log('CONNECT MODULE: Plugin is not set (function checkBuffer)');

				}

			},
			1000
		);

	}

}




/**
 * Запускает таймер обработки вводимого промпта
 */
Vite.peopleConnect.startStopwatch = function () {

	this.start = new Date();//Date.now();

	// Запускаем проверяльщик, не перестали ли вводить промпт
	this.continueStopwatch();
}



/**
 * Каждые 10 миллисекунд проверяем, не перестал ли пользователь вводить промпт.
 */
Vite.peopleConnect.continueStopwatch = function () {
	this.stopwatch = setTimeout(this.stampInputTimeCheck, 10);
}

/**
 * Остановить таймер проверки ввода промпта
 */
Vite.peopleConnect.stopStopwatch = function () {

	// Отмечаем, что больше не слушаем нажатий клавиш
	this.listening = false;

	// Убираем интервал проверки вводимого промпта
	clearTimeout(this.stopwatch);
}




/**
 * Проверяем, не перестал ли пользователь вводить промпт
 */
Vite.peopleConnect.stampInputTimeCheck = function () {

	if (Date.now() - Vite.peopleConnect.start > Vite.peopleConnect.timeout) {

		// Если свойство автозаполнения штампа установлено, заполняем его
		if( Vite.peopleConnect.autofill == true ) {

			// Дополняем штамп одной звездочкой
			Vite.peopleConnect.keyTouched(0);

			// Если штамп недостаточный по длине (меньше 3), то добавляем еще одну звездочку
			if(Vite.peopleConnect.commandBuffer.length == 2) {
				Vite.peopleConnect.keyTouched(0);
			}

		} else {

			// Останавливаем таймер проверки ввода промпта
			Vite.peopleConnect.stopStopwatch();

			// Очищаем буфер
			Vite.peopleConnect.clearBuffer();

			// Убираем статусбар
			Vite.peopleConnect.resetStatusBar();

		}

	} else {

		// Продолжаем следить за вводом промпта
		Vite.peopleConnect.continueStopwatch();

	}
	
}

