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

window.cache = window.cache || {};

(function () {
	let views = [];
	
	cache.get = function (url) {
		for (let view of views) {
			if (~view.urls.indexOf(url)) {
				return view;
			}
		}
		
		return false;
	}
	
	cache.set = function (view) {
		if (!view.urls || !view.urls.length) {
			return false;
		}
		
		let urls = view.urls;
		
		for (let i = 0, length = views.length; i < length; i ++) {
			if (view == views[i]) {
				continue;
			}
			
			{
				let view = views[i];
				
				for (let url of urls) {
					let index = view.urls.indexOf(url);
					
					if (~index) {
						view.urls.splice(index, 1);
					}
				}
				
				if (!view.urls.length) {
					view.destroy();
					views.splice(i, 1);
					
					i --, length --;
				}
			}
		}
		
		views[views.length] = view;
	}
	
	cache.delete = function (value) {
		let urls;
		
		if (typeof value == 'string') {
			urls = [value];
		}
		
		if (Array.isArray(value)) {
			urls = value;
		}

		if (!urls) {
			if (!value || typeof value != 'object') {
				return false;
			}
			
			let index = views.indexOf(value);
			
			if (~index) {
				views[index].destroy();
				views.splice(index, 1);
			}
			
			return true;
		}
		
		for (let i = 0, length = views.length; i < length; i ++) {
			let view = views[i];
			
			for (let url of urls) {
				if (url[url.length - 1] != '*') {
					if (!~view.urls.indexOf(url)) {
						continue;
					}
				} else {
					let prefix = url.substr(0, url.length - 1), destroy = false;
					
					for (let url of view.urls) {
						if (url.length > prefix.length && url.substr(0, prefix.length) == prefix) {
							destroy = true;
							break;
						}
					}
					
					if (!destroy) {
						continue;
					}
				}
				
				if (view == window.activeView) {
					delete window.activeView;
				}
				
				view.destroy();
				views.splice(i, 1);
				
				i --, length --;
				
				break;
			}
		}
		
		return true;
	}
	
	cache.reset = function () {
		if (window.activeView) {
			let index = views.indexOf(activeView);
			
			if (!~index) {
				activeView.destroy();
			}
			
			delete window.activeView;
		}
		
		for (let view of views) {
			view.destroy();
		}
		
		views.length = 0;
		
		return true;
	}

	cache.expire = function () {
		const expired = Date.now() - 300000;
		
		for (let i = 0, length = views.length; i < length; i ++) {
			let view = views[i];
			
			if (view.loading || view == window.activeView) {
				continue;
			}
			
			if (view.lastUsed < expired) {
				view.destroy();
				views.splice(i, 1);
				
				i --, length --;
			}
		}
		
		return true;
	}
	
	setInterval(cache.expire, 60000);
})();
