"use strict";

var app = {
	i18n: {}
};

app.strings = {
	urls: {
		lang: 'langc/{0}.json',
	}
}

var templates = {

};

var renderTemplate = function(template, data) {
    if (!templates.hasOwnProperty(template)) {
        return $('<span>').text(tr('Template not found: {0}').format(template));
    }
    var func = templates[template];
    try {
        return func(data);
    } catch (e) {
        if (console && console.log) {
            console.log(e);
        }
        return $('<span>').text(e.toString());
    }
};

$(function() {
    $.fn.extend({
        render: function(template, data) {
            if (((typeof data).toLowerCase() !== 'object') && ((typeof data).toLowerCase() !== 'array')) {
                return function(boundedData) {
                    this.render(template, boundedData);
                };
            }
            var ret = null;
            this.each(function() {
                ret = renderTemplate(template, data);
                $(this).append(ret);
            });
            this.data('renderedChildren', ret);
            return this;
        },
        getRendered: function() {
            return this.data('renderedChildren');
        }
    });
});

app.api = {
	cachedRequest: function(module, action, success, timeout, onerror) {
		timeout = timeout || 3600;
		var li =  $('body').hasClass('is-logged-in') ? 'li_' : '';
		var name = 'api_cache_' + li + module + '_' + action;
		var now = function() {return Math.floor(Date.now() / 1000);};
		var successfn = function(data) {
			localStorage.setItem(name, JSON.stringify({data: data, time: now()}));
			success(data);
		}
		var data = null;
		if(localStorage.getItem(name)) {
			data = JSON.parse(localStorage.getItem(name));
			if (data.time >= (now() - timeout)) {
				success(data.data);
				return;
			}
		}
		app.api.sendRequest(module, action, {nocache: Date.now()}, successfn, false, onerror);
	},
	cachedRequestInvalidate: function(inv) {
		var name = 'api_cache_' + inv;
		if (localStorage.getItem(name)) {
			localStorage.removeItem(name);
		}
		name = 'api_cache_li_' + inv;
		if (localStorage.getItem(name)) {
			localStorage.removeItem(name);
		}
	},
	sendRequest: function(module, action, requestData, success, isPOST, onerror) {
		isPOST = ((typeof isPOST) == 'undefined') ? true : isPOST;
		onerror = ((typeof onerror) == 'undefined') ? function(e, isXHRerror) {
			if (console)
				if (console.log)
					console.log(tr(e, 'error-' + module + '-' + action + '-' + e));
			window.location.reload();
		} : onerror;
		success = success || function() {};
		requestData = requestData || [];
		var baseURL = location.protocol+'//'+location.host+location.pathname;
		if ($('body').attr('data-xhrurl')) {
			baseURL = $('body').data('xhrurl');
		}
		var keyData = {};
		if ($('body').attr('data-key')) {
			keyData = {key: $('body').data('key')};
		}
		if (requestData instanceof FormData) {
			requestData.append('module', module);
			requestData.append('action', action);
		} else {
			requestData = $.extend({}, requestData, keyData, {
				'module': module,
				'action': action
			});
		}
		let options = {
				url: baseURL,
				type: isPOST ? 'post' : 'get',
				data: requestData,
				success: function(data) {
						if (!data) {
								data = {};
						}
						if (data.invalidate) {
							if ($.isArray(data.invalidate))
								$.each(data.invalidate, function(k, v) {
									app.api.cachedRequestInvalidate(v);
								});
							else
								app.api.cachedRequestInvalidate(data.invalidate);
						}
						if (data.error) {
							onerror(data.error, false);
						} else {
							success(data);
						}
						if (data.reload) {
							window.location.reload();
						}
				},
				error: function(data) {
					onerror(data, true);
				},
				async: true
		};
		if (requestData instanceof FormData) {
			options.processData = false;
			options.contentType = false;
		} else {
			options.dataType = 'json';
		}
		return $.ajax(options);
	}
}

app.navigation = {
	load: function(module, action, args) {
		var s = '?module=' + encodeURIComponent(module) + '&action=' + encodeURIComponent(action);
		$.each(args, function(k,v) {
			s += '&' + encodeURIComponent(k) + '=' + encodeURIComponent(v);
		});
		document.location.search = s;
	}
}

app.init = {
	fn: [],
	run_direct: false,
	add: function(f) {
		if (app.init.run_direct)
			f();
		else
			app.init.fn.push(f);
	},
	loadlang: function() {
		app.api.cachedRequest('app', 'lang', function(data) {
			app.i18n = data;
			app.init.run_direct = true;
			$.each(app.init.fn, function(k,f) {
				f();
			});
		}, true, function() {});
	},
	run: function() {
		if ($('body').hasClass('is-logged-in')) {
			app.api.cachedRequest('app', 'settings_data', function(data) {
				app.settings = data;
				app.init.loadlang();
			});
		} else {
			app.init.loadlang();
		}
	}
};

$(app.init.run);

$(function() {
	$('nav.navbar a.popup').click(function(e) {
		window.open($(this).attr('href'), Date.now() + '', 'menubar=no,toolbar=no,location=no,personalbar=no,status=no,scrollbars=no,width=1200,height=675');
		e.preventDefault();
	});
	if ($('body').hasClass('module-app')) {
		if ($('body').hasClass('action-login')) {
			$('#username').focus();
			$('body').focus().keypress(function(e) {
				if ((e.charCode >= 48) && (e.charCode <= 57)) {
					var digit = '' + (e.charCode - 48);
					$('#pin').val($('#pin').val() + digit).change();
				}
			});
			var form_is_submitted = false;
			$('#pin').change(function(e) {
				if ($('#pin').val().length == $('#pin').attr('maxlength')) {
					$('#pin').closest('form').submit();
					form_is_submitted = true;
				}
			}).keypress(function(e) {
				e.stopPropagation();
			});
			$('.pin-touch-button').on('touchmove', function(e) {e.preventDefault();}, false).on('click touchstart', function() { 
				var $element = $(this);
				$element.css({
					'background-color': '#ccc',
					'transition': 'background-color .1s ease-in-out'
				});
				window.setTimeout(function() {
					$element.css({
						'background-color': '#fff',
						'transition': 'background-color .1s ease-in-out'
					});
				}, 100);
			});
			$('.pin-touch-button[type="clear"]').on('click touchstart', function(e) {
				$('#pin').val('').change();
				e.preventDefault();
				e.stopPropagation();
			});
			$('.pin-touch-button[type="button"]').on('click touchstart', function(e) {
				$('#pin').val($('#pin').val() + $(this).attr('data-number')).change();
				e.preventDefault();
				e.stopPropagation();
			});
			$('#login-form').submit(function() {
				$('button[type="submit"]').prop('disabled', true).find('.fa-spinner').removeClass('d-none');
				return true;
			});
			$('button[type="submit"]').on('click touchstart', function(e) {
				if (form_is_submitted) {
					e.preventDefault();
					e.stopPropagation();
				}
			});
		}
		if ($('body').hasClass('action-settings')) {
			$('#btn-clear-pin').click(function() {
				$('#pin').val('');
			});
			$('#btn-new-random-pin').click(function() {
				var pin_len = $('#pin').attr('maxlength');
				var new_pin = Math.floor(Math.random() * Math.pow(10, pin_len));
				new_pin = new_pin + "";
				while(new_pin.length < pin_len) new_pin = '0' + new_pin;
				$('#pin').val(new_pin);
			});
			$('#btn-submit').parent().submit(function() {
				var keys = [];
				$.each(localStorage, function(key, val){
					if (key.substr(0, 10) == 'api_cache_') {
						keys.push(key);
					}
				});
				$.each(keys, function(_, key) {
					localStorage.removeItem(key);
				});
				return true;
			});
		}
	}
});
