all repos — honk @ 53b5b23f45e0f9cf87ec425d00cd8e672d049da8

my fork of honk

views/honkpage.js (view raw)

  1function encode(hash) {
  2        var s = []
  3        for (var key in hash) {
  4                var val = hash[key]
  5                s.push(escape(key) + "=" + escape(val))
  6        }
  7        return s.join("&")
  8}
  9function post(url, data) {
 10	var x = new XMLHttpRequest()
 11	x.open("POST", url)
 12	x.timeout = 30 * 1000
 13	x.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
 14	x.send(data)
 15}
 16function get(url, whendone, whentimedout) {
 17	var x = new XMLHttpRequest()
 18	x.open("GET", url)
 19	x.timeout = 15 * 1000
 20	x.responseType = "json"
 21	x.onload = function() { whendone(x) }
 22	if (whentimedout) {
 23		x.ontimeout = function(e) { whentimedout(x, e) }
 24	}
 25	x.send()
 26}
 27function bonk(el, xid) {
 28	el.innerHTML = "bonked"
 29	el.disabled = true
 30	post("/bonk", encode({"js": "2", "CSRF": csrftoken, "xid": xid}))
 31	return false
 32}
 33function unbonk(el, xid) {
 34	el.innerHTML = "unbonked"
 35	el.disabled = true
 36	post("/zonkit", encode({"CSRF": csrftoken, "wherefore": "unbonk", "what": xid}))
 37}
 38function muteit(el, convoy) {
 39	el.innerHTML = "muted"
 40	el.disabled = true
 41	post("/zonkit", encode({"CSRF": csrftoken, "wherefore": "zonvoy", "what": convoy}))
 42	var els = document.querySelectorAll('article.honk')
 43	for (var i = 0; i < els.length; i++) {
 44		var e = els[i]
 45		if (e.getAttribute("data-convoy") == convoy) {
 46			e.remove()
 47		}
 48	}
 49}
 50function zonkit(el, xid) {
 51	el.innerHTML = "zonked"
 52	el.disabled = true
 53	post("/zonkit", encode({"CSRF": csrftoken, "wherefore": "zonk", "what": xid}))
 54	var p = el
 55	while (p && p.tagName != "ARTICLE") {
 56		p = p.parentElement
 57	}
 58	if (p) {
 59		p.remove()
 60	}
 61}
 62function flogit(el, how, xid) {
 63	var s = how
 64	if (s[s.length-1] != "e") { s += "e" }
 65	s += "d"
 66	if (s == "untaged") s = "untagged"
 67	if (s == "reacted") s = "badonked"
 68	el.innerHTML = s
 69	el.disabled = true
 70	post("/zonkit", encode({"CSRF": csrftoken, "wherefore": how, "what": xid}))
 71}
 72
 73var lehonkform = document.getElementById("honkform")
 74var lehonkbutton = document.getElementById("honkingtime")
 75
 76function oldestnewest(btn) {
 77	var els = document.getElementsByClassName("glow")
 78	if (els.length) {
 79		els[els.length-1].scrollIntoView()
 80	}
 81}
 82function removeglow() {
 83	var els = document.getElementsByClassName("glow")
 84	while (els.length) {
 85		els[0].classList.remove("glow")
 86	}
 87}
 88
 89function fillinhonks(xhr, glowit) {
 90	var resp = xhr.response
 91	var stash = curpagestate.name + ":" + curpagestate.arg
 92	tophid[stash] = resp.Tophid
 93	var doc = document.createElement( 'div' );
 94	doc.innerHTML = resp.Srvmsg
 95	var srvmsg = doc
 96	doc = document.createElement( 'div' );
 97	doc.innerHTML = resp.Honks
 98	var honks = doc.children
 99
100	var mecount = document.getElementById("mecount")
101	if (resp.MeCount) {
102		mecount.innerHTML = "(" + resp.MeCount + ")"
103	} else {
104		mecount.innerHTML = ""
105	}
106	var chatcount = document.getElementById("chatcount")
107	if (resp.ChatCount) {
108		chatcount.innerHTML = "(" + resp.ChatCount + ")"
109	} else {
110		chatcount.innerHTML = ""
111	}
112
113	var srvel = document.getElementById("srvmsg")
114	while (srvel.children[0]) {
115		srvel.children[0].remove()
116	}
117	srvel.prepend(srvmsg)
118
119	var frontload = true
120	if (curpagestate.name == "convoy") {
121		frontload = false
122	}
123
124	var honksonpage = document.getElementById("honksonpage")
125	var holder = honksonpage.children[0]
126	var lenhonks = honks.length
127	for (var i = honks.length; i > 0; i--) {
128		var h = honks[i-1]
129		if (glowit)
130			h.classList.add("glow")
131		if (frontload) {
132			holder.prepend(h)
133		} else {
134			holder.append(h)
135		}
136			
137	}
138	relinklinks()
139	return lenhonks
140}
141function hydrargs() {
142	var name = curpagestate.name
143	var arg = curpagestate.arg
144	var args = { "page" : name }
145	if (name == "convoy") {
146		args["c"] = arg
147	} else if (name == "combo") {
148		args["c"] = arg
149	} else if (name == "honker") {
150		args["xid"] = arg
151	}
152	return args
153}
154function refreshupdate(msg) {
155	var el = document.querySelector("#refreshbox p span")
156	if (el) {
157		el.innerHTML = msg
158	}
159}
160function refreshhonks(btn) {
161	removeglow()
162	btn.innerHTML = "refreshing"
163	btn.disabled = true
164	var args = hydrargs()
165	var stash = curpagestate.name + ":" + curpagestate.arg
166	args["tophid"] = tophid[stash]
167	get("/hydra?" + encode(args), function(xhr) {
168		btn.innerHTML = "refresh"
169		btn.disabled = false
170		if (xhr.status == 200) {
171			var lenhonks = fillinhonks(xhr, true)
172			refreshupdate(" " + lenhonks + " new")
173		} else {
174			refreshupdate(" status: " + xhr.status)
175		}
176	}, function(xhr, e) {
177		btn.innerHTML = "refresh"
178		btn.disabled = false
179		refreshupdate(" timed out")
180	})
181}
182function statechanger(evt) {
183	var data = evt.state
184	if (!data) {
185		return
186	}
187	switchtopage(data.name, data.arg)
188}
189function switchtopage(name, arg) {
190	var stash = curpagestate.name + ":" + curpagestate.arg
191	var honksonpage = document.getElementById("honksonpage")
192	var holder = honksonpage.children[0]
193	holder.remove()
194	var srvel = document.getElementById("srvmsg")
195	var msg = srvel.children[0]
196	if (msg) {
197		msg.remove()
198		servermsgs[stash] = msg
199	}
200	showelement("refreshbox")
201
202	honksforpage[stash] = holder
203
204	curpagestate.name = name
205	curpagestate.arg = arg
206	// get the holder for the target page
207	var stash = name + ":" + arg
208	holder = honksforpage[stash]
209	if (holder) {
210		honksonpage.prepend(holder)
211		msg = servermsgs[stash]
212		if (msg) {
213			srvel.prepend(msg)
214		}
215	} else {
216		// or create one and fill it
217		honksonpage.prepend(document.createElement("div"))
218		var args = hydrargs()
219		get("/hydra?" + encode(args), function(xhr) {
220			if (xhr.status == 200) {
221				var lenhonks = fillinhonks(xhr, false)
222			} else {
223				refreshupdate(" status: " + xhr.status)
224			}
225		}, function(xhr, e) {
226			refreshupdate(" timed out")
227		})
228	}
229	refreshupdate("")
230}
231function newpagestate(name, arg) {
232	return { "name": name, "arg": arg }
233}
234function pageswitcher(name, arg) {
235	return function(evt) {
236		var topmenu = document.getElementById("topmenu")
237		topmenu.open = false
238		if (name == curpagestate.name && arg == curpagestate.arg) {
239			return false
240		}
241		switchtopage(name, arg)
242		var url = evt.srcElement.href
243		if (!url) {
244			url = evt.srcElement.parentElement.href
245		}
246		history.pushState(newpagestate(name, arg), "some title", url)
247		window.scrollTo(0, 0)
248		return false
249	}
250}
251function relinklinks() {
252	var els = document.getElementsByClassName("convoylink")
253	while (els.length) {
254		els[0].onclick = pageswitcher("convoy", els[0].text)
255		els[0].classList.remove("convoylink")
256	}
257	els = document.getElementsByClassName("combolink")
258	while (els.length) {
259		els[0].onclick = pageswitcher("combo", els[0].text)
260		els[0].classList.remove("combolink")
261	}
262	els = document.getElementsByClassName("honkerlink")
263	while (els.length) {
264		var el = els[0]
265		var xid = el.getAttribute("data-xid")
266		el.onclick = pageswitcher("honker", xid)
267		el.classList.remove("honkerlink")
268	}
269}
270(function() {
271	var el = document.getElementById("homelink")
272	el.onclick = pageswitcher("home", "")
273	el = document.getElementById("atmelink")
274	el.onclick = pageswitcher("atme", "")
275	el = document.getElementById("firstlink")
276	el.onclick = pageswitcher("first", "")
277	el = document.getElementById("savedlink")
278	el.onclick = pageswitcher("saved", "")
279	el = document.getElementById("longagolink")
280	el.onclick = pageswitcher("longago", "")
281	relinklinks()
282	window.onpopstate = statechanger
283	history.replaceState(curpagestate, "some title", "")
284})();
285(function() {
286	hideelement("donkdescriptor")
287})();
288function showhonkform(elem, rid, hname) {
289	var form = lehonkform
290	form.style = "display: block"
291	if (elem) {
292		form.remove()
293		elem.parentElement.parentElement.parentElement.insertAdjacentElement('beforebegin', form)
294	} else {
295		hideelement(lehonkbutton)
296		elem = document.getElementById("honkformhost")
297		elem.insertAdjacentElement('afterend', form)
298	}
299	var ridinput = document.getElementById("ridinput")
300	if (rid) {
301		ridinput.value = rid
302		if (hname) {
303			honknoise.value = hname + " "
304		} else {
305			honknoise.value = ""
306		}
307	} else {
308		ridinput.value = ""
309		honknoise.value = ""
310	}
311	var updateinput = document.getElementById("updatexidinput")
312	updateinput.value = ""
313	document.getElementById("honknoise").focus()
314	return false
315}
316function cancelhonking() {
317	hideelement(lehonkform)
318	showelement(lehonkbutton)
319}
320function showelement(el) {
321	if (typeof(el) == "string")
322		el = document.getElementById(el)
323	if (!el) return
324	el.style.display = "block"
325}
326function hideelement(el) {
327	if (typeof(el) == "string")
328		el = document.getElementById(el)
329	if (!el) return
330	el.style.display = "none"
331}
332function updatedonker() {
333	var el = document.getElementById("donker")
334	el.children[1].textContent = el.children[0].value.slice(-20)
335	var el = document.getElementById("donkdescriptor")
336	el.style.display = ""
337	var el = document.getElementById("saveddonkxid")
338	el.value = ""
339}
340var checkinprec = 100.0
341var gpsoptions = {
342	enableHighAccuracy: false,
343	timeout: 1000,
344	maximumAge: 0
345};
346function fillcheckin() {
347	if (navigator.geolocation) {
348		navigator.geolocation.getCurrentPosition(function(pos) {
349			showelement("placedescriptor")
350			var el = document.getElementById("placelatinput")
351			el.value = Math.round(pos.coords.latitude * checkinprec) / checkinprec
352			el = document.getElementById("placelonginput")
353			el.value = Math.round(pos.coords.longitude * checkinprec) / checkinprec
354			checkinprec = 10000.0
355			gpsoptions.enableHighAccuracy = true
356			gpsoptions.timeout = 2000
357		}, function(err) {
358			showelement("placedescriptor")
359			el = document.getElementById("placenameinput")
360			el.value = err.message
361		}, gpsoptions)
362	}
363}