// JavaScript Document
//ядро движка js
$(document).ready(function(){
	var document = window.document;
	var Lps = function() {
		var lps = this;
		var _onChangeLogin = function(){};
		this.onChangeLogin = function(callback){
			if (typeof callback == "function"){
				this.console('set handler "lps.onChangeLogin", debug info:'+this.dump(callback), "debug");
				_onChangeLogin = callback;
			}else{
				this.console('work handler "lps.onChangeLogin", debug info:'+this.dump(_onChangeLogin), "debug");
				_onChangeLogin();
			}
		}

		var _after_login_action = function(){};
		this.after_login_action = function(callback){
			// попытка использовать с параметром установает обратчик и возвращает false в случае неудачи.
			if (typeof callback == "function"){
				this.console('set handler "lps.after_login_action", debug info:'+this.dump(callback), "debug");
				_after_login_action = callback;
				return true;
			//попытка использовать без параметра вызывает последний установленный обратчик
			}else{
				if (this.login()){
					this.console('work handler "lps.after_login_action", debug info:'+this.dump(_after_login_action), "debug");
					_after_login_action();
				}else{
					this.console(
						'can\'t work handler "lps.after_login_action", non login, debug info:'+this.dump(_after_login_action),
						"debug"
					);
				}
				this.console('clear handler "lps.after_login_action"', "debug");
				_after_login_action = function(){};
				return true;
			}
		}
		
		var _is_login = null;
		// позволяет проверить/установить залогинин ли пользователь
		this.login = function(set_login){
			var _is_login_old_value = _is_login;
			if (typeof set_login != "undefined"){ //Если передан параметр
				if (set_login != _is_login){ // если нужно менять значение
					if (_is_login_old_value!=null){ //первый вызов инициирующий, а не изменяющий
						this.onChangeLogin();
					}
					_is_login = set_login;
					if (_is_login_old_value!=null && set_login==true){
						//если вызов не инициирующий, а изменяющий и меняющий на залогинен, то обработчик
						this.after_login_action();
					}
				}
			}
			return _is_login;
		}
		//Событие которое срабатывает при смене якоря в адресной строке
		var _gotoHash = function(hash){
			lps.console('find new "window.location.hash":'+hash, "debug");
			return true;
		};
		this.gotoHash = function(callback){
			// попытка использовать с параметром установает обратчик.
			if (typeof callback == "function"){
				_gotoHash = callback;
				return true;
			}else{
				// попытка использовать без параметра вызывает последний установленный обратчик
				return _gotoHash();
			}
		}
		
		this.dump = function(d, l) {
			if (l == null)
				l = 1;
			var s = '';
			if (typeof(l) != "undefined" && l>5){
				s += "too deep for debug \n";
			}else{
				if (typeof(d) == "object") {
					s += typeof(d) + " {\n";
					for (var k in d) {
						for (var i=0; i<l; i++) s += "  ";
						s += k+": " + this.dump(d[k],l+1);
					}
					for (var i=0; i<l-1; i++) s += "  ";
					s += "}\n"
				} else {
					s += "" + d + "\n";
				}
			}
			return s;
		}
		var _consoleMessageHandler=function(param, level){
			var s = lps.dump(param);
			$("<pre>--------------------\n"+"<b>"+level+":</b> "+s+'</pre>').appendTo('#lps_conseole');
		}
		//Есть возможность переопределить обработчик консоли.
		this.setConsoleMessageHandler = function(callback){
			if (typeof callback == "function"){
				_consoleMessageHandler = callback;
				return true;
			}
			return false;
		}
		//уровень сообещний, выводимых в консоль
		var currentConsoleReportingLevel = "info";
		//варианты уровеней сообещний, выводимых в консоль
		var consoleReportingLevels = {message: 0, warning: 1, info: 2, debug:3};
		//установить уровень сообещний выводимых в консоль
		this.setConsoleReportingLevel = function(level){
			currentConsoleReportingLevel = level;
			this.console('lps.consoleReportingLevels("'+level+'")', "debug");
			return true;
		}
		//выводит содержимое param в консоль для отладки
		this.console = function(param, level){
			if (typeof level == "undefined" || typeof consoleReportingLevels[level] == "undefined"){
				level = "message"
			}
			if (consoleReportingLevels[level] <= consoleReportingLevels[currentConsoleReportingLevel]){
				return _consoleMessageHandler(param, level);
			}else{
				return false;
			}
		}
		this.createConsole = function(){
			if (!$('#lps_conseole').size()){
				$('<div id="lps_conseole"></div>').appendTo('body').hide();
			}
		}
		this.showConsole = function(){
			$('#lps_conseole').show();
		}
		this.hideConsole = function(){
			$('#lps_conseole').hide();
		}
		/** функции для отображения крутящегося диска - waite */
		var loading		 = $('<div id="lps-loading"><div></div></div>').appendTo('BODY');
		var loadingFrame = 1, loadingTimer = null;
		var animate_loading = function() {
			if (!loading.is(':visible')){
				clearInterval(loadingTimer); //авто остановка
				return;
			}
			$('div', loading).css('top', (-loadingFrame * 40) + 'px');
			loadingFrame = (loadingFrame + 1) % 12;
		}
		this.showLoading = function(callback) {
			if (typeof callback != "function"){
				callback=function(){return true;}
			}
			clearInterval(loadingTimer);
			loading.show();
			loading.click(callback);
			loadingTimer = setInterval(animate_loading, 66);
		};
		this.hideLoading = function() {
			loading.hide();
		};
		
		this.window = function(content, name, options){
			var id = 'lps_window'+(typeof name == "undefined" ? 'default' : '__'+name);
			var $dialog = $('#'+id);
			if ($('#'+id).size()==0){
				$dialog=$('<div id="'+id+'" class="lps_window"></div>').appendTo('BODY').hide();
			}
			$dialog.html(content);
			var $title = $('.window_title', $dialog).html();
			$dialog.dialog($.extend(true, options, {
				title: $title,
				width: 750,
				modal: true,
				resizable: false,
				draggable: false,
				open : function() {
					// действия после открытия окна
					var scroll = $dialog.closest('.ui-dialog').offset().top;
					$('div.ui-widget-overlay').height($(document).height()+scroll+100);
					$(document).scrollTop(scroll-20);
					//если нет заголовка, то убираем вообще шапку, но крестик оставляем, просто класс убираем
					if (!$title){
						$dialog.closest('.ui-dialog').find('.ui-dialog-titlebar').removeClass('ui-widget-header');
					}
					//инициализация окна
					var initWindow = function(){
						//все формы .window в окне становятся AJAX формами с результатом на все окно
						$dialog.find('FORM.window_form').ajaxForm({
							success: function(responseHTML) {
								lps.console('ajax_reg success submit form', "debug");
								$dialog.html();
								$dialog.html(responseHTML);
								lps.hideLoading();
								initWindow(); // после того как форма отрабатывает все должно реинициализироваться
							},
							beforeSubmit:function(data) {
								lps.showLoading();
							},
							resetForm: true
						});
						var buttons={};
						// кнопки ищутся прямо в коде загружаемой страницы
						$dialog.find('.window_button').each(function(){
							var $e = $(this);
							if ($e.is('A') && $e.attr('href')){
								buttons[$e.text()] = function(){
									$e.click();
									window.open($e.attr('href'));
								}
							}else{
								buttons[$e.text()] = function(){$e.click();}
							}
						});
						$dialog.dialog("option", "buttons", buttons);
						lps.base_init($dialog);
					}
					initWindow();
				}
			}));
			return id;
		}
		
		//стандартная инициализация стандартных элементов.
		/**
		* @context все что есть контекст jquery: селектор или объект jquery, или нода дом документа
		*/
		this.base_init = function(context){	
		
			// ограничение вводимых символов
			$('INPUT.float', context).numeric({allow:"., "});
			$('INPUT.num, input.int', context).numeric();
			// те инпуты что имеют класс выбора даты превратитьв выбирание даты
			$('INPUT.datepicker, DIV.datepicker, SPAN.datepicker', context)
				.each(function(i,e){
					var jq_e = $(e);
					var params = {
						dateFormat:      'dd.mm.yy',
						dayNames:        ['Воскресенье', 'Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота'],
						dayNamesMin:     ['Вс', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб'],
						dayNamesShort:   ['Вскр', 'Понед', 'Втор', 'Сред', 'Четв', 'Пятн', 'Суб'],
						monthNames:      ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'],
						monthNamesShort: ['Янв', 'Фев', 'Март', 'Апр', 'Май', 'Июнь', 'Июль', 'Авг', 'Сент', 'Окт', 'Ноя', 'Дек'],
						currentText: 'сегодня',
						firstDay:1,
						hideIfNoPrevNext: true,
						showOtherMonths: true,
						navigationAsDateFormat: true
					}
					var preDate = null;
					if (this.tagName.toUpperCase()!="INPUT" && jq_e.attr('input')){
						params.altField = jq_e.attr('input');
						//Установка даты при изменении
						var input_element = $(jq_e.attr('input'));
						input_element.change(function(){
							jq_e.datepicker('setDate', $(this).val());
						});
						//поиск предустановленной даты перед инициализацией
						if (input_element.attr('value')){
							params.defaultDate = input_element.attr('value');
						}
					}
					if (this.tagName.toUpperCase()=="INPUT"){
						params.buttonImage = '/templates/img/calendar.gif'
						params.showOn = 'button'; 
						params.buttonImageOnly = true;
					}
					jq_e.datepicker(params);
				});
			// преобразование аттрибута маска в маску инпутов
			$('INPUT[mask]', context).each(function(){
				$(this).mask(
					{mask: $(this).attr('mask')}
				);
			});
			// перед некоторыми действиями нужна регистрация/авторизация
			$("FORM.login_only", context).submit(function(){
				var element = this;
				return lps.auth(function(){
					element.submit();
				});
			});
			$("A.login_only", context).click(function(){
				var element = this;
				return lps.auth(function(){
					element.click();
				});
			});
			// Если форма имеет класс clear_form то при отправке отправятся только не пустые поля.
			$("FORM.clear_form", context).submit(function(){
				$("INPUT[value=''], textarea[value='']", this).attr("disabled", "disabled");
				$("SELECT option:selected", this).each(function(){
					if ($(this).attr("value")==0 || $(this).attr("value")==""){
						$(this.parentNode).attr("disabled", "disabled");
					}
				});
				return true;
			});
		}
		
		
	};
	Lps.prototype.auth = function(callback){
		if (typeof callback != "function")
			callback = function(){return true;};
		if (!this.login()){
			this.after_login_action(callback);
			lps.showLoading();
			$.ajax({
				type: 'GET',
				url: '/main/ajax_reg',
				success: function(responseHTML){
					lps.window(responseHTML, 'ajaxReg', {close: function(event, ui) { $(this).remove(); }, title: false});
					lps.hideLoading();
				}
			});
			return false;
		}
		callback();
		return true;
	};
	
	//lps.prototype = {	}
	window.lps = new Lps();
	var lps=window.lps;
	function listenToHashChange() {
		var savedHash = window.location.hash;
		window.setInterval(function() {
			if(savedHash != window.location.hash) {
				savedHash = window.location.hash;
				if(window.location.hash){
					lps.gotoHash(window.location.hash);
				}
			}
		},200);
	}

	lps.createConsole();
	lps.setConsoleReportingLevel("message");
	listenToHashChange();
	lps.base_init(document);
});

