/*
	Created by Michael Schuijff <michael@reglobe.nl>
	Copyright Lost Images, The Netherlands
	
	For more information, visit www.michaelschuijff.nl
*/

if (!config.bot) {
	document.title = config.name;
}

if (!config.android && !config.iOS) {
	loadCSS('https://fonts.googleapis.com/css?family=Roboto:400,400i,700,700i&display=swap&subset=cyrillic,cyrillic-ext,greek,greek-ext,latin-ext,vietnamese');
}

['android', 'iOS', 'mobile', 'tablet'].forEach((value) => {
	document.body.classList.toggle('is-' + value.toLowerCase(), !!config[value]);
});

if (!(config.android || config.iOS || config.mobile && config.tablet)) {
	document.body.classList.add('is-desktop');
}

if (window.cordova) {
	document.body.classList.add('is-cordova');
}

document.addEventListener('deviceready', () => {
	let width = screen.width, height = screen.height;
	
	if (width > height) {
		[height, width] = [width, height];
	}
	
	if (width / height > .65) {
		screen.orientation.unlock();
	}
});

document.addEventListener('loaded', () => {
	let language = options.get('language');
	
	if (!language && navigator.language) {
		language = navigator.language.substr(0, 2);
	}
	
	if (!window.l10n || !window.l10n[language]) {
		language = 'en';
	}
	
	document.body.parentNode.setAttribute('lang', language);
	document.body.setAttribute('lang', language);
	
	config.language = language;
	
	if (window.l10n) {
		let style = createElement('style');
		style.type = 'text/css';
		
		for (let language in l10n) {
			if (l10n[language]['More']) {
				style.innerHTML += "body[lang=" + language + "] .content>.read-more::after{content:'" + l10n[language]['More'][0] + "';}";
			}
		}
		
		if (style.innerHTML) {
			document.head.append(style);
		}
	}
});

function __ (text) {
	let values = [], plural = false;
	
	for (let i = 1; i < arguments.length; i ++) {
		values[values.length] = arguments[i];
	}
	
	if (typeof values[0] == 'boolean') {
		plural = values.shift();
	}
	
	let l10n = (window.l10n || {})[config.language] || {};
	
	if (l10n[text]) {
		if (plural) {
			text = l10n[text][1] || l10n[text][0];
		} else {
			text = l10n[text][0]; 
		}
	}
	
	if (values.length) {
		let split = text.split(/(%[ds])/g);
		
		for (let i = 1, length = split.length; i < length; i += 2) {
			split[i] = values[(i - 1) / 2];
		}
		
		text = split.join('');
	}
	
	return text;
}

function _e () {
	return encodeHTML(__.apply(null, arguments));
}

function download (image, filename) {
	if (window.cordova) {
		imagedownloader.download(image, () => toast('Image saved in your gallery.'), console.log);
		return;
	}
	
	let basename = filename || image, position = basename.indexOf('/');
	
	if (~position) {
		basename = basename.substr(position);
	}
	
	let element = document.createElement('a');
	Object.assign(element, { href: image, download: basename });
	
	element.click();
}

function clipboard (text) {
	if (window.cordova) {
		cordova.plugins.clipboard.copy(text);
	} else {
		navigator.clipboard.writeText(text);
	}
}

document.addEventListener('contextmenu', (e) => {
	if (e.target.matches('img, video')) {
		e.preventDefault();
	}
});

document.addEventListener('submit', (e) => {
	e.preventDefault();
});

document.addEventListener('pause', () => {
	if (window.activeView) {
		activeView.trigger('pause');
	}
});

document.addEventListener('resume', () => {
	if (window.activeView) {
		activeView.trigger('resume');
	}
});

document.addEventListener('online', () => {
	config.offline = false;
});

document.addEventListener('offline', () => {
	if (!config.offline) {
		toast(__('You are currently offline.'));
	}
	
	config.offline = true;
});

function createElement (tagName, className) {
	let element = document.createElement(tagName);
	
	if (className) {
		element.className = className;
	}
	
	if (tagName == 'button') {
		element.type = 'button';
	}
	
	for (let i = 2, length = arguments.length; i < length; i ++) {
		element.append(arguments[i]);
	}
	
	return element;
}

function loadScript (src, success, error) {
	let elements = document.querySelectorAll('script');
	
	for (let element of elements) {
		if (element.src == src) {
			success && success();
			return;
		}
	}
	
	let element = createElement('script');
	
	if (success) {
		element.onload = success;
	}
	
	element.onerror = () => {
		if (error) {
			error();
		}
		
		element.remove();
	}
	
	Object.assign(element, { async: true, src: src });
	
	document.body.append(element);
}

function loadCSS (href) {
	let link = createElement('link');
	
	Object.assign(link, {
		href: href, type: 'text/css', rel: 'stylesheet'
	});
	
	document.querySelector('head').append(link);
}
function encodeHTML (string) {
	if (typeof string == 'number') {
		string = '' + string;
	}
	
	if (typeof string != 'string') {
		return '';
	}
	
	return string.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
}

function decodeHTML (string) {
	let element = document.createElement('div');
	element.innerHTML = string;
	
	return element.innerText;
}

function encodeURIData (values) {
	let result = '';
	
	for (let field in values) {
		append(encodeURIComponent(field), values[field]);
	}
	
	function append (name, value) {
		if (value === null || value === undefined) {
			return;
		}
		
		if (Array.isArray(value)) {
			for (let i = 0, length = value.length; i < length; i ++) {
				append(name + '[]', value[i]);
			}
			
			return;
		}
		
		if (typeof value == 'object' && !(value instanceof Date || value instanceof Blob)) {
			for (let field in value) {
				append(name + '[' + encodeURIComponent(field) + ']', value[field]);
			}
			
			return;
		}
		
		result += '&' + name + '=' + encodeURIComponent('' + value);
	}
	
	return result.substr(1);
}

function encodeFormData (data, values) {
	if (arguments.length == 1) {
		[values, data] = [data, new FormData];
	}
	
	for (let field in values) {
		append(field, values[field]);
	}
	
	function append (name, value) {
		if (value === null || value === undefined) {
			return;
		}
		
		if (Array.isArray(value)) {
			for (let i = 0, length = value.length; i < length; i ++) {
				append(name + '[]', value[i]);
			}
			
			return;
		}
		
		if (typeof value == 'object' && !(value instanceof Date || value instanceof Blob)) {
			for (let field in value) {
				append(name + '[' + field + ']', value[field]);
			}
			
			return;
		}
		
		data.append(name, value);
	}
	
	return data;
}

function toBlob (data, type) {
	let byteString = atob(data);
	
	let ab = new ArrayBuffer(byteString.length)
		, ia = new Uint8Array(ab);
		
	for (let i = 0; i < byteString.length; i ++) {
		ia[i] = byteString.charCodeAt(i);
	}
	
	return new Blob([ab], { type: type });
}

function popupReview (delay) {
	delay = delay || 1000;
	
	if (!window.cordova) {
		return;
	}
	
	let user = config.user;
	
	if (!user || user.follower_count < 5) {
		return;
	}
	
	setTimeout(() => cordova.plugins.AppReview.requestReview(), delay);
}

(function () {
	let images = {};
	
	window.preload = function (url, callback) {
		if (images[url]) {
			let image = images[url];
			
			if (image.complete) {
				callback(image.src, image);
			} else {
				image.addEventListener('load', () => callback(image.src, image));
			}
			
			return;
		}
		
		let image = new Image;
		
		image.addEventListener('load', () => callback(image.src, image));
		
		image.src = url, images[url] = image;
	}
})();
