/*
 * Управление показом котировок: прокрутка, выдача значения по запросу
 */

var rates = (function () {
	var SETTINGS = {
		tableSelector: '#rates-block .table',
		tableCurrencySelector: '.currency',
		tableDealSelector: '.deal',
		tableClosingSelector: '.closing',
		tableFixEvenClass: 'fix-even',
		tableContainerClass: 'table-container',
		tableFrameClass: 'table-frame',
		tableListClass: 'table-list',
		tableHelperClass: 'table-helper',
		searchFormSelector: '#rates-search',
		searchLabelSelector: '#rates-search .hint-label',
		searchInputSelector: '#rate-query',
		searchSubmitSelector: '#rates-search .submit',
		loadingSelector: '#rates-search .loading',
		searchResultsClass: 'search-result',
		backLinkClass: 'back-link',
		lineHeight: 14,
		
		url: '/data/rts/s.php?code={code}',
		visibleCount: 3,
		delayTime: 2000,//3000
		scrollTime: 800,
		queryRegexp: /^[a-z]{4,6}$/i,
		errorEmpty: 'Данных нет',
		errorNetwork: 'Ошибка передачи данных',
		errorFormat: 'Формат кода эмитента: 4-6 латинских букв, например, GAZPS'
	};
	
	var _table, _tableContainer, _tableFrame, _tableHelper, _tableCurrencyTitle, _tableResult,
		_intervalId, _currentLine, _linesCount, _incomingPage,
		_searchForm, _searchLabel, _searchInput, _searchSubmit, _loading,
		_searchResults, _backLink, _defaultCurrency;
	
	function initScroll(){
		// Создаём html-элементы, необходимые для анимации и показа результатов поиска
		_tableContainer = $('<div class="' + SETTINGS.tableContainerClass + '"></div>');
		_tableFrame = $('<div class="' + SETTINGS.tableFrameClass + '"></div>');
		_tableList = $('<div class="' + SETTINGS.tableListClass + '"></div>');
		_searchResults = $('<div class="' + SETTINGS.searchResultsClass + '"></div>');
		_backLink = $('<a class="' + SETTINGS.backLinkClass + '" href="?">&larr;&nbsp;Вернуться к списку акций</a>');
		
		// Настраиваем количество видимых строк
		_tableFrame.height(SETTINGS.lineHeight * SETTINGS.visibleCount);
		
		// Добавляем в DOM элементы для анимации
		_table.show();
		_tableContainer.appendTo(_table.parent());
		_tableList.append(_table);
		_tableFrame.append(_tableList);
		_tableContainer.append(_tableFrame);
		
		// Копируем основную таблицу для фиксированных заголовков
		_tableHelper = _table.clone().addClass(SETTINGS.tableHelperClass);
		_tableHelper.prependTo(_tableContainer);
		_tableCurrencyTitle = $(SETTINGS.tableCurrencySelector, _tableHelper).eq(0);
		_defaultCurrency = _tableCurrencyTitle.text();
		
		// Добавляем в DOM блок для результатов поиска
		_searchResults.hide().append(_backLink).appendTo(_tableContainer);
	}
	
	function assignHoverEvents(){
		_tableContainer.hover(
			function(){
				clearInterval(_intervalId);
			},
			function(){
				startScroll();
			}
		);
	}
	
	function startScroll(){
		_intervalId = setInterval(function(){
			_tableList.animate(
				{
					marginTop: '-=' + SETTINGS.lineHeight
				},
				SETTINGS.scrollTime,
				function(){
					if( _currentLine == (_linesCount * (_incomingPage - 1) + 1) ){
						_incomingPage++;
						
						_table
							.clone()
							.addClass(function(){
								if( (_linesCount % 2 == 1) && (_incomingPage % 2 == 0) ){
									return SETTINGS.tableFixEvenClass;
								}
								else{
									return "";
								}
							})
							.appendTo(_tableList);
					}
					
					_currentLine++;
				}
			);
		}, SETTINGS.delayTime);
	}
	
	function assignSearchEvents(){
		_searchForm.submit(function(event){
			var query = _searchInput.val(),
				isQueryValid = false;
			
			if( query != _searchLabel.text() ){
				isQueryValid = validateQuery(query);
				
				if( isQueryValid ){
					lockSearchForm();
					
					$.getJSON(SETTINGS.url.supplant({code: query}), function (data) {
						unlockSearchForm();
						clearResults();
						hideTables();
						
						if( data.hasOwnProperty('code') && data.hasOwnProperty('trade_price') ){
							showTableHelper();
							showResults(data);
						}
						else if( data.hasOwnProperty('error') ){
							hideTableHelper();
							showError(data.error);
						}
						else{
							hideTableHelper();
							showError(SETTINGS.errorEmpty);
						}
						
					})
					.error(function(){
						unlockSearchForm();
						clearResults();
						hideTableHelper();
						hideTables();
						
						showError(SETTINGS.errorNetwork);
					});
				}
			}
			
			event.preventDefault();
		});
		
		_backLink.click(function(event){
			hideResults();
			showTableHelper();
			showTables();
			
			event.preventDefault();
		});
	}
	
	function validateQuery(query){
		var result = SETTINGS.queryRegexp.test(query);
		
		if(!result){
			clearResults();
			hideTableHelper();
			hideTables();
			
			showError(SETTINGS.errorFormat);
		}
		
		return result;
	}
	
	function lockSearchForm(){
		_searchInput.attr('disabled', 'disabled');
		_searchSubmit.attr('disabled', 'disabled');
		
		_loading.show();
	}
	
	function unlockSearchForm(){
		_searchInput.removeAttr('disabled');
		_searchSubmit.removeAttr('disabled');
		
		_loading.hide();
	}
	
	function showTableHelper(){
		_tableHelper.show();
	}
	
	function hideTableHelper(){
		_tableHelper.hide();
	}
	
	function showTables(){
		_tableCurrencyTitle.text(_defaultCurrency);
		_tableFrame.show();
		startScroll();
	}
	
	function hideTables(){
		_tableFrame.hide();
		clearInterval(_intervalId);
	}
	
	function showResults(data){
		var dealString = data.trade_price,
			closingString = '',
			closingTitle = '';
		
		// Копируем таблицу с данными, удаляем лишние строки
		_tableResult = _table.clone();
		$('thead', _tableResult).remove();
		$('tr:not(:first)', _tableResult).remove();
		
		// Заполняем полученными данными
		if( data.hasOwnProperty('trade_moment') ){
			dealString += ' | ' + data.trade_moment.substr(0, 16);
		}
		if( data.hasOwnProperty('prev_close') && data.hasOwnProperty('prev_close_change') ){
			closingString = data.prev_close + ' <span class="';
			closingString += (data.prev_close_change.substr(0, 1) == '-') ? 'ratedn' : 'rateup';
			closingString += '">(<span class="ratechg">' + data.prev_close_change + '%</span>)</span>';
		}
		if( data.hasOwnProperty('prev_close_moment') ){
			closingTitle = data.prev_close_moment.substr(0, 16);
		}
		
		$(SETTINGS.tableCurrencySelector, _tableResult).html('<strong>' + data.code + '</strong>');
		$(SETTINGS.tableDealSelector, _tableResult).text(dealString);
		$(SETTINGS.tableClosingSelector, _tableResult).attr('title', closingTitle).html(closingString);
		
		// Меняем валюту
		if( data.hasOwnProperty('price_currency') ){
			_tableCurrencyTitle.text(data.price_currency);
		}
		
		// Показываем таблицу с результатом
		_searchResults.prepend(_tableResult).show();
	}
	
	function hideResults(){
		_searchResults.hide();
	}
	
	function clearResults(){
		_searchResults.children(':not(.' + SETTINGS.backLinkClass + ')').remove();
	}
	
	function showError(text){
		_searchResults.prepend('<span class="error">' + text + '</span>').show();
	}
	
	return {
		init: function( userSettings ){
			$.extend(SETTINGS, userSettings);
			
			_table = $(SETTINGS.tableSelector);
			_currentLine = 1;
			_incomingPage = 1;
			_linesCount = $('tbody tr', _table).length;
			
			_searchForm = $(SETTINGS.searchFormSelector);
			_searchLabel = $(SETTINGS.searchLabelSelector);
			_searchInput = $(SETTINGS.searchInputSelector);
			_searchSubmit = $(SETTINGS.searchSubmitSelector);
			_loading = $(SETTINGS.loadingSelector);
			
			initScroll();
			startScroll();
			assignHoverEvents();
			assignSearchEvents();
		}
	};
})();
