//Integrated TL
function mixtl(acct_id, tlid, type, delc, voice) {
	localStorage.removeItem("morelock")
	localStorage.setItem("now", type);
	todo("Integrated TL Loading...(Local)");
	//まずLocal
	var domain = localStorage.getItem("domain_" + acct_id);
	var at = localStorage.getItem("acct_" + acct_id + "_at");
	var start = "https://" + domain + "/api/v1/timelines/public?local=true";
	fetch(start, {
		method: 'GET',
		headers: {
			'content-type': 'application/json',
			'Authorization': 'Bearer ' + at
		},
	}).then(function (response) {
		return response.json();
	}).catch(function (error) {
		todo(error);
		console.error(error);
	}).then(function (jsonL) {
		var start = "https://" + domain + "/api/v1/timelines/home";
		fetch(start, {
			method: 'GET',
			headers: {
				'content-type': 'application/json',
				'Authorization': 'Bearer ' + at
			},
		}).then(function (response) {
			return response.json();
		}).catch(function (error) {
			todo(error);
			console.error(error);
		}).then(function (jsonH) {
			var homearr = [];
			var timeline = jsonL.concat(jsonH);
			timeline.sort(function (a, b) {
				if (date(a.created_at, "unix") >= date(b.created_at, "unix")) return -1;
				if (date(a.created_at, "unix") < date(b.created_at, "unix")) return 1;
				return 0;
			});
			if (type == "integrated") {
				timeline.splice(20);
			}
			var templete = "";
			if (localStorage.getItem("filter_" + acct_id) != "undefined") {
				var mute = getFilterType(JSON.parse(localStorage.getItem("filter_" + acct_id)), "mix");
			} else {
				var mute = [];
			}
			Object.keys(timeline).forEach(function (key) {
				var pkey = key * 1 + 1;
				if (pkey < timeline.length) {
					if (date(timeline[key].created_at, "unix") != date(timeline[pkey].created_at, "unix")) {
						if (type == "integrated") {
							templete = templete + parse([timeline[key]], '', acct_id, tlid, "", mute, "mix");
						} else if (type == "plus") {
							if (timeline[key].account.acct == timeline[key].account.username) {
								templete = templete + parse([timeline[key]], '', acct_id, tlid, "", mute, "plus");
							}
						}
					}
				}

			});
			$("#landing_" + tlid).hide();
			$("#timeline_" + tlid).html(templete);
			mixre(acct_id, tlid, type, mute, delc, voice);
			additional(acct_id, tlid);
			jQuery("time.timeago").timeago();
			todc();
		});
	});
}


//Streamingに接続
function mixre(acct_id, tlid, TLtype, mute, delc, voice, mode) {
	var domain = localStorage.getItem("domain_" + acct_id);
	var at = localStorage.getItem("acct_" + acct_id + "_at");
	if (localStorage.getItem("streaming_" + acct_id)) {
		var wss = localStorage.getItem("streaming_" + acct_id)
	} else {
		var wss = "wss://" + domain
	}
	var startHome = wss +
		"/api/v1/streaming/?stream=user&access_token=" + at;
	var startLocal = wss +
		"/api/v1/streaming/?stream=public:local&access_token=" + at;
	var wshid = websocketHome.length;
	var wslid = websocketLocal.length;
	websocketHome[wshid] = new WebSocket(startHome);
	websocketLocal[wslid] = new WebSocket(startLocal);
	websocketHome[wshid].onopen = function (mess) {
		localStorage.setItem("wssH_" + tlid, wshid);
		console.table({ "tlid": tlid, "type": "Connect Streaming API(Integrated:Home)", "domain": domain, "message": mess })
		$("#notice_icon_" + tlid).removeClass("red-text");
	}
	websocketLocal[wslid].onopen = function (mess) {
		localStorage.setItem("wssL_" + tlid, wslid);
		console.table({ "tlid": tlid, "type": "Connect Streaming API(Integrated:Local)", "domain": domain, "message": mess })
		$("#notice_icon_" + tlid).removeClass("red-text");
	}
	websocketLocal[wslid].onmessage = function (mess) {
		console.log(["Receive Streaming API:(Integrated:Local)", obj]);

		var obj = JSON.parse(JSON.parse(mess.data).payload);
		var type = JSON.parse(mess.data).event;
		if (type == "delete") {
			if (delc == "true") {
				$("#timeline_" + tlid + " [toot-id=" + JSON.parse(mess.data).payload + "]").addClass("emphasized");
				$("#timeline_" + tlid + " [toot-id=" + JSON.parse(mess.data).payload + "]").addClass("by_delcatch");
			} else {
				$("[toot-id=" + JSON.parse(mess.data).payload + "]").hide();
				$("[toot-id=" + JSON.parse(mess.data).payload + "]").remove();
			}

		} else if (type == "update") {
			var templete = parse([obj], '', acct_id, tlid, "", mute);
			if ($("#timeline_" + tlid + " [toot-id=" + obj.id + "]").length < 1) {
				if (voice) {
					say(obj.content)
				}
				var templete = parse([obj], type, acct_id, tlid, "", mute, "mix");
				var pool = localStorage.getItem("pool_" + tlid);
				if (pool) {
					pool = templete + pool;
				} else {
					pool = templete
				}
				localStorage.setItem("pool_" + tlid, pool);

				scrollck();

				additional(acct_id, tlid);
				jQuery("time.timeago").timeago();
			} else {
				todo("二重取得発生中");
			}

		}
	}
	websocketHome[wshid].onmessage = function (mess) {
		console.log(["Receive Streaming API:(Integrated:Home)", obj]);
		var obj = JSON.parse(JSON.parse(mess.data).payload);
		var type = JSON.parse(mess.data).event;
		if (type == "delete") {
			if (del > 10) {
				reconnector(tlid, type, acct_id, data)
			} else {
				localStorage.setItem("delete", del * 1 + 1)
			}
			if (delc == "true") {
				$("[toot-id=" + JSON.parse(mess.data).payload + "]").addClass("emphasized");
				$("[toot-id=" + JSON.parse(mess.data).payload + "]").addClass("by_delcatch");
			} else {
				$("[toot-id=" + JSON.parse(mess.data).payload + "]").hide();
				$("[toot-id=" + JSON.parse(mess.data).payload + "]").remove();
			}
		} else if (type == "update") {
			localStorage.removeItem("delete");
			if (TLtype == "integrated") {
				var templete = parse([obj], '', acct_id, tlid);
			} else if (TLtype == "plus") {
				if (obj.account.acct == obj.account.username) {
					var templete = parse([obj], '', acct_id, tlid, "", mute, "mix");
				} else {
					var templete = "";
				}
			}
			if ($("#timeline_" + tlid + " [toot-id=" + obj.id + "]").length < 1) {
				if (voice) {
					say(obj.content)
				}
				var templete = parse([obj], type, acct_id, tlid, "", mute, "mix");
				var pool = localStorage.getItem("pool_" + tlid);
				if (pool) {
					pool = templete + pool;
				} else {
					pool = templete
				}
				localStorage.setItem("pool_" + tlid, pool);

				scrollck();

				additional(acct_id, tlid);
				jQuery("time.timeago").timeago();
			} else {
				todo("二重取得発生中");
			}
		}
	}
	websocketLocal[wslid].onerror = function (error) {
		console.error('WebSocketLocal Error')
		console.error(error);
		if (mode == "error") {
			$("#notice_icon_" + tlid).addClass("red-text");
			todo('WebSocket Error ' + error);
		} else {
			var errorct = localStorage.getItem("wserror_" + tlid) * 1 + 1;
			localStorage.setItem("wserror_" + tlid, errorct);
			if (errorct < 3) {
				reconnector(tlid, TLtype, acct_id, "", "error");
			}
		}
	};
	websocketLocal[wslid].onclose = function () {
		console.warn('WebSocketLocal Closing:' + tlid);
		if (mode == "error") {
			$("#notice_icon_" + tlid).addClass("red-text");
			todo('WebSocket Closed');
		} else {
			var errorct = localStorage.getItem("wserror_" + tlid) * 1 + 1;
			localStorage.setItem("wserror_" + tlid, errorct);
			if (errorct < 3) {
				reconnector(tlid, TLtype, acct_id, "", "error");
			}
		}
	};
	websocketHome[wshid].onerror = function (error) {
		console.error(['WebSocketHome Error', error])
		if (mode == "error") {
			$("#notice_icon_" + tlid).addClass("red-text");
			todo('WebSocket Error ' + error);
		} else {
			var errorct = localStorage.getItem("wserror_" + tlid) * 1 + 1;
			localStorage.setItem("wserror_" + tlid, errorct);
			if (errorct < 3) {
				reconnector(tlid, TLtype, acct_id, "", "error");
			}
		}
	};
	websocketHome[wshid].onclose = function () {
		console.warn('WebSocketHome Closing:' + tlid);
		if (mode == "error") {
			$("#notice_icon_" + tlid).addClass("red-text");
			todo('WebSocket Closed');
		} else {
			var errorct = localStorage.getItem("wserror_" + tlid) * 1 + 1;
			localStorage.setItem("wserror_" + tlid, errorct);
			if (errorct < 3) {
				reconnector(tlid, TLtype, acct_id, "", "error");
			}
		}

	};

}

//ある程度のスクロールで発火
function mixmore(tlid, type) {
	var multi = localStorage.getItem("column");
	var obj = JSON.parse(multi);
	var acct_id = obj[tlid].domain;
	moreloading = true;
	todo("Integrated TL MoreLoading...(Local)");
	var domain = localStorage.getItem("domain_" + acct_id);
	var at = localStorage.getItem("acct_" + acct_id + "_at");
	var sid = $("#timeline_" + tlid + " .cvo").last().attr("unique-id");


	var start = "https://" + domain + "/api/v1/timelines/public?local=true&max_id=" + sid;
	fetch(start, {
		method: 'GET',
		headers: {
			'content-type': 'application/json',
			'Authorization': 'Bearer ' + at
		},
	}).then(function (response) {
		return response.json();
	}).catch(function (error) {
		todo(error);
		console.error(error);
	}).then(function (jsonL) {
		var start = "https://" + domain + "/api/v1/timelines/home?max_id=" + sid;
		fetch(start, {
			method: 'GET',
			headers: {
				'content-type': 'application/json',
				'Authorization': 'Bearer ' + at
			},
		}).then(function (response) {
			return response.json();
		}).catch(function (error) {
			todo(error);
			console.error(error);
		}).then(function (jsonH) {
			var homearr = [];
			var timeline = jsonL.concat(jsonH);
			timeline.sort(function (a, b) {
				if (date(a.created_at, "unix") > date(b.created_at, "unix")) return -1;
				if (date(a.created_at, "unix") < date(b.created_at, "unix")) return 1;
				return 0;
			});
			timeline.splice(20);
			var templete = "";
			Object.keys(timeline).forEach(function (key) {
				var pkey = key * 1 + 1;
				if (pkey < 20) {
					if (date(timeline[key].created_at, "unix") != date(timeline[pkey].created_at, "unix")) {
						if (localStorage.getItem("filter_" + acct_id) != "undefined") {
							var mute = getFilterType(JSON.parse(localStorage.getItem("filter_" + acct_id)), "mix");
						} else {
							var mute = [];
						}
						if (type == "integrated") {
							templete = templete + parse([timeline[key]], '', acct_id, tlid, "", mute, "mix");
						} else if (type == "plus") {
							if (timeline[key].account.acct == timeline[key].account.username) {
								templete = templete + parse([timeline[key]], '', acct_id, tlid, "", mute, "mix");
							}
						}
					}
				}

			});

			$("#timeline_" + tlid).append(templete);
			additional(acct_id, tlid);
			jQuery("time.timeago").timeago();
			moreloading = false;
			todc();
		});
	});


}