var loading_txt='<div class="agorta_loading"><div class="big_square"><div class="small_square"></div></div></div>';
var caps=false;

function false_alarm() {
	if($('#false_alarm').length>0) {
		document.getElementById('false_alarm').pause();
		document.getElementById('false_alarm').currentTime=0;
		document.getElementById('false_alarm').play();
	}
	display_false_alarm();
}

function success_alarm() {
	if($('#success_alarm').length>0) {
		document.getElementById('success_alarm').pause();
		document.getElementById('success_alarm').currentTime=0;
		document.getElementById('success_alarm').play();
	}
}

function window_open_alarm() {
	if($('#window_open_alarm').length>0) {
		document.getElementById('window_open_alarm').pause();
		document.getElementById('window_open_alarm').currentTime=0;
		document.getElementById('window_open_alarm').play();
	}
}

function error_click_alarm() {
	if($('#error_click_alarm').length>0) {
		document.getElementById('error_click_alarm').pause();
		document.getElementById('error_click_alarm').currentTime=0;
		document.getElementById('error_click_alarm').play();
	}
	display_false_alarm();
}

function display_false_alarm() {
	if($('#display_false_alarm').length>0) {
		$('#display_false_alarm').show();
		setTimeout("$('#display_false_alarm').hide()", 10);
	}
}

$('body').off('click','input[type="reset"]');
$('body').on('click','input[type="reset"]', function(e){
	e.preventDefault();
	var form=$(this).closest('form');
	$(form).find('input[type="text"]').val('');
	$(form).find('input[type="hidden"]').val('');
	$(form).find('input[type="date"]').val('');
	$(form).find('input[type="number"]').val('');
	$(form).find('select').prop("selectedIndex", 0);
});

var DOMSubtreeModifiedBinded = false;
$('body').bind("DOMSubtreeModified",function(){
	//задержка позволяет костылём пофиксить баг
	//с черным экраном на некоторых версиях Android
	//может быть это только на мобилах делать?
	setTimeout(body_overflow, 500*set_timeout_popup);
	
	//это позволит не биндить кучу анонимных функций
	if(!DOMSubtreeModifiedBinded) {
		DOMSubtreeModifiedBinded = true;
	}
});

function show_window(id=null, html=loading_txt) {
	$('input').blur();
	$('textarea').blur();
	return $('body').append('<div class="popup" id="'+id+'"><div class="popup_area"><div class="close close_button"><i class="fa fa-times" aria-hidden="true"></i></div><div class="popup_content">'+html+'</div></div></div>');
}

function body_overflow() {
	if($('.popup').length==0) {
		$('body').css('overflow', 'auto');
	}
	else {
		$('body').css('overflow', 'hidden');
	}
}

function close_window(elem){
	var w=$(elem).closest('.popup');
	if($('.page_reload', w).length>0) {
		location.reload();
	}
	$(w).remove();
}

function load_window(link, close=true) {
	var id=$.now();
	show_window(id);
	$('#'+id+' .popup_content').load(link, function(response, status, xhr) {
  		if(status=="error") {
  			false_alarm();
    		$('#'+id+' .popup_content').html(xhr.status+" "+xhr.statusText);
    		$("#"+id+" .close").show();
  		}
  		else {
  			window_open_alarm();
  			if(!close) {
  				$("#"+id+" .close").hide();
  			}
  		}
	});
}

$('body').off('click', '.close');
$('body').on('click', '.close', function (){
	close_window(this);
});

function close_all_window() {
	if($('.only_hand_close').length>0) {
		$('.only_hand_close').closest('.popup').addClass('only_hand_close_window');
	}
	$('.popup').not('.only_hand_close_window').remove();
	$('.only_hand_close_window').removeClass('only_hand_close_window');
	if($('form[name="product_search_form"] input[name="product_search"]').length>0) {
		$('input[type="button"]').blur();
		$('button').blur();
	}
	body_overflow();
}

// Если есть документы на фискализацию
function view_remote_receipts(n) {
	if(n>0) { // Если есть документы на удаленную фискализацию
		$('.remote_receipts').show();
		$('#remote_receipts_n').html('('+n+')');
	}
	else { // Если нет документов на удаленную фискализацию
		$('.remote_receipts').hide();
		$('#remote_receipts_n').html('');
	}
}

// Показать кол-во новых интернет-заказов
function view_new_orders(n) {
	if($('#neworder').length==0) return;
	if(n>0) {
		if($('.neworders_count b').html()<n && orders_alarm==1) {
			document.getElementById('neworder').play();
		}
		/*var n0=$('#neworders_count b').html()*1;
		if(n0!=n) {
			document.getElementById('neworder').play();
		}*/
		$('.neworders_count b').html(n);
		$('.neworders_count').show();
	}
	else {
		$('.neworders_count').hide();
	}
}

$(document).ajaxStart(function(x) {
	$('#product_search_form .virtual_key_total').attr('disabled', true);
	$('#receipts_buttons .line_control').attr('disabled', true);
});

$(document).ajaxStop(function(x) {
	$('#product_search_form .virtual_key_total').removeAttr('disabled');
	$('#receipts_buttons .line_control').removeAttr('disabled');
});


function reload_elem(elem, elem_id, scroll, scrollto) {
	var href=$(elem).attr('href');
	if(href==undefined) href='';
	if(elem_id) {
		if(href.indexOf('?')>0) {
			href+='&';
		}
		else {
			href+='?';
		}
		href+='id='+elem_id;
	}
	show_window('loading', loading_txt);
	if(scroll=='.receiptlines_div') {
		var receiptlines_div_scroll=$('.receiptlines_div').scrollTop();
	}

	$(elem).load(href+' '+elem+' .reload', function(){
		if(elem=='.receiptlines') {
			$('.button_total .receipt_sum').html($('.total_table .receipt_sum').html());
			//$('.select_line').trigger('click');
			receiptlines_div_resize();
			//$('.receiptlines_div ').scrollTop($('.receiptlines_div ').height());
		}
		if(scroll) {
			if($(scrollto).length>0) {
				var contactTopPosition = $(scrollto).position().top;
				if(scroll=='.receiptlines_div') {
					if(receiptlines_div_scroll+$('.receiptlines_div ').height()>contactTopPosition) {
						$('.receiptlines_div').scrollTop(receiptlines_div_scroll);
					}
					else {
						$('.receiptlines_div').scrollTop(contactTopPosition);
					}
				}
				else {
					$(scroll).scrollTop(contactTopPosition);
				}
			}
		}
		close_window('#loading');
	});
}

function ajax_response(response) {
	var res=JSON.parse(response);
	if(res.txt!=undefined && res.txt) {
    	show_window('message', '<p class="'+res.success+'">'+res.txt+'</p>');
    }
    if(res.success==true) success_alarm();
    else false_alarm();

	if(res.next_step) {
		//show_window('loading', loading_txt);
		load_ajax(res.next_step);
	}
	if(res.reroute) {
		location.href=res.reroute;
	}

	if(res.ticket_reset) {
		$('.discount_input').val(0);
		$('.discount_input').show(0);
		$('.partner_button').remove();
		$('.partner_search_button').show();
		$('.discount_input').show();
		$('.line_control').each(function(){
			var href=$(this).attr('href');
			if(href) {
				href=href.substr(0, href.indexOf('=')+1);
				$(this).attr('href', href);
			}
		});
	}

	// Если есть документы на удаленную фискализацию
	if(res.remote_receipts!=undefined) {
		view_remote_receipts(res.remote_receipts);
	}
	
	if(res.reload) {
		if(Array.isArray(res.reload)===true) {
			for(var i=0; i<res.reload.length; i++) {
				reload_elem(res.reload[i], res.id, res.scroll, res.scrollto);
			}
		}
		else {
			reload_elem(res.reload, res.id, res.scroll, res.scrollto);
		}
	}
	if(res.reload_menu) {
		$('#settings_menu').load(location.href+'?show_menu=1 #settings_menu > .first_menu');
		$('#receipt_menu').load(location.href+'?show_menu=1 #receipt_menu > .first_menu');
		$('#room_menu').load(location.href+'?show_menu=1 #room_menu > .first_menu');
	}
	if(res.close_all_window) {
		close_all_window();
	}
	if(res.form_reset) {
		$('form').trigger("reset");
	}
	if(res.function) {
		eval(res.function);
	}
	if(res.show_qr) {
		$('#message').remove();
		load_window(res.show_qr, false);
	}
	if(res.show_message!=undefined && res.show_message!='') {
		close_all_window();
		load_window(res.show_message);
	}
	if(res.close_window) {
		if(Array.isArray(res.close_window)===true) {
			for(var i=0; i<res.close_window.length; i++) {
				$(res.close_window[i]).closest('.popup').remove();
			}
		}
		else {
			$(res.close_window).closest('.popup').remove();
		}
	}
}

var http_request=null;
function load_ajax(href, loading=true) {
	if(loading)	show_window('loading', loading_txt);
	http_request=$.ajax({
        url: href,
        dataType: "html",
        success: function(response) {
        	close_all_window();
       		var isJson = true;
        	var res;
        	try {
    			res=JSON.parse(response);
			} catch(e) {
    			isJson = false;
			}
       		if(isJson) {
       			ajax_response(response);
       		}
       		else {
       			show_window(null, response);
       		}
    	},
    	error: function(response) {
    		false_alarm();
    		if(response.statusText=='abort') return;
    		close_all_window();
            show_window('error', response.statusText);
            //$("#loading .close").show();
    	},
    	timeout: 65000
 	});
}

function send_form(form) {
	$('input', form).blur();
	var submit_button=$('input[type="submit"]', form);
	submit_button.attr('disabled', 'disabled');
	var no_loading_txt=0
	if($(form).attr('no_loading_txt')==1) {
		no_loading_txt=1;
	}
	if(no_loading_txt==0) {
		show_window('loading', loading_txt);
	}
	action=$(form).attr('action');
	if(action==undefined)action='';
	var method=$(form).attr('method');
	if(method==undefined)action='GET';
	var time_out=$(form).attr('timeout');
	if(time_out==undefined) {
		time_out=305000;
	}
	var show_error=$(form).attr('showerror');
	if(show_error==undefined) {
		show_error=1;
	}
	var formData = $(form).serialize();
	$.ajax({
        url: action,
        type: method,
        dataType: "html",
        data: formData,
        success: function(response) {
        	submit_button.removeAttr('disabled');
        	$("#loading").remove();
        	var isJson = true;
        	var res;
        	try {
    			res=JSON.parse(response);
			} catch(e) {
    			isJson = false;
			}
       		if(isJson) {
       			ajax_response(response);
       		}
       		else {
       			show_window(null, response);
       		}
       		$('#loading').remove();
    	},
    	error: function(response) {
    		false_alarm();
    		submit_button.removeAttr('disabled');
    		if(show_error==1) {
            	$("#loading .popup_content").html(response.statusText);
            	$("#loading .close").show();
            }
            else {
            	$("#loading").remove();
            }
    	},
    	timeout: time_out
 	});
}

$('body').on('click', '.popup .pagination a', function(e){
	var href=$(this).attr('href');
	close_window(this);
	load_window(href);
	e.preventDefault();
});

$('body').on('submit', '.popup .close_window', function(){
	close_window(this);
});

$('body').on('click', '.show_window', function(e){
	var href=$(this).attr('href');
	load_window(href);
	e.preventDefault();
});

$('body').on('click', '.send_ajax', function(e){
	var href=$(this).attr('href');
	load_ajax(href);
	e.preventDefault();
});

$('body').on('click', '.gen_pass', function(){
	var input=$('input[name="'+$(this).attr('for')+'"]');
	var l=$(this).attr('length');
	if(l==undefined || l==null) {
		l=6;
	}
	var pass="";
	var words='0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM';
	var max_pos=words.length-1;
	for(i=0; i<l; i++) {
		pos=Math.floor(Math.random()*max_pos);
		pass+=words.substring(pos, pos+1);
	}
	input.val(pass);
});

$('body').on('submit', 'form:not(.no_ajax)', function(e){
	e.preventDefault();
	if(caps===true && ($(this).attr('name')=='product_search_form' || $(this).attr('name')=='add_marking_form')) {
		false_alarm();
		show_window('error', '<p class="false">Отключите "Caps Lock" на клавиатуре</p>');
		return;
	}
	send_form(this);
});

// Экранная цифровая клавиатура

// Цифры
$('body').on('click', '.virtual_key', function(e){
	var sel = window.getSelection()+'';
	var el=$('.'+$(this).attr('for')).eq(0);
	if(sel.length>0) {
		el.val($(this).val());
	}
	else {
		el.val(el.val()+$(this).val());
	}
	if(!el.is(':focus')) el.focus();
});

// очистить
$('body').off('click', '.virtual_key_delete');
$('body').on('click', '.virtual_key_delete', function(){
	var el=$(this).attr('for');
	var form=$('.'+el).closest('form');
	$('input[type="text"]', form).val('');
	$('input[type="password"]', form).val('');

	if($('form[name="form_autorization"]').length==0) {
		$('select', form).prop('selectedIndex',0);
	}
	$('select', form).trigger('change');
	//$(form).trigger("reset");
	//$('.'+el).focus();
	$('.'+el).val('');
});

// удалить символ
$('body').on('click', '.virtual_key_bks', function(){
	var val=$('.'+$(this).attr('for')).val();
	val=val.substr(0, val.length-1);
	$('.'+$(this).attr('for')).val(val);
	$('.'+$(this).attr('for')).focus();
});

$('body').on('submit', 'form[name="messages_continue_form"]', function(){
	close_window(this);
});

$('body').off('click', '#smile');
$('body').on('click', '#smile', function(){
	$('body').toggleClass('body_replace');
});

function synchronization_action() {
	$('#synchronization_status').html('');
	var dt = new Date();
	var time = dt.getMinutes();
	if(time%synchronization_timer!=0) return;
	$('#synchronization_status').html('Идет синхронизация...');
	var l='/api/auto';
	if($('.users_list').length>0) {
		l+='?reload=1';
	}

	var url=l;
	var xhr = new XMLHttpRequest();
	xhr.open("GET", url, true);
	xhr.timeout = 65000;
	xhr.onload = () => {
		if(xhr.status===200) {
			var res=xhr.response;
        	try {
    			var res=JSON.parse(res);
        		$('#synchronization_status').html(res.txt);
        		setTimeout('$("#synchronization_status").html("");', 10000);
        		view_remote_receipts(res.remote_receipts);
        		if(typeof res.neworders!=='undefined') {
        			view_new_orders(res.neworders);
        		}
        		if(typeof res.balance!=='undefined') {
        			if(res.balance>0) {
        				$('.receiptlines_div').removeClass('limited_version');
        				if(res.balance_alarm>0) {
	        				$('.receiptlines_div').addClass('balance_alarm');
	        			}
	        			else {
	        				$('.receiptlines_div').removeClass('balance_alarm');
	        			}
	        			if(res.time_alarm==true) {
	        				$('.receiptlines_div').addClass('time_alarm');
	        			}
	        			else {
	        				$('.receiptlines_div').removeClass('time_alarm');
	        			}
        			}
        			else {
        				$('.receiptlines_div').addClass('limited_version');
        			}
        		}

        		if(res.reload) {
        			var user_id=$(res.reload+' select').val();
					$(res.reload).load(location.href+' .reload', function(){
						$(res.reload+' select').val(user_id);
					});
				}
			} catch(e) {
    			$('#synchronization_status').html('');
			}
		}
		else {
			$('#synchronization_status').html('');
		}
	};

	xhr.ontimeout = (e) => {
		$('.receiptlines_div').addClass('offline');
	};
	xhr.send(null);
}

function isOnline() {
    var url='https://agorta.ru/api/isonline';
	var xhr = new XMLHttpRequest();
	xhr.open("HEAD", url, true);
	xhr.timeout = 3000;
	xhr.onload = () => {
		if(xhr.status===200) {
			$('.receiptlines_div').removeClass('offline');
   			synchronization_action();
		}
		else {
			$('.receiptlines_div').addClass('offline');
		}
	};

	xhr.ontimeout = (e) => {
		$('.receiptlines_div').addClass('offline');
	};
	xhr.send(null);
}

// Автоматическая синхронизация
function synchronization() {
	isOnline();
}

// Запускаем синхронизацию
if(synchronization_start>0) {
	synchronization();
	setInterval('synchronization()', 60000);
}

// Управляем полным экраном
function exit_fullscreen() {
	if(document.cancelFullScreen) {
    	document.cancelFullScreen();
  	}
  	else if(document.mozCancelFullScreen) {
    	document.mozCancelFullScreen();
  	}
  	else if(document.webkitCancelFullScreen) {
    	document.webkitCancelFullScreen();
  	}
}

function fullscreen() {
	var element=document.documentElement;
	if(element.requestFullScreen) {
    	element.requestFullScreen();
  	}
  	else if(element.mozRequestFullScreen) {
    	element.mozRequestFullScreen();
  	}
  	else if(element.webkitRequestFullScreen) {
    	element.webkitRequestFullScreen();
  	}
}

function toggle_fullscreen() {
	var full=document.fullscreenElement;
	if(full==null) {
		fullscreen();
	}
	else {
		exit_fullscreen();
	}
}

$('body').off('click', '#fullscreen');
$('body').on('click', '#fullscreen', function(){
	toggle_fullscreen();
});

function auto_fullscreen() {
	if((location.pathname=='/receipts/sales' || location.pathname=='/' || location.pathname=='/receipts/return') && $('input[name="auto_fullscreen"]').val()==1) {
		fullscreen();
	}
	else {
		clearInterval(auto_fs);
		return;
	}

	var full=document.fullscreenElement;
	if(full!=null) {
		clearInterval(auto_fs);
	}
}

var auto_fs=setInterval("auto_fullscreen()", 3000);

var auto_close;

function auto_logout_function() {
	auto_logout_timer++;
	if(auto_logout_timer==auto_logout) {
		load_ajax('/users/logout');
	}
}

var auto_logout_timer=0;
if(auto_logout>0) {
	$('body').keypress(function(){
		auto_logout_timer=0;
	});
	$('body').mousemove(function(){
		auto_logout_timer=0;
	});
	setInterval(auto_logout_function, 1000);
}

function auto_remote_fiscalization_function() {
	if($('#remote_receipts_n').html()=='') {
		auto_remote_fiscalization_timer=0;
		return;
	}
	auto_remote_fiscalization_timer++;
	var a=auto_remote_fiscalization-auto_remote_fiscalization_timer;
	$('#countdown').remove();
	if(a>0 && a<=5) {
		var html='<h1>Сейчас что-то произойдет...</h1><p align="center"><big>'+a+'</big></p>';
		show_window('countdown', html);
	}

	if(auto_remote_fiscalization_timer==auto_remote_fiscalization) {
		var href='/receipts/fiscalization/?close=1';
		load_ajax(href);
	}
}

var auto_remote_fiscalization_timer=0;
if(auto_remote_fiscalization>0) {
	$('body').keypress(function(){
		auto_remote_fiscalization_timer=0;
	});
	$('body').mousemove(function(){
		auto_remote_fiscalization_timer=0;
	});
	setInterval(auto_remote_fiscalization_function, 1000);
}

var isCtrl = false;
$(document).keyup(function (e) {
	if(e.which == 17) isCtrl=false;
}).keydown(function (e) {
	if(e.which == 17) isCtrl=true;
	if(e.which == 81 && isCtrl == true) {
		close_all_window();
		$('body').toggleClass('qwerty');
	}
});

$('body').off('click', '.first_menu');
$('body').on('click', '.first_menu', function() {
	$(this).toggleClass('first_menu_hover');
});

$(document).mouseup(function(e) {
	var div=$('.first_menu_hover');
	if(!div.is(e.target) && div.has(e.target).length===0 ) {
		div.removeClass('first_menu_hover');
	}
});

$('body').off('click', '.error_trace_show');
$('body').on('click', '.error_trace_show', function(){
	$('.error_trace', $(this).closest('div')).show();
	$(this).remove();
});

history.pushState( "nohb", null, location.href );
$(window).on( "popstate", function(event){
  	event.preventDefault();
  	history.pushState( "nohb", null, location.href );
  	return false;
});

$('body').off('click', '.virtual_key_eng');
$('body').on('click', '.virtual_key_eng', function(){
	$('.virtual_keyboard .ru').hide();
	$('.virtual_keyboard .eng').show();
});

$('body').off('click', '.virtual_key_ru');
$('body').on('click', '.virtual_key_ru', function(){
	$('.virtual_keyboard .ru').show();
	$('.virtual_keyboard .eng').hide();
});

$('body').off('focus', '.mixed_pay');
$('body').on('focus', '.mixed_pay', function(){
	var form=$(this).closest('form');
	var attr=form.find('.virtual_keyboard input[type="button"]').attr('for');
	if(attr!='mixed_pay_'+$(this).attr('pid')) {
		$(this).select();
	}
	form.find('.virtual_keyboard input[type="button"]').attr('for', 'mixed_pay_'+$(this).attr('pid'));
	form.find('.virtual_keyboard button').attr('for', 'mixed_pay_'+$(this).attr('pid'));
});

// Поиск других касс при работе в совместном режиме
function scan_cashboxes() {
    var url='/multikassa/scan';
	var xhr = new XMLHttpRequest();
	xhr.open("GET", url, true);
	xhr.timeout = 65000;
	xhr.onload = () => {
		if(xhr.status===200) {
			try {
    			var res=JSON.parse(xhr.response);
        		$('#synchronization_status').html(res.txt);
        		setTimeout('$("#synchronization_status").html("");', 10000);
			}
			catch(e) {
    			$('#synchronization_status').html('');
			}
		}
		else {
			$('#synchronization_status').html('');
		}
	};

	xhr.ontimeout = (e) => {
		$('#synchronization_status').html('');
	};
	xhr.send(null);
}

function check_window_table() {
	if($('.receiptlines').length>0) return;
	location.href=location.pathname;
}

$('body').off('click', '.select_all');
$('body').on('click', '.select_all', function(){
	var elems=$(this).attr('data-select');
	$('.'+elems).prop('checked', true);
});

$('body').off('click', '.unselect_all');
$('body').on('click', '.unselect_all', function(){
	var elems=$(this).attr('data-select');
	$('.'+elems).prop('checked', false);
});

function balance_error_wait(s) {
	$('.balance_error_time').html(s);
	if(s>0) {
		setTimeout(balance_error_wait, 1000, s-1);
	}
	else {
		$('#balance_error_wait').remove();
	}
}

function clock() {
	let currentDateTime = new Date();
    let formattedTime = currentDateTime.getHours() + ":" + currentDateTime.getMinutes();
    let h=currentDateTime.getHours();
    if(h<10) h='0'+h;
    let m=currentDateTime.getMinutes();
    if(m<10) m='0'+m;
    $('#clock .h').html(h);
    $('#clock .m').html(m);
}

setInterval(clock, 10000);