//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) {
			if (!response.ok) {
				response.text().then(function(text) {
					setLog(response.url, response.status, text)
				})
			}
			return response.json()
		})
		.catch(function(error) {
			todo(error)
			setLog(start, 'JSON', 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) {
					if (!response.ok) {
						response.text().then(function(text) {
							setLog(response.url, response.status, text)
						})
					}
					return response.json()
				})
				.catch(function(error) {
					todo(error)
					setLog(start, 'JSON', 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) {
			if (!response.ok) {
				response.text().then(function(text) {
					setLog(response.url, response.status, text)
				})
			}
			return response.json()
		})
		.catch(function(error) {
			todo(error)
			setLog(start, 'JSON', 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) {
					if (!response.ok) {
						response.text().then(function(text) {
							setLog(response.url, response.status, text)
						})
					}
					return response.json()
				})
				.catch(function(error) {
					todo(error)
					setLog(start, 'JSON', 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()
				})
		})
}