function UI(options) {
	var self = this;

	function construct() {
		// плейсхолдеры
		$J('input[placeholder], textarea[placeholder]').placeholder();

		// активные кнопки
		$J('button[data-role=button], a[data-role=button]').activeButtons({
			'targetButtonSelector': 'gui-button'
		});		
	}

	this.run = function() {		
		// шапка документа
		self.header = new Header({id: 'page-head'});

		// карусели
		self.rotator = new Rotator({
			id: 'page-rotator',
			visible: 7,
			speed: 300,
			auto: 5000
		});

		// сайдбар
		self.aside = new Aside({
			id: 'page-aside'
		});

		// интернет - приемная
		self.reception = new Reception({
			id: 'reception'
		});

		//  рендеринг баннеров
		self.renderBanners();

		//	всплывающая форма для исправления ошибок в тексте
		self.showForm();

		// отладка
        /*
		if (options.debugMode) {
			// подготовим формы
			$J('form').append('<input type="hidden" name="nt3" value="1">');

			// добавим параметр ко всем линкам
			$J('a').attr('href', function(i, h) {
				if (typeof(h) == 'string' && h.indexOf('javascript') == -1) {
					return h + (h.indexOf('?') != -1 ? '&nt3=1' : '?nt3=1');
				}
			});
		}
		*/
	};

	self.renderBanners = function() {
		var banners = [
			{'images': '/design/img/new_templates3/aside/main/services/services__icon.png','title':'Оплата счетов', 'text': 'коммунальные платежи, связь, Интернет, ТВ', 'link': 'https://uslugi.tatar.ru/jkh'},
			{'images': '/design/img/new_templates3/aside/main/services/strafi__icon.png','title':'ГИБДД и автоуслуги', 'text': 'штрафы, регистрация, водительское удостоверение, техосмотр', 'link': 'https://uslugi.tatar.ru/gibdd'},
			{'images': '/design/img/new_templates3/aside/main/services/zagranpasport__icon.png','title':'Загранпаспорт', 'text': 'записаться на прием, оплатить госпошлину, узнать о готовности', 'link': 'https://uslugi.tatar.ru/passport'}
		];

		// get random number between min and max
		var getRand = function(min, max) {
			return Math.floor(Math.random() * (max - min + 1)) + min;	
		};

		// pull data to template
		var currentBanner = banners[getRand(0,2)];
		$J('.aside-services__text img').attr('src', currentBanner.images);
		$J('#aside-services__text-description').text(currentBanner.text);
		$J('#aside-services__text-link').attr('href', currentBanner.link).text(currentBanner.title);
	};

	self.showForm = function(){
		var reviewSendingTool = new Object;
		reviewSendingTool.popup = null;
		reviewSendingTool.selectedText = '';	
		
		reviewSendingTool.showDialog = function() {
			if ($('reviewSendingDialogPopup')) return;

			this.selectedText = this.getSelectedText();

			if (this.selectedText.length < 1) return;

			Dialog.info($('reviewSendingDialog').innerHTML, {
				id: 'reviewSendingDialogPopup',
				className: "alphacube",
				draggable: 1,
				closable: 1,
				width: 402,
				title: "Ошибка в тексте",
				height: 240
			});

			this.popup = $('reviewSendingDialogPopup');

			this.popup.down('.review-sending-dialog-error-text').innerHTML = this.selectedText;
			this.popup.down('.review-sending-dialog-url').innerHTML = location.href;
		}

		reviewSendingTool.hideDialog = function() {
			Dialog.closeInfo();
		}

		reviewSendingTool.getSelectedText = function () {
			var result = '';
			if (window.getSelection) {
			    var range = window.getSelection();                                        
			    result = range.toString();
			} 
			else {
			    if (document.selection.createRange) {
			        var range = document.selection.createRange();
			        result = range.text;
			    }
			};
			return result;
		}

		reviewSendingTool.sendReview = function () {
			new Ajax.Request('/rus/index.htm/send-review/', {
				method: 'post',
				parameters: {
					url: location.href,
					fragment: this.selectedText,
					comment: this.popup.down('.review-sending-dialog-comment').value
				},
				onSuccess: function (response) {
					if (response.responseText == 'OK') {
						alert('Спасибо! Ваше сообщение отправлено.');
					}
					else {
						alert('Извините, не удалось отправить сообщение.')
					}
				},
				onFailure: function () {
					alert('Извините, не удалось отправить сообщение.')
				}
			});
			this.hideDialog();
		}

		reviewSendingTool.clearForm = function () {
			;
		}

		var ctrlEnterListener = new Object();	
		ctrlEnterListener.initialize = function(runOnEvent) {
			var enterKeyCode = 13;
			Event.observe(document, 'keydown', function(event) {
				if (event.ctrlKey && event.keyCode == enterKeyCode) {
				    try {
				    	eval(runOnEvent);
				    }
				    catch (e) {}
				}
			});
		}
		ctrlEnterListener.initialize("reviewSendingTool.showDialog()");
	};

	construct();
};