RandomClown / Anime Lighter

// ==UserScript==
// @name         Anime Lighter
// @namespace    horc.net
// @version      4.0.35
// @description  Filter for awesome anime trackers
// @author       RandomClown @ HoRC
// @license      MIT License
// @homepage     http://horc.bitbucket.org
// @icon         https://static.horc.net/app/anime-lighter/img/Logos/Anime%20Lighter.png?app=anime-lighter
// @grant        none
// @require      https://ajax.googleapis.com/ajax/libs/jquery/3.0.0/jquery.min.js
// @require      https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js
// @require      https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js
// @require      http://static.horc.net/app/anime-lighter/js/common.js
// @match        http://horriblesubs.info
// @match        http://www.nyaa.se/*
// @match        https://openuserjs.org/scripts/RandomClown/Anime_Lighter
// ==/UserScript==
//
//
//     Source code available: https://bitbucket.org/horc/anime-lighter/
//
//

//////////////////////////////////////////////////
////////          Const & Styles          ////////

const HAL_URL_MAIN = 'https://openuserjs.org/scripts/RandomClown/Anime_Lighter';
const HAL_URL_GIT = 'https://bitbucket.org/horc/anime-lighter/overview';

const HAL_SAD_FACE = ['=A=', 'óuò', 'T~T', '(゚Д゚;)'];

const STYLESHEET = `
	.horc-lighter .horc-button:not([disabled]):hover {
		box-shadow: 0 5px 11px 0 rgba(0, 0, 0, 0.18), 0 4px 15px 0 rgba(0, 0, 0, 0.15);
	}

	.horc-lighter .horc-button:not([disabled]):hover .horc-button-color {
		opacity: 0.75;
	}

	.material-icons {
		font-family: 'Material Icons';
		font-weight: normal;
		font-style: normal;
		font-size: 24px; /* Preferred icon size */
		display: inline-block;
		line-height: 1;
		text-transform: none;
		letter-spacing: normal;
		word-wrap: normal;
		white-space: nowrap;
		direction: ltr;
		/* Support for all WebKit browsers. */
		-webkit-font-smoothing: antialiased;
		/* Support for Safari and Chrome. */
		text-rendering: optimizeLegibility;
		/* Support for Firefox. */
		-moz-osx-font-smoothing: grayscale;
		/* Support for IE. */
		font-feature-settings: 'liga';
	}

	/******************************************************/
	/*      Materialize - Progress Bar  */
	/*      http://materializecss.com  */

	.materialize-progress {
		position: 'relative',
		height: '4px',
		display: 'block',
		width: '100%',
		borderRadius: '2px',
		margin: '0.5rem 0 1rem 0',
		overflow: 'hidden',
	}

		.materialize-progress .materialize-indeterminate {
		}

			.materialize-progress .materialize-indeterminate:before {
				content: '''',
				position: 'absolute',
				backgroundColor: 'inherit',
				top: '0',
				left: '0',
				bottom: '0',
				will-change: 'left, right',
				Webkit-animation: 'indeterminate 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite',
				animation: 'indeterminate 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite',
			}

			.materialize-progress .materialize-indeterminate:after {
				content: '''',
				position: 'absolute',
				backgroundColor: 'inherit',
				top: '0',
				left: '0',
				bottom: '0',
				will-change: 'left, right',
				Webkit-animation: 'indeterminate-short 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) infinite',
				animation: 'indeterminate-short 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) infinite',
				Webkit-animation-delay: '1.15s',
				animation-delay: '1.15s',
			}

	@Webkit-keyframes indeterminate {
		0% {
			left: '-35%',
			right: '100%',
		}

		60% {
			left: '100%',
			right: '-90%',
		}

		100% {
			left: '100%',
			right: '-90%',
		}
	}

	@keyframes indeterminate {
		0% {
			left: '-35%',
			right: '100%',
		}

		60% {
			left: '100%',
			right: '-90%',
		}

		100% {
			left: '100%',
			right: '-90%',
		}
	}
`;

const STYLE = {
	/////////////////////////
	////////    UI stuff

	CHIP: {
		fontSize: '0.9rem',
		display: 'inline-block',
		margin: '0.2rem',
		padding: '0.5rem 1rem',
		borderRadius: '2rem',
		backgroundColor: '#bdbdbd',
	},

	BUTTON: {
		display: 'inline-table',
		height: '2.5rem',
		margin: '0.25rem',
		borderRadius: '0.75rem',
		overflow: 'hidden',
		transition: 'box-shadow 0.5s ease, transform 0.3s ease',
		boxShadow: '0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12)',
		backgroundColor: '#ffffff',
		cursor: 'pointer',
		WebkitUserSelect: 'none',
		MozUserSelect: 'none',
		userSelect: 'none',
	},
	BUTTON__COLOR: {
		display: 'flex',
		alignItems: 'center',
		//height: 'calc(2.5rem - 2 * 0.5rem)',
		//padding: '0.5rem 1rem',
		//borderRadius: '0.75rem',
		height: '2.5rem',
		padding: 0,
		borderRadius: '2rem',
		transition: 'opacity 0.5s ease',
		opacity: 1,
	},
	BUTTON__INNER: {
		display: 'flex',
		alignItems: 'center',
		//height: 'calc(2.5rem - 2 * 0.5rem)',
		//padding: '0.5rem 1rem',
		//borderRadius: '0.75rem',
		height: '2.5rem',
		padding: 0,
		borderRadius: '2rem',
		transition: 'opacity 0.5s ease',
		opacity: 1,
	},

	CIRCLE: {
		width: '2.5rem',
		height: '2.5rem',
		borderRadius: '2rem',
	},

	ACTION_ICON: {
		borderRadius: '0.25rem',
		backgroundColor: 'rgba(0,0,0, 0.1)',
		cursor: 'pointer',
	},
	ACTION_ICON_NOTFIRST: {
		borderRadius: '0.25rem',
		backgroundColor: 'rgba(0,0,0, 0.1)',
		marginLeft: '0.25rem',
		cursor: 'pointer',
	},



	/////////////////////////
	////////    HAL stuff

	ANIME_LIGHTER: {
		fontFamily: 'Noto Sans',
		fontSize: '1rem',
		color: '#000000',
		backgroundColor: '#FFF8E1',
		margin: 0,
		padding: '0.5rem',
		borderRadius: '0.25rem',
	},


	PANEL_FILTER: {
		backgroundColor: '#FFF8E1',
		borderRadius: '0.25rem',
		marginTop: '0.5rem',
	},

	PANEL_FILTER__NAME: {
		fontSize: '1.15rem',
		letterSpacing: '-0.1rem',
		marginLeft: '0.25rem',
	},

	PANEL_FILTER__ITEM_NAME: {
		fontSize: '0.95rem',
		letterSpacing: '-0.05rem',
	},


	CONTEXT_MENU: {
		position: 'absolute',
		padding: '0.25rem 0.5rem',
		width: '24rem',
		boxShadow: '0 5px 11px 0 rgba(0, 0, 0, 0.18), 0 4px 15px 0 rgba(0, 0, 0, 0.15)',
		zIndex: '100',
	},

	CONTEXT_MENU__ENTRY: {
		transition: 'backgroundColor 0.3s ease',
	},


	HB_ANIME: {
		display: 'flex',
		flexFlow: 'column nowrap',
		margin: '0.5rem 0',
		backgroundColor: '#ffffff',
		borderRadius: '0.25rem',
		boxShadow: '0 5px 11px 0 rgba(0, 0, 0, 0.18), 0 4px 15px 0 rgba(0, 0, 0, 0.15)',
		backgroundSize: 'cover',
	},

	HB_ANIME__LIGHTEN_BACKGROUND: {
		padding: '1rem',
		backgroundColor: 'rgba(255,255,255, 0.75)',
	},

	HB_ANIME__CONTENT: {
		fontSize: '0.9em',
		padding: '0.2rem', /* !!! */
	},

	HB_ANIME__TITLE: {
		fontSize: '1.1em',
		fontWeight: 'bold',
		paddingBottom: '0.2rem',
	},

	HB_ANIME__ALT_TITLE: {
		color: '#606060',
		padding: '0.2rem',
		paddingLeft: '1rem',
	},

	HB_ANIME__META_BULLET: {
		padding: '0 0.5rem',
	},
};

////////          Const & Styles          ////////
//////////////////////////////////////////////////
//////////////////////////////////////////////////
////////              Loader              ////////

///	Dependencies:
/// <reference path="https://ajax.googleapis.com/ajax/libs/jquery/3.0.0/jquery.min.js" />

if (location.host !== 'openuserjs.org') {
	//	Anime Lighter App

	$('<style>').html(STYLESHEET).appendTo(document.head);

	Promise.all([
		loadstyle('https://fonts.googleapis.com/icon?family=Material+Icons'),
		loadstyle('https://fonts.googleapis.com/css?family=Noto+Sans'),
	]);
} else {
	//	Anime Lighter on OpenUserJS

	function new_panel() {
		return $('<div class="panel panel-default"><div class="panel-heading"><div class="panel-title"></div></div><div class="panel-body"></div></div>').insertBefore($('.panel:contains("Rating")'));
	}

	//	Like me!
	$(document).ready(() => {
		const $panel = new_panel();
		const $title = $panel.find('.panel-title');
		const $content = $panel.find('.panel-body');

		$title.html('<img style="height: 1.1em;" src="' + HAL_IMG_LOGO_ALC + '" /> Enjoy Anime Lighter?');

		$content.append('<p>Share your enjoyment.</p>');

		(() => { // Google Community
			$content.append('<div style="margin: 0.75rem 0;"><a href="https://plus.google.com/communities/104828447132071515050"><img style="height: 24px;" src="' + HAL_IMG_LOGO_GOOGLE + '" /></a> <a href="https://plus.google.com/communities/104828447132071515050">Google+ Community</a></div>');
		})();

		(() => { // Google
			$content.append('<script src="https://apis.google.com/js/platform.js" async defer>{parsetags: \'explicit\'}</script>');
			$content.append('<div style="margin: 0.5rem 0;" class="g-plusone" data-annotation="inline" data-href="https://openuserjs.org/scripts/RandomClown/Anime_Lighter"></div>');
		})();

		(() => { // Facebook
			(function (d, s, id) {
				var js, fjs = d.getElementsByTagName(s)[0];
				if (d.getElementById(id)) return;
				js = d.createElement(s); js.id = id;
				js.src = "//connect.facebook.net/en_US/sdk.js#xfbml=1&version=v2.7";
				fjs.parentNode.insertBefore(js, fjs);
			}(document, 'script', 'facebook-jssdk'));
			$content.append('<div style="margin: 0.5rem 0;" id="fb-root"></div>');
			$content.append('<div class="fb-like" data-href="https://openuserjs.org/scripts/RandomClown/Anime_Lighter" data-layout="standard" data-action="like" data-size="small" data-show-faces="true" data-share="false"></div>');
		})();
	});

	/*
	//	Disqus
	(() => {
		const $panel = new_panel();
		const $title = $panel.find('.panel-title');
		const $content = $panel.find('.panel-body');

		$title.html('<img style="height: 1.1em;" src="" /> Disqus');

		$content.append('<div id="disqus" style="background-color: #0d47a1;"><div id="disqus_thread" class="content"></div></div>');
		$content.append(`<script>var disqus_identifier = 'horc';var disqus_url = 'http://horc.net';var disqus_shortname = 'horc';(function () { var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true; dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js'; (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq); })();</script>`);
	})();
	*/
}

function loadscript(url) {
	return new Promise(function (resolve, reject) {
		var scripts = document.getElementsByTagName('script');
		for (var i = 0; i < scripts.length; ++i) {
			if (scripts[i].src === url) {
				resolve();
				return;
			}
		}

		var e = document.createElement('script');
		e.src = url;
		e.onload = function () {
			resolve();
		}
		e.onerror = function () {
			e.remove();
			reject('Failed to load: ' + url);
		}
		document.head.appendChild(e);
	});
}
function loadstyle(url) {
	return new Promise(function (resolve, reject) {
		var links = document.getElementsByTagName('link');
		for (var i = 0; i < links.length; ++i) {
			if (links[i].href === url) {
				resolve();
				return;
			}
		}


		var e = document.createElement('link');
		e.rel = 'stylesheet';
		e.type = 'text/css';
		e.href = url;
		e.onload = function () {
			resolve();
		}
		e.onerror = function () {
			e.remove();
			reject('Failed to load: ' + url);
		}
		document.head.appendChild(e);
	});
}

////////              Loader              ////////
//////////////////////////////////////////////////
//////////////////////////////////////////////////
////////               Host               ////////

///	Dependencies:
/// <reference path="https://ajax.googleapis.com/ajax/libs/jquery/3.0.0/jquery.min.js" />

switch (window.location.host) {
	case 'horriblesubs.info':
		document.HAL = function () {
			this.name = 'HorribleSubs';


			//		[currently unimplemented]
			//	Code to insert HAL mounting positions
			this.createPositions = () => { //	Create possible UI positions
				const $viewport = $('<div id="hal-viewport"></div>');
				this.viewport = $viewport[0];

				$('<div class="hal-spot">').insertBefore($('h2:contains("Releases")'));
				$('<div class="hal-spot">').insertAfter($('.episodecontainer'));
				$('<div class="hal-spot">').prependTo($('#sidebar'));
				$('<div class="hal-spot hal-default">').insertAfter($('#text-16'));
				$('<div class="hal-spot">').insertAfter($('#text-8'));
				$('<div class="hal-spot">').appendTo($('#sidebar'));

				$('.hal-default').append($viewport);
			};


			//	Magic code that needs to be run on this host
			this.run = () => {
				//	Find every way to update content

				var refresh = default_dynamic_content_refresh;
				$(document).ready(refresh);


				var refresh_enter = (e) => { if (e.which == 13) refresh(); };
				var refresh_click = (e) => { refresh(); };
				$('.searchbar').on('keyup', refresh_enter);
				$('.refreshbutton').on('keyup', refresh_enter);
				$('.refreshbutton').on('mouseup', refresh_click);
				$('.morebox').on('keyup', '.morebutton, .searchmorebutton', refresh_enter);
				$('.morebox').on('mouseup', '.morebutton, .searchmorebutton', refresh_click);
			};


			//	Stringified version of my personal styles
			this.default_filters = JSON.stringify({
				"b806197c42c3c2ba": {
					"name": "Watch", "enabled": true, "show": true, "order": "1", "style": ".episodecontainer .release-info.hal-$(filter-id) {\n\tfont-weight: bold;\n}"
				},
				"f60287e70cd7b38a": {
					"name": "Meh", "enabled": true, "show": false, "order": "2", "style": ".episodecontainer .release-info.hal-$(filter-id) {\n\topacity: 0.5;   /* makes it transparent */\n}"
				},
				"e7abf1bf3e855f5a": {
					"name": "Drop", "enabled": true, "show": false, "order": "3", "style": ".episodecontainer .release-info.hal-$(filter-id) {\n\tdisplay: none;   /* hides the entry */\n}"
				}
			});


			//	Format of CSS for this host
			this.default_styles = '.episodecontainer .release-info.hal-$(filter-id) {\n$(body)\n}';


			//	CSS selectors for the important bits
			const S = this.selectors = {
				list: '.episodecontainer',
				item: '.release-info',
				_title: '.rls-label',
				_number: '.rls-label',
			};


			//	Javascript to operate the selectors above
			const F = this.filters = {
				//	Listing container
				getList: () => {
					return $(S.list);
				},

				//	Episode item [in container]
				getItem: ($list) => {
					return $list.find(S.item);
				},

				//	Episode title [in item]
				getTitle: ($item) => {
					const contents = $item.find(S._title).contents();
					if (1 < contents.length) {
						//	Episode has a HS link
						//		<td class="rls-label">
						//			(08/21)
						//			<a>title</a>
						//			- 07
						//		</td>
						return contents[1].innerHTML.trim();
					} else {
						//	Episode does not a HS link
						//		<td class="rls-label">
						//			(08/21) title - 07
						//		</td>
						return contents.text().replace(/^\([^\(]*\) (.*?) -[^-]*$/, '$1').trim();
					}
				},

				//	Episode number [in item]
				getNumber: ($item) => {
					const contents = $item.find(S._title).contents();
					if (1 < contents.length) {
						//	Episode has a HS link
						//		<td class="rls-label">
						//			(08/21)
						//			<a>title</a>
						//			- 07
						//		</td>
						return contents[1].innerHTML.trim();
					} else {
						//	Episode does not a HS link
						//		<td class="rls-label">
						//			(08/21) title - 07
						//		</td>
						return contents.text().replace(/.*?([^-]*)$/, '$1').trim();
					}
					return $item.find(S._number).contents()[2].wholeText.replace(/-/, '').trim();
				},

				//	Unprocessed text for the bookmark
				getRaw: ($item) => {
					return $item.find(S._title).text();
				},
			};


			//	All episodes & their element
			this.parse_episodes = default_parse_episodes;


			this.insert_bookmark = function ($item) {
				if ($item.find('.hal-bookmark').length) return;


				const $bookmark = $('<i class="hal-bookmark material-icons">bookmark</i>')
					.css('width', '24px')
					.css('margin-right', '-24px')
					.css('vertical-align', 'middle')
					.css('pointer-events', 'none');


				//	HorribleSubs represents an item with a table.
				//	Find the last <td> & insert the bookmark
				$item.find('td:last').append($bookmark);
			};
		};
		break;
	case 'www.nyaa.se':
		'.tlist'
		'.tlistrow'
		break;
}

//	Generic function to get all episodes & their DOM element in 
function default_parse_episodes() {
	const F = document.HAL.filters;

	const results = [];
	const $list = F.getList();
	const $items = F.getItem($list);

	$items.map((i, item) => {
		const $item = $(item).addClass('hal-item');
		const title = F.getTitle($item);
		const number = F.getNumber($item);
		const raw = F.getRaw($item);

		results.push({
			title: title,
			clean: cleanTitle(title),
			number: number,
			element: item,
			raw: raw,
		});
	});

	return results;
}
function default_dynamic_content_refresh() {
	function hasContentChanged() {
		return content !== content_since_update || element !== element_since_update;
	}
	function shouldHALUpdate() {
		return hal_update_timeout <= hal_update_timer;
	}
	function hasNetworkFinished() {
		return network_timeout <= network_timer;
	}


	const F = document.HAL.filters;
	const check_interval = 50;      // ms
	const hal_update_timeout = 200; // ms - until updating react
	const network_timeout = 8000;   // ms - network timeout
	var hal_update_timer = 0;       // ms - max time until refresh
	var network_timer = 0;          // ms - max time until stop
	var content = '';               // content - text data to compare
	var element = '';               // element - HTML element to compare (since content is not enough)
	var content_since_update = '';  // content - since last HAL update
	var element_since_update = '';  // element - since last HAL update


	console.log('Refreshing HAL');


	clearInterval(document.HAL.interval_refresh);
	document.HAL.interval_refresh = setInterval(() => {
		const list = F.getList();
		content = list.text();
		element = F.getItem(list).filter(':first')[0];


		if (hasContentChanged(content)) {
			if (shouldHALUpdate(content)) {
				$(document).trigger('hal-refresh');

				console.log(' *');

				content_since_update = content;
				element_since_update = element;

				hal_update_timer = 0;
			}

			network_timer = 0;
		}

		if (hasNetworkFinished()) {
			clearInterval(document.HAL.interval_refresh);
			document.HAL.interval_refresh = null;
		}


		//	Increment timers
		hal_update_timer += check_interval;
		network_timer += check_interval;
	}, check_interval);
}

////////               Host               ////////
//////////////////////////////////////////////////
//////////////////////////////////////////////////
////////        HoRC Anime Lighter        ////////

/// <reference path="https://ajax.googleapis.com/ajax/libs/jquery/3.0.0/jquery.min.js" />
/// <reference path="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.js" />
/// <reference path="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.js" />
/// <reference path="js/setup.js" />

/*

	To do:

		fix load bug. HAL loads faster than the page so episodes are not highlighted

		episode item needs to be interactable. right click to open, similar to filters
		needs: [move] [remove]

		inline all styles possible into react

		should all set an expire date (new requests after the date)
		& auto cleanup (if near 10mb):
			- storage__anime         (5d)
			- storage__search_slug   (7d)
			- storage__search_title  (7d)

*/

//    Wait for jQuery
'use strict';

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var HAL_loading = setInterval(function () {
	if (typeof $ === 'undefined' || !$(document).jquery) return;
	clearInterval(HAL_loading);

	//	Load site module
	if (document.HAL === undefined) throw 'Failed to load any HAL module';
	document.HAL = new document.HAL();

	document.HAL.createPositions();
	document.HAL.run();

	console.log('	Host: ' + window.location.host);
	console.log('Loaded HAL module for: ' + document.HAL.name);

	//    Run main module
	setTimeout(function () {
		animelighter_render(); // render once to catch early mistakes
		function animelighter_render() {
			ReactDOM.render(React.createElement(AnimeLighter, null), document.HAL.viewport);
		}
		function animelighter_panic() {
			clearInterval(animelighter_interval);
			console.warn('HoRC Anime Lighter had too many fatal errors. Stopping.');
			animelighter_render(); // run once more to produce a stack trace
		}
		var animelighter_error_count = 0;
		var animelighter_interval = setInterval(function () {
			try {
				animelighter_render();

				//	Successful, so reduce error count
				if (0 < animelighter_error_count) {
					animelighter_error_count--;
				}
			} catch (err) {
				if (animelighter_error_count === 0) console.warn('HoRC Anime Lighter hit an error. Continuing for now.');
				console.warn(err);

				//	Failure, so increase error count
				animelighter_error_count += 1;

				//	If it's crashing every loop, then stop
				if (5 <= animelighter_error_count) {
					animelighter_panic();
				}
			}
		}, 42);
	}, 0);
}, 100);

/////////////////////////////////////////
////    JavaScript Storage Helpers

function storage_get_slug(title) {
	return sget(localStorage, 'hal-s-' + title, '');
}
function storage_set_slug(title, data) {
	return sset(localStorage, 'hal-s-' + title, data);
}
function storage_get_anime(slug) {
	return JSON.parse(sget(localStorage, 'hal-a-' + slug, '{}'));
}
function storage_set_anime(slug, data) {
	return JSON.parse(sset(localStorage, 'hal-a-' + slug, JSON.stringify(data)));
	return data;
}
function storage_get_filters() {
	return JSON.parse(sget(localStorage, 'hal-filters', document.HAL.default_filters));
}
function storage_set_filters(data) {
	return JSON.parse(sset(localStorage, 'hal-filters', JSON.stringify(data)));
	return data;
}
function storage_get_settings() {
	return JSON.parse(sget(localStorage, 'hal-settings', '{}'));
}
function storage_set_settings(data) {
	return JSON.parse(sset(localStorage, 'hal-settings', JSON.stringify(data)));
	return data;
}
function storage_get_bookmark() {
	return sget(localStorage, 'hal-bookmark-title', '');
}
function storage_set_bookmark(data) {
	return sset(localStorage, 'hal-bookmark-title', data);
	return data;
}
function storage_get_search_slug(slug) {
	return JSON.parse(sget(localStorage, 'hal-search-s-' + slug, '[]'));
}
function storage_set_search_slug(slug, data) {
	return JSON.parse(sset(localStorage, 'hal-search-s-' + slug, JSON.stringify(data)));
	return data;
}
function storage_get_search_title(title) {
	return JSON.parse(sget(sessionStorage, 'hal-search-t-' + title, '[]'));
}
function storage_set_search_title(title, data) {
	return JSON.parse(sset(sessionStorage, 'hal-search-t-' + title, JSON.stringify(data)));
	return data;
}
function parse_missing_image(url) {
	if (-1 < url.search('/missing.png')) return;
	if (-1 < url.search('/missing-anime-cover')) return;
	return url;
}

/////////////////////////////////////////
////    Anime Lighter

var AnimeLighter = React.createClass({
	displayName: 'AnimeLighter',

	getInitialState: function getInitialState() {
		var state = {
			filters: storage_get_filters(),
			host_episodes: [],

			settings: storage_get_settings(),

			bookmark_episode: '',

			context_menu_open: false,
			context_menu_x: 0,
			context_menu_y: 0,
			context_selected_host_episode: ''
		};

		if (typeof state.settings.bookmark_enabled) state.settings.bookmark_enabled = true;

		return state;
	},

	componentDidMount: function componentDidMount() {
		var _this = this;

		//	Add external refresh listener
		$(document).on('hal-refresh', this.on_refresh_episodes);
		this.on_refresh_episodes();

		//	Temporary save/load
		document.HAL['import'] = function () {
			$('body').css('transition', 'background-color 0.3s ease');
			$('body').css('background-color', '#ffffff');

			var $import = $('<textarea>').appendTo($('body').empty()).css('width', '40rem').css('height', '40rem').css('font-family', 'Consolas, monospace').attr('placeholder', 'Paste the Anime Lighter data to import').on('keyup', function () {
				try {
					var data = JSON.parse($import.val());

					if (Object['typeof'](data) !== 'object') {
						$('body').css('background-color', '#ffe082');
						return;
					}
					if (!Object.keys(data).length) {
						$('body').css('background-color', '#ffe082');
						return;
					}

					//	Delete current settnigs
					for (var key in localStorage) {
						if (key.substr(0, 4) !== 'hal-') continue;
						localStorage.removeItem(key);
					}

					//	Load new settings
					for (var key in data) {
						var value = data[key];
						localStorage.setItem(key, value);
					}

					$('body').css('background-color', '#a5d6a7');
				} catch (e) {
					$('body').css('background-color', '#ef9a9a');
				}
			});
		};
		document.HAL['export'] = function () {
			var data = {};

			for (var key in localStorage) {
				var value = localStorage[key];

				if (key.substr(0, 4) !== 'hal-') continue;
				if (key.substr(0, 10) === 'hal-search') continue;

				data[key] = value;
			}

			$('<pre>').html(JSON.stringify(data, null, '\t')).appendTo($('body').empty());
		};

		//	Bookmark stuff
		//		delegate from document:
		//	bookmark dragging
		//	hal-item drop zone & triggers set_bookmark here

		//	Context menu stuff
		(function () {
			var S = document.HAL.selectors;
			var F = document.HAL.filters;

			//	Add context menu listener
			$(document).on('contextmenu', S.list + ' ' + S.item, function (e) {
				if (e.ctrlKey) return;

				e.preventDefault();

				//	From right click, find item's root
				var $item = $(e.target);
				if (!$item.is(S.item)) $item = $item.closest(S.item);
				if (!$item.is(S.item)) throw '$(document).on(contextmenu): bad selector for S.item';

				//	Find in array
				var host_episode = {};
				for (var i in _this.state.host_episodes) {
					host_episode = _this.state.host_episodes[i];
					if (host_episode.element === $item[0]) {
						_this.setState({
							context_selected_host_episode: host_episode
						});
						break;
					}
				}

				//	Move the menu
				var x = e.clientX;
				var y = $item.position().top + 16;
				if (x < 8) x = 8;

				//const slug = storage_get_slug(host_episode.clean);
				//const anime = slug ? storage_get_anime(slug) : {};
				_this.setState({
					context_menu_open: true,
					context_menu_x: x,
					context_menu_y: y
				});
			});

			//	Block menu events on the menu
			$(document).on('contextmenu click mousedown touchstart', '.horc-context-menu', function (e) {
				e.stopPropagation();
			});

			//	Close event : Click out
			$(document).on('click mousedown touchstart', function (e) {
				//	if a horc-button, dont close
				if ($(e.target).closest('.horc-button').length) {
					e.stopPropagation();
				} else {
					_this.setState({ context_menu_open: false });
				}
			});

			//	Close event : Escape key
			$(document).on('keydown', function (e) {
				if (CODE_KEY[e.which] === 'esc') {
					_this.setState({ context_menu_open: false });
				}
			});
		})();
	},
	componentWillUnmount: function componentWillUnmount() {
		//	Delete event listeners
		$(document).off('hal-refresh');

		$(document).off('contextmenu');
		$(document).off('click mousedown touchstart');
	},

	on_refresh_episodes: function on_refresh_episodes() {
		var _this2 = this;

		var host_episodes = document.HAL.parse_episodes();
		var bookmark_episode = storage_get_bookmark();

		//	Mapping on the host_episode object
		host_episodes.map(function (host_episode, i) {
			//	Cache slug & anime object if known
			host_episode.slug = storage_get_slug(host_episode.clean);
			host_episode.anime = storage_get_anime(host_episode.slug);

			//	Check if bookmarked
			host_episode.bookmark = host_episode.raw === bookmark_episode;

			//	Update highlighting
			_this2.on_episode_update_highlight(host_episode);
		});

		this.setState({
			host_episodes: host_episodes,
			bookmark_episode: bookmark_episode
		});
	},

	on_episode_update_highlight: function on_episode_update_highlight(host_episode) {
		var element = host_episode.element;
		var $item = $(element);
		var slug = host_episode.slug;
		var filter = host_episode.anime.filter;

		//	Apply bookmark
		if (host_episode.bookmark) {
			document.HAL.insert_bookmark($item);
		} else {
			$item.find('.hal-bookmark').remove();
		}

		//	Apply filter style

		if (!slug || !filter) {
			var _attr = element.getAttribute('data-hal-filter');
			if (_attr) {
				element.setAttribute('data-hal-filter', '');
				$(element).removeClass('hal-' + _attr);
			}
			return;
		}

		var attr = element.getAttribute('data-hal-filter');
		if (attr !== filter) {
			element.setAttribute('data-hal-filter', filter);
			$(element).removeClass('hal-' + attr);
			$(element).addClass('hal-' + filter);
		}
	},

	on_set_bookmark: function on_set_bookmark(host_episode, state) {
		if (typeof state !== 'boolean') state = true;

		if (state) {
			storage_set_bookmark(host_episode.raw);
		} else {
			storage_set_bookmark('');
		}

		this.on_refresh_episodes();
	},

	on_set_filters: function on_set_filters(data) {
		storage_set_filters(data);
		this.setState({
			filters: data
		});
	},

	on_set_slug: function on_set_slug(host_episode, slug) {
		host_episode.slug = slug;
		storage_set_slug(host_episode.clean, slug);

		this.on_episode_update_highlight(host_episode);

		this.setState({
			context_selected_slug: host_episode.slug
		});

		this.on_refresh_episodes();
	},
	on_set_anime: function on_set_anime(host_episode, anime) {
		host_episode.anime = anime;
		storage_set_anime(host_episode.slug, anime);

		this.on_episode_update_highlight(host_episode);

		this.setState({
			context_selected_anime: host_episode.anime
		});

		this.on_refresh_episodes();
	},

	render: function render() {
		return React.createElement(
			'div',
			{ className: 'horc-lighter',
				style: STYLE.ANIME_LIGHTER },
			React.createElement(
				'div',
				null,
				React.createElement(TitleBar, null),
				React.createElement(Filters, { filters: this.state.filters,
					host_episodes: this.state.host_episodes,
					on_set_filters: this.on_set_filters })
			),
			this.state.context_menu_open ? React.createElement(ContextMenu, { menu_x: this.state.context_menu_x,
				menu_y: this.state.context_menu_y,
				host_episode: this.state.context_selected_host_episode,
				filters: this.state.filters,

				bookmark_episode: this.state.bookmark_episode,
				on_set_bookmark: this.on_set_bookmark,

				on_set_slug: this.on_set_slug,
				on_set_anime: this.on_set_anime,
				on_set_filters: this.on_set_filters,
				on_episode_update_highlight: this.on_episode_update_highlight }) : null
		);
	}
});

var TitleBar = React.createClass({
	displayName: 'TitleBar',

	open_settings: function open_settings(e) {
		e.preventDefault();

		this.props.on_open_settings();
	},

	render: function render() {
		return React.createElement(
			'div',
			{ className: 'horc-titlebar' },
			React.createElement(
				'div',
				{ style: {
						display: 'flex',
						flexFlow: 'row nowrap',
						alignItems: 'center'
					} },
				React.createElement(
					CircleButton,
					{ color: '#607D8B', href: HAL_URL_MAIN },
					React.createElement('img', { className: 'horc-logo', src: HAL_IMG_LOGO_ANIMELIGHTER })
				),
				React.createElement(
					'div',
					{ style: {
							flexGrow: '1',
							fontSize: '1.75rem',
							letterSpacing: '-0.1rem',
							paddingLeft: '0.25rem'
						} },
					'Lighter'
				)
			)
		);
	}
});

var Filters = React.createClass({
	displayName: 'Filters',

	getInitialState: function getInitialState() {
		return {
			settings_open: false
		};
	},

	on_set_filter: function on_set_filter(filter_id, new_settings) {
		var new_filters = _extends({}, this.props.filters);

		if (new_settings) {
			new_filters[filter_id] = new_settings;
		} else {
			delete new_filters[filter_id];
		}

		this.props.on_set_filters(new_filters);
	},

	open_settings: function open_settings() {
		this.setState({
			settings_open: !this.state.settings_open
		});
	},

	render: function render() {
		var _this3 = this;

		return React.createElement(
			'div',
			{ ref: 'filters',
				className: 'horc-filters',
				style: {
					display: 'flex',
					flexFlow: 'column'
				} },
			React.createElement(
				'div',
				{ style: {
						marginTop: '-24px',
						display: 'flex'
					} },
				React.createElement('div', { style: { flexGrow: 100 } }),
				React.createElement(
					'i',
					{ className: 'material-icons',
						style: STYLE.ACTION_ICON,
						onClick: this.open_settings },
					this.state.settings_open ? 'done' : 'settings'
				)
			),
			Object.keys(this.props.filters).map(function (id, i) {
				var filter = _this3.props.filters[id];
				return React.createElement(Filter, { key: i,
					id: id,
					filter: filter,
					host_episodes: _this3.props.host_episodes,
					settings_open: _this3.state.settings_open,
					on_set_filter: _this3.on_set_filter });
			})
		);
	}
});

var Filter = React.createClass({
	displayName: 'Filter',

	getInitialState: function getInitialState() {
		return {
			list_open: false, // list open state
			name_edit_box_open: false,
			style_edit_box_open: false
		};
	},

	componentWillMount: function componentWillMount() {
		this.temp_name = this.props.filter.name;
	},
	componentDidUpdate: function componentDidUpdate(prevProps) {
		if (this.props.filter.name !== prevProps.filter.name) {
			this.temp_slug = this.props.slug;
		}
	},

	on_enabled: function on_enabled(e) {
		e.preventDefault();

		this.props.on_set_filter(this.props.id, _extends({}, this.props.filter, {
			enabled: !this.props.filter.enabled
		}));
	},
	on_show: function on_show(e) {
		e.preventDefault();

		this.props.on_set_filter(this.props.id, _extends({}, this.props.filter, {
			show: !this.props.filter.show
		}));
	},
	on_edit: function on_edit(e) {
		e.preventDefault();

		var new_name = ReactDOM.findDOMNode(this.refs.name).value;
		var new_order = ReactDOM.findDOMNode(this.refs.order).value;
		var new_style = ReactDOM.findDOMNode(this.refs.style).value;

		this.props.on_set_filter(this.props.id, _extends({}, this.props.filter, {
			name: new_name,
			order: new_order,
			style: new_style
		}));

		this.temp_name = new_name;
	},
	on_delete: function on_delete(e) {
		e.preventDefault();

		if (confirm('Delete "' + this.props.filter.name + '"?')) {
			this.props.on_set_filter(this.props.id, null);
		}
	},

	on_open_name_edit_box: function on_open_name_edit_box(e) {
		e.preventDefault();

		this.setState({
			name_edit_box_open: !this.state.name_edit_box_open
		});
	},

	on_open_style_edit_box: function on_open_style_edit_box(e) {
		e.preventDefault();

		this.setState({
			style_edit_box_open: !this.state.style_edit_box_open
		});
	},

	on_style_box_save: function on_style_box_save(e) {
		if (e.ctrlKey && CODE_KEY[e.which] === 's') {
			e.preventDefault();

			var new_style = ReactDOM.findDOMNode(this.refs.style).value;

			this.props.on_set_filter(this.props.id, _extends({}, this.props.filter, {
				style: new_style
			}));
		}
	},

	render: function render() {
		var _this4 = this;

		var component_episodes = null;
		var component_filters = null;

		if (this.props.settings_open && this.state.name_edit_box_open) {
			component_filters = React.createElement(
				'form',
				{ key: 'form', onSubmit: this.on_edit },
				React.createElement(
					'div',
					null,
					React.createElement('input', { ref: 'name',
						type: 'text',
						style: {
							minWidth: '8rem',
							maxWidth: '16rem',
							width: '70%',
							backgroundColor: this.temp_name === this.props.filter.name ? null : '#fff9c4'
						},
						placeholder: 'New name',
						defaultValue: this.props.filter.name,
						onChange: function (e) {
							return _this4.temp_name = e.target.value;
						},
						required: true }),
					React.createElement('input', { ref: 'order',
						type: 'text',
						style: {
							width: '2.1rem'
						},
						placeholder: 'Order',
						defaultValue: this.props.filter.order,
						pattern: '\\d{1,3}' })
				),
				React.createElement(
					'div',
					null,
					React.createElement('textarea', { ref: 'style',
						style: {
							fontSize: '0.6rem',
							width: '100%',
							marginTop: '0.25rem',
							marginBottom: '0.25rem'
						},
						placeholder: 'Styles to apply',
						defaultValue: this.props.filter.style,
						onKeyDown: this.on_style_box_save })
				),
				React.createElement('input', { type: 'submit', style: { display: 'none' } })
			);
		}

		if (this.props.filter.show) {
			var seen_episodes = {};
			component_episodes = this.props.host_episodes.map(function (host_episode, i) {
				var slug = host_episode.slug;
				var filter = host_episode.anime.filter;

				//	Nothing set, so it's in no list
				if (!slug || !filter) return;

				//	Skip if seen this slug before (removes duplicates within the same list)
				if (seen_episodes[slug]) return;
				//	Mark it as seen
				seen_episodes[slug] = true;

				//	Check if in this filter
				if (filter !== _this4.props.id) return;

				return React.createElement(FilteredItem, { key: i,
					host_episode: host_episode });
			});
		}

		return React.createElement(
			'div',
			{
				className: 'horc-filter',
				style: _extends({}, STYLE.PANEL_FILTER, {
					order: this.props.filter.order
				}) },
			React.createElement(
				'div',
				{ className: 'horc-small-actions',
					style: {
						display: 'flex',
						flexFlow: 'row wrap',
						alignItems: 'center'
					} },
				React.createElement(
					'i',
					{ className: 'material-icons',
						style: STYLE.ACTION_ICON_NOTFIRST,
						onClick: this.on_show },
					this.props.filter.show ? 'expand_more' : 'chevron_right'
				),
				React.createElement(
					'div',
					{ className: 'horc-name',
						style: STYLE.PANEL_FILTER__NAME },
					this.props.filter.name
				),
				React.createElement('div', { style: { flexGrow: 100 } }),
				!this.props.settings_open ? React.createElement(
					'i',
					{ className: 'material-icons',
						style: STYLE.ACTION_ICON_NOTFIRST,
						onClick: this.on_enabled },
					this.props.filter.enabled ? 'label' : 'label_outline'
				) : null,
				this.props.settings_open ? React.createElement(
					'i',
					{ className: 'material-icons',
						style: STYLE.ACTION_ICON_NOTFIRST,
						onClick: this.on_open_name_edit_box },
					'mode_edit'
				) : null,
				this.props.settings_open ? React.createElement(
					'i',
					{ className: 'material-icons',
						style: STYLE.ACTION_ICON_NOTFIRST,
						onClick: this.on_delete },
					'delete'
				) : null
			),
			component_filters,
			React.createElement(
				'div',
				{ style: {
						display: 'flex',
						flexFlow: 'column nowrap'
					} },
				component_episodes
			),
			this.props.filter.enabled ? React.createElement(
				'style',
				{ 'data-hal-filter': this.props.filter.name },
				this.props.filter.style.replace(/\$\(filter-id\)/g, this.props.id)
			) : null
		);
	}
});

var FilteredItem = React.createClass({
	displayName: 'FilteredItem',

	render: function render() {
		return React.createElement(
			'div',
			{ style: STYLE.PANEL_FILTER__ITEM_NAME },
			this.props.host_episode.title
		);
	}
});

/////////////////////////////////////////
////    Context Menu

var ContextMenu = React.createClass({
	displayName: 'ContextMenu',

	on_set_slug: function on_set_slug(slug) {
		this.props.on_set_slug(this.props.host_episode, slug);
	},

	on_set_bookmark: function on_set_bookmark(e) {
		e.preventDefault();

		var bookmarked = this.props.host_episode.raw === this.props.bookmark_episode;

		this.props.on_set_bookmark(this.props.host_episode, !bookmarked);
	},

	on_new_filter: function on_new_filter(filter_name) {
		//	Check if exists
		for (var fid in this.props.filters) {
			if (this.props.filters[fid].name === filter_name) {
				return;
			}
		}

		//	Generate a new ID
		var id;
		for (id = Number.randHex(); (id in this.props.filters); id = Number.randHex()); // generate an ID

		var new_filter = {};
		new_filter[id] = {
			'name': filter_name,
			'enabled': true,
			'show': true,
			'order': '',
			'style': document.HAL.default_styles.replace('$(body)', '	font-weight: bold;')
		};

		var new_filters = Object.assign({}, this.props.filters, new_filter);
		this.props.on_set_filters(new_filters);
	},
	on_choose_filter: function on_choose_filter(filter_id) {
		var anime = _extends({}, this.props.host_episode.anime);
		if (anime['filter'] === filter_id) {
			delete anime['filter'];
		} else {
			anime['filter'] = filter_id;
		}
		this.props.on_set_anime(this.props.host_episode, anime);
	},

	render: function render() {
		var component_filters = [];
		var component_content = null;

		var bookmarked = this.props.host_episode.raw === this.props.bookmark_episode;

		//	Assemble filter components
		if (this.props.host_episode.slug) {
			for (var id in this.props.filters) {
				var filter = this.props.filters[id];

				component_filters.push(React.createElement(ContextMenuFilter, { key: id,
					id: id,
					host_episode: this.props.host_episode,
					filter: filter,
					on_choose_filter: this.on_choose_filter,
					on_episode_update_highlight: this.props.on_episode_update_highlight }));
			}
			if (!component_filters.length) {
				component_filters.push(React.createElement(
					'div',
					{ key: 'empty',
						style: STYLE.CONTEXT_MENU__ENTRY },
					React.createElement(
						'i',
						null,
						'No filters defined'
					)
				));
			}
		}

		//	Assemble content without slug
		if (this.props.host_episode.slug) {
			component_content = React.createElement(
				'div',
				{ style: {
						display: 'flex',
						flexFlow: 'column'
					} },
				React.createElement(
					'div',
					{ style: {
							display: 'flex',
							flexFlow: 'column'
						} },
					component_filters
				),
				React.createElement(ContextMenuFilter, _extends({}, this.props, {
					style: STYLE.CONTEXT_MENU__ENTRY,
					host_episode: this.props.host_episode,
					on_new_filter: this.on_new_filter,
					on_episode_update_highlight: this.props.on_episode_update_highlight })),
				React.createElement(HummingbirdChange, { host_episode: this.props.host_episode,
					on_set_slug: this.on_set_slug }),
				React.createElement(SearchHummingbird, { by: 'slug',
					host_episode: this.props.host_episode,
					on_set_slug: this.on_set_slug })
			);
		} else {
			component_content = React.createElement(
				'div',
				{ style: {
						display: 'flex',
						flexFlow: 'column'
					} },
				React.createElement(
					'div',
					{ style: {
							fontSize: '1.25rem',
							padding: '1rem',
							textAlign: 'center'
						} },
					'Which one is it?'
				),
				React.createElement(SearchHummingbird, { by: 'title',
					host_episode: this.props.host_episode,
					on_set_slug: this.on_set_slug })
			);
		}

		return React.createElement(
			'div',
			{ ref: 'menu',
				className: 'horc-context-menu',
				style: _extends({}, STYLE.CONTEXT_MENU, {
					top: this.props.menu_y,
					left: this.props.menu_x,
					backgroundColor: this.props.host_episode.slug ? '#ffffff' : '#e8eaf6'
				}) },
			React.createElement(
				'div',
				{ style: { display: 'flex', alignItems: 'center' } },
				React.createElement(
					'a',
					{ href: '#bookmark',
						onClick: this.on_set_bookmark },
					React.createElement(
						'i',
						{ className: 'material-icons' },
						bookmarked ? 'bookmark' : 'bookmark_border'
					)
				),
				React.createElement(
					'div',
					{ style: { flexGrow: 100, textAlign: 'center', fontWeight: 'bold' } },
					this.props.host_episode.title
				)
			),
			component_content
		);
	}
});

var ContextMenuFilter = React.createClass({
	displayName: 'ContextMenuFilter',

	on_new_filter: function on_new_filter(e) {
		e.preventDefault();

		var $name = ReactDOM.findDOMNode(this.refs.name);

		var value = $name.value.trim().replace(/\s+/g, ' ');
		$name.value = '';

		this.props.on_new_filter(value);
	},
	on_choose_filter: function on_choose_filter(e) {
		this.props.on_choose_filter(this.props.id);
		this.props.on_episode_update_highlight(this.props.host_episode);
	},

	render: function render() {
		if (this.props.filter) {
			var in_filter = false;
			if (this.props.host_episode.anime['filter'] && this.props.host_episode.anime['filter'] === this.props.id) in_filter = true;

			if (in_filter) {
				return React.createElement(
					'div',
					{ style: _extends({}, STYLE.CONTEXT_MENU__ENTRY, {
							order: this.props.filter.order,
							display: 'block',
							alignItems: 'center',
							padding: '0.25rem 1rem',
							borderBottom: '1px solid #cccccc',
							cursor: 'pointer'
						}),
						onClick: this.on_choose_filter },
					React.createElement(
						'a',
						{ style: {
								color: '#e64a19'
							},
							href: '#remove',
							onClick: function (e) {
								return e.preventDefault();
							} },
						React.createElement(
							'b',
							null,
							this.props.filter.name
						)
					)
				);
			} else {
				return React.createElement(
					'div',
					{ style: _extends({}, STYLE.CONTEXT_MENU__ENTRY, {
							order: this.props.filter.order,
							display: 'block',
							alignItems: 'center',
							padding: '0.25rem 1rem',
							borderBottom: '1px solid #cccccc',
							cursor: 'pointer'
						}),
						onClick: this.on_choose_filter },
					React.createElement(
						'a',
						{ style: {
								color: '#1976d2'
							},
							href: 'move',
							onClick: function (e) {
								return e.preventDefault();
							} },
						this.props.filter.name
					)
				);
			}
		} else {
			return React.createElement(
				'form',
				{ onSubmit: this.on_new_filter,
					style: _extends({}, STYLE.CONTEXT_MENU__ENTRY, {
						display: 'block',
						alignItems: 'center',
						padding: '0.25rem 1rem',
						borderBottom: '1px solid #cccccc'
					}) },
				React.createElement('input', { ref: 'name',
					type: 'text',
					placeholder: 'New personal filter',
					pattern: '\\s*[^\\s]+.*',
					required: true,
					style: { width: '100%' } })
			);
		}
	}
});

var HummingbirdChange = React.createClass({
	displayName: 'HummingbirdChange',

	componentWillMount: function componentWillMount() {
		this.temp_slug = this.props.host_episode.slug;
	},

	on_change_slug: function on_change_slug(e) {
		e.preventDefault();

		var slug = ReactDOM.findDOMNode(this.refs.slug).value;

		if (slug === this.props.host_episode.slug) return;

		this.temp_slug = slug;

		this.props.on_set_slug(slug);
	},

	render: function render() {
		var _this5 = this;

		var change_slug = 'hal-change-' + this.props.host_episode.slug;

		return React.createElement(
			'form',
			{ onSubmit: this.on_change_slug,
				style: {
					display: 'flex',
					flexFlow: 'row nowrap',
					alignItems: 'center',
					marginTop: '0.25rem'
				} },
			React.createElement(
				'div',
				{ style: { marginRight: '0.25rem' } },
				'Slug:'
			),
			' ',
			React.createElement('input', { ref: 'slug',
				type: 'text',
				placeholder: 'Clear the slug?',
				pattern: '[\\-\\w]*',
				defaultValue: this.props.host_episode.slug,
				style: {
					marginLeft: '0.5rem',
					width: '16rem',
					backgroundColor: this.temp_slug === this.props.host_episode.slug ? null : '#fff9c4'
				},
				onChange: function (e) {
					return _this5.temp_slug = e.target.value;
				},
				list: change_slug }),
			make_component_slug_links(this.props.host_episode.title),
			React.createElement(
				'datalist',
				{ ref: 'list', id: change_slug },
				React.createElement('option', { value: this.props.host_episode.slug })
			)
		);
	}
});

/////////////////////////////////////////
////    Bookmark

var Bookmark = React.createClass({
	displayName: 'Bookmark',

	render: function render() {
		return React.createElement(
			'div',
			{ className: 'horc-bookmark' },
			React.createElement('div', { className: 'horc-content' })
		);
	}
});

/////////////////////////////////////////
////    Hummingbird

//		Props:
//	title        |  The title to search by
//	slug         |  OR the slug to retrieve by
//	on_set_slug  |  To set the Hummingbird id
//	
//		States:
//	hummingbird_search_results  |  Results to display
var SearchHummingbird = React.createClass({
	displayName: 'SearchHummingbird',

	getInitialState: function getInitialState() {
		return {
			status: XHR_LOADING,
			hummingbird_search_results: [] };
	},

	// list of results returned from search
	componentDidMount: function componentDidMount() {
		this.mounted = true;
		this.on_hummingbird_search();

		this.last_slug = this.props.host_episode.slug;
		this.last_title = this.props.host_episode.title;
	},
	componentWillUnmount: function componentWillUnmount() {
		this.mounted = false;
	},
	componentDidUpdate: function componentDidUpdate(prevProps, prevState) {
		if (this.last_slug !== prevProps.host_episode.slug) {
			this.last_slug = prevProps.host_episode.slug;
			this.on_hummingbird_search();
		} else if (this.last_title !== prevProps.host_episode.title) {
			this.last_title = prevProps.host_episode.title;
			this.on_hummingbird_search();
		}
	},

	on_manual_set_slug: function on_manual_set_slug(e) {
		e.preventDefault();

		var slug = ReactDOM.findDOMNode(this.refs.slug).value;

		if (!slug.length) return;

		this.props.on_set_slug(slug);
	},

	on_hummingbird_search: function on_hummingbird_search() {
		if (this.props.by === 'slug') {
			this.on_hummingbird_search_slug();
		} else if (this.props.by === 'title') {
			this.on_hummingbird_search_title();
		}
	},
	on_hummingbird_search_slug: function on_hummingbird_search_slug() {
		var _this6 = this;

		if (!this.props.host_episode.slug) return;

		var slug = this.props.host_episode.slug;
		this.face = HAL_SAD_FACE[HAL_SAD_FACE.length * Math.random() | 0];

		var results = storage_get_search_slug(slug);
		if (results.length) {
			this.setState({
				status: XHR_OK, // its cached, so done.
				hummingbird_search_results: results
			});
		} else {
			this.setState({
				status: XHR_LOADING,
				hummingbird_search_results: []
			});

			xhr({
				url: 'https://hummingbird.horc.net/hummingbird.js',
				query: {
					by: 'slug',
					slug: slug.encode()
				}
			})['catch'](function (e) {
				if (_this6.mounted) {
					console.error(e);
					_this6.setState({
						status: e.status
					});
				}
			}).then(xhr.parse).then(function (res) {
				storage_set_search_slug(slug, res);

				// mounted & active, so update state
				if (_this6.mounted && slug === _this6.props.host_episode.slug) {
					_this6.setState({
						status: XHR_OK,
						hummingbird_search_results: res
					});
				}
			});
		}
	},
	on_hummingbird_search_title: function on_hummingbird_search_title() {
		var _this7 = this;

		if (!this.props.host_episode.title) return;

		var title = this.props.host_episode.title;
		var clean = this.props.host_episode.clean;

		this.face = HAL_SAD_FACE[HAL_SAD_FACE.length * Math.random() | 0];

		var results = storage_get_search_title(clean);
		if (results.length) {
			this.setState({
				status: XHR_OK,
				hummingbird_search_results: results
			});
		} else {
			this.setState({
				status: XHR_LOADING,
				hummingbird_search_results: []
			});

			xhr({
				url: 'https://hummingbird.horc.net/hummingbird.js',
				query: {
					by: 'title',
					title: title.encode()
				}
			})['catch'](function (e) {
				if (_this7.mounted) {
					console.error(e);
					_this7.setState({
						status: e.status
					});
				}
			}).then(xhr.parse).then(function (res) {
				storage_set_search_title(clean, res);

				// mounted & active, so update state
				if (_this7.mounted && title === _this7.props.host_episode.title) {
					_this7.setState({
						status: XHR_OK,
						hummingbird_search_results: res
					});
				}
			});
		}
	},

	render: function render() {
		var _this8 = this;

		var res = this.state.hummingbird_search_results;

		var search_style = {
			display: 'flex',
			flexFlow: 'column nowrap'
		};

		var component_manual_slug = null;
		if (this.props.by === 'title') {
			component_manual_slug = React.createElement(
				'form',
				{ onSubmit: this.on_manual_set_slug,
					style: {
						display: 'flex',
						flexFlow: 'row nowrap',
						alignItems: 'center'
					} },
				React.createElement(
					'div',
					null,
					'Slug:'
				),
				React.createElement('input', { ref: 'slug',
					type: 'text',
					placeholder: 'Manual input',
					pattern: '[\\-\\w]*',
					style: { marginLeft: '0.5rem', width: '16rem' } }),
				make_component_slug_links(this.props.host_episode.title)
			);
		}

		switch (this.state.status) {
			case XHR_LOADING:
				return React.createElement(
					'div',
					{ className: 'horc-search',
						style: search_style },
					component_manual_slug,
					React.createElement(
						'div',
						{ style: { paddingTop: '1rem' } },
						React.createElement(Preloader, { color: 'blue' })
					)
				);
			case XHR_OK:
				if (res.length) {
					return React.createElement(
						'div',
						{ className: 'horc-search',
							style: search_style },
						component_manual_slug,
						res.map(function (anime, i) {
							return React.createElement(HummingbirdItem, { key: i,
								anime: anime,
								search: _this8.props.host_episode.slug ? false : true,
								on_set_slug: _this8.props.on_set_slug });
						})
					);
				} else {
					return React.createElement(
						'div',
						{ className: 'horc-search',
							style: search_style },
						component_manual_slug,
						React.createElement(
							'div',
							{ style: { padding: '0.5rem' } },
							React.createElement(
								'b',
								null,
								'Couldn\'t find an anime by the slug entered. Things to try:'
							),
							React.createElement(
								'div',
								{ style: { padding: '0.5rem 1rem', lineHeight: '1.5rem' } },
								React.createElement(
									'div',
									null,
									'Enter the slug if you know it'
								),
								React.createElement(
									'div',
									null,
									'Clear the slug if you want to search again'
								),
								React.createElement(
									'div',
									{ style: {
											display: 'flex',
											flexFlow: 'row nowrap',
											alignItems: 'center'
										} },
									React.createElement(
										'a',
										{ href: 'https://hummingbird.me/search?scope=anime&query=' + encodeURIComponent(this.props.title),
											target: '_blank', style: { color: '#fd7532' } },
										'Find the slug through Hummingbird'
									),
									React.createElement(
										'i',
										{ className: 'material-icons', style: { fontSize: '18px' } },
										'exit_to_app'
									)
								),
								React.createElement(
									'div',
									{ style: {
											display: 'flex',
											flexFlow: 'row nowrap',
											alignItems: 'center'
										} },
									React.createElement(
										'a',
										{ href: 'https://www.google.com/#q=anime+' + encodeURIComponent(this.props.title),
											target: '_blank', style: { color: '#4caf50' } },
										'Google the alternate title'
									),
									React.createElement(
										'i',
										{ className: 'material-icons', style: { fontSize: '18px' } },
										'exit_to_app'
									)
								)
							)
						)
					);
				}
			case XHR_NETWORK_ERROR:
				return React.createElement(
					'div',
					{ className: 'horc-search' },
					component_manual_slug,
					React.createElement(
						'div',
						{ style: { paddingTop: '1rem' } },
						'The internet gave up',
						React.createElement('br', null),
						'Try again in a bit?'
					)
				);
			default:
				return React.createElement(
					'div',
					{ className: 'horc-search',
						style: search_style },
					component_manual_slug,
					React.createElement(
						'div',
						{ style: { paddingTop: '1rem' } },
						'Can\'t perform a search right now',
						React.createElement('br', null),
						'horc.net is down',
						React.createElement('br', null),
						this.face
					)
				);
		}
	}
});

//		Props:
//	anime        |  Parsed JSON response from Hummingbird API
//	on_set_slug  |  To set the Hummingbird id
var HummingbirdItem = React.createClass({
	displayName: 'HummingbirdItem',

	on_set_slug: function on_set_slug(e) {
		e.preventDefault();

		this.props.on_set_slug(this.props.anime.slug);
	},

	render: function render() {
		var anime = this.props.anime;

		var hummingbird_url = 'https://hummingbird.me/anime/' + this.props.anime.slug;

		//	Set cover image
		var bg_style = {};
		var cover = parse_missing_image(anime.cover_image) || null;
		var poster = parse_missing_image(anime.poster_image) || null;
		var bg_img = cover || poster || null;
		if (bg_img) bg_style.backgroundImage = 'url(' + bg_img + ')';

		//	Generate genres
		if (!this.genres_component) {
			this.genres_component = [];
			var container = this.props.anime.genres || [];
			for (var i = 0; i < container.length; i++) {
				var item = container[i];
				this.genres_component.push(React.createElement(
					'div',
					{ key: 'genre-' + i,
						className: 'horc-chip',
						style: STYLE.CHIP },
					item
				));
			}
		}

		//	Calculate meta airing date
		if (!this.airing) {
			var now = new Date();
			var air_s = new Date(anime.started_airing_date);
			var air_e = new Date(anime.finished_airing_date);
			if (anime.finished_airing_date === null) {
				this.airing = 'Airing from ';
				this.airing += anime.started_airing_date;
			} else {
				this.airing = (now < air_s ? 'Will air' : now < air_e ? 'Airing' : 'Aired') + ' from ';
				this.airing += anime.started_airing_date;
				this.airing += ' to ' + anime.finished_airing_date;
			}
		}

		if (!this.synopsis) {
			this.synopsis = this.props.anime.synopsis || '';
			if (200 < this.synopsis.length) this.synopsis = this.synopsis.substr(0, 200) + '...';
		}

		return React.createElement(
			'div',
			{ className: 'horc-anime',
				style: _extends({}, STYLE.HB_ANIME, bg_style) },
			React.createElement(
				'div',
				{ style: STYLE.HB_ANIME__LIGHTEN_BACKGROUND },
				React.createElement(
					'div',
					{ className: 'horc-anime-title',
						style: STYLE.HB_ANIME__TITLE },
					anime.titles.canonical
				),
				React.createElement(
					'div',
					{ style: STYLE.HB_ANIME__CONTENT },
					React.createElement(
						'div',
						{ className: 'horc-anime-alt-title',
							style: STYLE.HB_ANIME__ALT_TITLE },
						anime.titles.english
					),
					React.createElement(
						'div',
						{ className: 'horc-anime-alt-title',
							style: STYLE.HB_ANIME__ALT_TITLE },
						anime.titles.japanese
					),
					React.createElement(
						'div',
						{ className: 'horc-anime-genres' },
						this.genres_component
					),
					React.createElement(
						'div',
						{ className: 'horc-anime-meta' },
						React.createElement(
							'span',
							{ className: 'horc-anime-meta-info' },
							this.props.anime.show_type || '?'
						),
						React.createElement(
							'span',
							{ style: STYLE.HB_ANIME__META_BULLET },
							'•'
						),
						React.createElement(
							'span',
							{ className: 'horc-anime-meta-info' },
							this.props.anime.age_rating || '?'
						),
						React.createElement(
							'span',
							{ style: STYLE.HB_ANIME__META_BULLET },
							'•'
						),
						React.createElement(
							'span',
							{ className: 'horc-anime-meta-info' },
							this.props.anime.episode_count || '?',
							' episodes'
						),
						React.createElement(
							'span',
							{ style: STYLE.HB_ANIME__META_BULLET },
							'•'
						),
						React.createElement(
							'span',
							{ className: 'horc-anime-meta-info' },
							this.props.anime.episode_length,
							' min'
						),
						React.createElement(
							'span',
							{ style: STYLE.HB_ANIME__META_BULLET },
							'•'
						),
						React.createElement(
							'span',
							{ className: 'horc-anime-meta-info' },
							this.airing
						)
					),
					React.createElement(
						'div',
						{ className: 'horc-anime-synopsis' },
						this.synopsis
					),
					React.createElement(
						'div',
						{ className: 'horc-actions',
							style: {
								display: 'flex',
								flexFlow: 'row nowrap'
							} },
						this.props.search ? React.createElement(
							'button',
							{ style: {
									height: '2rem',
									marginTop: '1rem'
								},
								onClick: this.on_set_slug },
							'This One'
						)
						/*	Button class broke. Fix it?
      <Button color="#673AB7"
      		onClick={this.on_set_slug}>
      	<span style={{color: '#ffffff'}}>This One</span>
      </Button>
      */
						: undefined,
						React.createElement('div', { style: { flexGrow: 100 } }),
						React.createElement(
							CircleButton,
							{ color: '#fd7532',
								href: hummingbird_url,
								target: '_blank' },
							React.createElement('img', { className: 'horc-logo', src: HAL_IMG_LOGO_HUMMINGBIRD })
						)
					)
				)
			)
		);
	}
});

/////////////////////////////////////////
////    UI Stuff

//	BROKEN
var Button = React.createClass({
	displayName: 'Button',

	render: function render() {
		var mergeClass = reactAddClass("horc-button", this.props.className);
		var inner = React.createElement(
			'div',
			{ style: _extends({}, STYLE.BUTTON__COLOR, {
					backgroundColor: this.props.color
				}) },
			React.createElement(
				'div',
				{ style: {} },
				this.props.name,
				this.props.children
			)
		);

		return React.createElement(
			'a',
			{ className: mergeClass,
				style: _extends({}, STYLE.BUTTON),
				href: this.props.href,
				onClick: this.props.onClick,
				title: this.props.name,
				target: this.props.target },
			inner
		);
	}
});

var CircleButton = React.createClass({
	displayName: 'CircleButton',

	render: function render() {
		var mergeClass = reactAddClass("horc-button", this.props.className);
		var inner = React.createElement(
			'div',
			{ style: _extends({}, STYLE.BUTTON__COLOR, {
					backgroundColor: this.props.color
				}) },
			React.createElement(
				'div',
				{ style: {} },
				React.createElement(
					'div',
					{ style: { padding: this.props.padding } },
					this.props.name,
					this.props.children
				)
			)
		);

		return React.createElement(
			'a',
			{ className: mergeClass,
				style: _extends({}, STYLE.BUTTON, STYLE.CIRCLE),
				href: this.props.href,
				onClick: this.props.onClick,
				title: this.props.name,
				target: this.props.target },
			inner
		);
	}
});

var Preloader = React.createClass({
	displayName: 'Preloader',

	componentWillMount: function componentWillMount() {
		this.colors = {
			'red': { fg: '#f44336', bg: '#ef9a9a' },
			'pink': { fg: '#e91e63', bg: '#f48fb1' },
			'purple': { fg: '#9c27b0', bg: '#ce93d8' },
			'deep-purple': { fg: '#673ab7', bg: '#b39ddb' },
			'indigo': { fg: '#3f51b5', bg: '#9fa8da' },
			'blue': { fg: '#2196f3', bg: '#90caf9' },
			'light-blue': { fg: '#03a9f4', bg: '#81d4fa' },
			'cyan': { fg: '#00bcd4', bg: '#80deea' },
			'teal': { fg: '#009688', bg: '#80cbc4' },
			'green': { fg: '#4caf50', bg: '#a5d6a7' },
			'light-green': { fg: '#8bc34a', bg: '#c5e1a5' },
			'lime': { fg: '#cddc39', bg: '#e6ee9c' },
			'yellow': { fg: '#ffeb3b', bg: '#fff59d' },
			'amber': { fg: '#ffc107', bg: '#ffe082' },
			'orange': { fg: '#ff9800', bg: '#ffcc80' },
			'deep-orange': { fg: '#ff5722', bg: '#ffab91' },
			'brown': { fg: '#795548', bg: '#bcaaa4' },
			'grey': { fg: '#9e9e9e', bg: '#eeeeee' },
			'blue-grey': { fg: '#607d8b', bg: '#b0bec5' }
		};
	},

	render: function render() {
		var color = this.props.color || 'blue';
		var co = this.colors[color] || this.colors['blue'];
		var fg = co.fg;
		var bg = co.bg;
		return React.createElement(
			'div',
			{ className: 'materialize-progress', style: { backgroundColor: bg } },
			React.createElement('div', { className: 'materialize-indeterminate', style: { backgroundColor: fg } })
		);
	}
});

/////////////////////////////////////////
////	React Component helpers

function make_component_slug_links(title) {
	return [React.createElement(
		'a',
		{ key: 'h',
			href: 'https://hummingbird.me/search?scope=anime&query=' + encodeURIComponent(title || ''),
			target: '_blank',
			style: { color: '#fd7532', marginLeft: '0.5rem' },
			title: 'Hummingbird' },
		'H'
	), React.createElement(
		'a',
		{ key: 'g',
			href: 'https://www.google.com/#q=anime+' + encodeURIComponent(title || ''),
			target: '_blank',
			style: { color: '#4caf50', marginLeft: '0.5rem' },
			title: 'Google' },
		'G'
	), React.createElement(
		'i',
		{ className: 'material-icons',
			style: {
				fontSize: '18px',
				marginLeft: '0.5rem'
			} },
		'exit_to_app'
	)];
}

/////////////////////////////////////////
////    React Other Helpers

function reactAddClass(old_classes, new_classes) {
	if (new_classes) {
		if (old_classes) old_classes += ' ';
		old_classes += new_classes;
	}
	return old_classes;
}

////////        HoRC Anime Lighter        ////////
//////////////////////////////////////////////////
//////////////////////////////////////////////////
////////         Embedded Images          ////////

const HAL_IMG_LOGO_ANIMELIGHTER = 'data:image/png;base64,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';
const HAL_IMG_LOGO_HUMMINGBIRD = 'data:image/png;base64,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';
const HAL_IMG_LOGO_GOOGLE = 'data:image/png;base64,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';
const HAL_IMG_LOGO_ALC = 'data:image/svg+xml;base64,PHN2ZyBmaWxsPSIjMDAwMDAwIiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4gICAgPHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPiAgICA8cGF0aCBkPSJNMSAyMWg0VjlIMXYxMnptMjItMTFjMC0xLjEtLjktMi0yLTJoLTYuMzFsLjk1LTQuNTcuMDMtLjMyYzAtLjQxLS4xNy0uNzktLjQ0LTEuMDZMMTQuMTcgMSA3LjU5IDcuNTlDNy4yMiA3Ljk1IDcgOC40NSA3IDl2MTBjMCAxLjEuOSAyIDIgMmg5Yy44MyAwIDEuNTQtLjUgMS44NC0xLjIybDMuMDItNy4wNWMuMDktLjIzLjE0LS40Ny4xNC0uNzN2LTEuOTFsLS4wMS0uMDFMMjMgMTB6Ii8+PC9zdmc+';

////////         Embedded Images          ////////
//////////////////////////////////////////////////