function changeSubscription(self,element,id) {
	var req = initrequest(true);
	if (!req) return;
	var subscribed = self.getAttribute('data-subscribed');
	req.open('POST','/'+element+'/'+id+'/'+(subscribed ? 'unsubscribe' : 'subscribe'),true);
	req.onreadystatechange = function() {
		if (req.readyState != 4) return;
		if (req.status != 200) { alertMessage(req.responseText ? req.responseText : 'HTTP status ('+req.status+')'); return; }
		changeFollowLinks(!subscribed,self);
	};
	req.send(null);
}
function changeFollowLinks(subscribed,self) {
	var links = self ? [self,self.id == 'follow_0' ? 'follow_1' : 'follow_0'] : ['follow_0','follow_1'];
	for (var i = 0; i < links.length; ++i) {
		var link = links[i];
		if (typeof link == 'string') {
			link = getobj(link);
			if (!link) continue;
		}
		if (subscribed) {
			if (link.getAttribute('data-subscribed')) continue;
			setattr(link,'data-subscribed',true);
		} else {
			if (!link.getAttribute('data-subscribed')) continue;
			setattr(link,'data-subscribed',false);
		}
		var tmp = link.innerHTML;
		link.innerHTML = link.getAttribute('data-other');
		link.setAttribute('data-other',tmp);
	}
	var follow = getobj('follow');
	if (!follow) return;
	follow.checked = subscribed;
	follow.onclick();
}
function removeSubscription(self,element,id,unseen) { try {
	var req = initrequest(true);
	if (!req) return;
	req.open('POST','/'+element+'/'+id+'/unsubscribe',true);
	req.onreadystatechange = function() {
		if (req.readyState != 4) return;
		if (req.status != 200) { alertMessage(req.responseText ? req.responseText : 'HTTP status ('+req.status+')'); return; }
		var row = self.parentNode.parentNode;
		var tbody = row.parentNode;
		tbody.removeChild(row);
		if (tbody.rows.length == 1) {
			var table = tbody.parentNode;
			table.parentNode.removeChild(table);
		}
		if (unseen) updateSubscriptionCounter(1);
	};
	req.send(null);
} catch(e) {
	catchLog(e);
}}
function catchupSubscriptions(self,element) {
	var req = initrequest(true);
	if (!req) return;
	var table = self.parentNode.parentNode.parentNode.parentNode;
	req.open('POST','/'+(element ? element : 'all')+'.catchup',true);
	req.onreadystatechange = function() {
		if (req.readyState != 4) return;
		if (req.status != 200) { remclass(table,'light'); alertMessage(req.responseText ? req.responseText : 'HTTP status ('+req.setatus+')'); return; }
		if (element) {
			table.parentNode.removeChild(table);
			var remcnt = table.rows.length-1;
		} else {
			remclass(table,'light');
			var anchors = document.getElementsByTagName('A');
			for (var i = 0; i < anchors.length; ++i) {
				var anchor = anchors[i];
				if (anchor.className.match(/unseen/)) {
					if (anchor.firstChild.nodeName == 'IMG') {
						anchor.parentNode.removeChild(anchor);
					} else {
						anchor.parentNode.parentNode.removeChild(anchor.parentNode);
					}
				}
			}
			self.parentNode.removeChild(self);
			var unseencnt = getobj('totalunseen');
			var remcnt = unseencnt ? unseencnt.value : 0;
		}
		if (remcnt) updateSubscriptionCounter(remcnt);
	};
	if (table) addclass(table,'light');
	req.send(null);
}
function updateSubscriptionCounter(remcnt) {
	var subcnt = getobj('subcnt');
	if (!subcnt) return;
	var remaining = parseInt(subcnt.innerHTML) - remcnt;
	if (remaining > 0) {
		subcnt.innerHTML = remaining;
	} else {
		subcnt.parentNode.parentNode.removeChild(subcnt.parentNode);
	}
	if (typeof update_totalmsg != 'undefined') update_totalmsg(-remcnt);
}
function hideUnseen(self,uniq,row) {
	updateSubscriptionCounter(1);
	if (!row) {
		if (self.id.match(/^uns([ab])(\d+)$/)) {
			var rems = [self];
			rems.push('uns' + (RegExp.$1 == 'a' ? 'b' : 'a') + RegExp.$2);
		} else {
			var rems = ['unsa'+uniq,'unsb'+uniq];
		}
		for (var i = 0; i < rems.length; ++i) {
			var rem = rems[i];
			if (typeof rem == 'string') {
				rem = getobj(rem);
				if (!rem) continue;
			}
			rem.parentNode.removeChild(rem);
		}
	} else {
		var row = self.parentNode.parentNode;
		row.parentNode.removeChild(row);
	}
}
function clickSub(self) {
	if (	self.hash
	&&	!self.getAttribute('self-hashed')
	) {
		self.hash += 'n';
		setattr(self,'self-hashed',true);
	}
}

