var Pf = Pf || {};
var Browser = {
	IE:		false,
	Firefox:	false,
	Chrome:		false,
	Safari:		false,
	Opera:		false,
	iOS:		false,
	RemembersDOM:	false,
	name:		'',
	version:	1.0};
function getText(node) {
	if (typeof node.value != 'undefined') return node.value;
	if (typeof node.textContent != 'undefined') return node.textContent;
	if (typeof node.innerText != 'undefined') return node.innerText;
	return undefined;
}
function setCookie(name,val,expires) {
	var expdate = new Date();
	if (expires)
		expdate.setTime(expdate.getTime() + expires * 1000);
	else	expdate = null;
	document.cookie = name + '=' + val + ';path=/;domain=.partyflock.nl'+(expdate?expdate.toGMTString():'');
}
function getWindowInfo() {
		return {w:window.innerWidth,h:window.innerHeight,sx:window.pageXOffset,sy:window.pageYOffset};
	}
String.prototype.replace_keywords = function(reps) {
	var str = this;
	for (var key in reps) {
		str = str.replace(RegExp('%'+key+'%'),reps[key]);
	}
	return str;
}
String.prototype.numericEntities = function() {
	var result = new String;
	var len = this.length;
	for (var i = 0; i < len; ++i) {
		result += '&#'+this.charCodeAt(i)+';';
	}
	return result;
}
function unhide(arg) {
	setdisplay(arguments,true);
}
function unhideobj(arg,type) {
	setdisplay(arg,true);
}
function hide() {
	setdisplay(arguments,false);
}
function hideobj(obj) {
	setdisplay(obj,false);
}
function setdisplay(arg,show,ignore) {
	setclass(arg,!show,'hidden',ignore);
}
function is_visible(obj) {
	var style;
	return	obj.parentNode
	&&	!obj.className.match(/\bhidden\b/)
	&&	obj.style.display != 'none'
	&&	obj.style.visibility != 'hidden'
	&&	(style = window.getComputedStyle ? window.getComputedStyle(obj,null) : obj.currentStyle)
	&&	style.display != 'none'
	&&	style.visibility != 'hidden';
}
function swapdisplay() {
	toggleclass(arguments,'hidden');
}
function swaphtml(self) {
	var tmp = self.getAttribute('data-otherhtml');
	self.setAttribute('data-otherhtml',self.innerHTML);
	self.innerHTML = tmp;
}
function toggleclass(arg,className) {
	walkarg(arg,function(obj){
		if (!obj.className) {
			obj.className = className;
			return;
		}
		var re = new RegExp('(\\b'+className+'\\b)');
		if (re.test(obj.className)) {
			obj.className = obj.className.replace(re,'');
		} else {
			obj.className += ' ' + className;
		}
	});		
}
function swapclass(obj,newclassname,otherclassname) {
	if (typeof obj == 'string') {
		obj = getobj(obj,true);
		if (!obj) return;
	}
	obj.className =
		(	obj.className == newclassname
		?	(otherclassname ? otherclassname : null)
		:	newclassname
	);
}
function getobj(id,showalert) {
	var obj =
		document.getElementById
	?	document.getElementById(id)
	:	(	document.all
		?	document.all[id]
		:	(	document.layers
			?	document.layers[id]
			:	null
			)
		);
	if (obj) {
		return obj;
	}
	if (showalert) {
		alert(String('Object \"%ID%\" niet gevonden!').replace_keywords({'ID':id}));
	}
	return false;
}
function haverequest() {
	return 	window.XMLHttpRequest
	||	window.ActiveXObject;
}
function initrequest(showalert) {
	var req;
	if (window.XMLHttpRequest) {
		if (!(req = new XMLHttpRequest())) {
			if (showalert) {
				alert('Creatie van nieuw XMLHTTP object mislukt, functie is onbeschikbaar!');
			}
			return false;
		}
		return req;
	} else if (!window.ActiveXObject) {
		if (showalert) {
			alert('Jouw browser ondersteunt het XMLHTTP object niet!');
		}
		return false;
	}
	if (	!req
	&&	!(req = new ActiveXObject('Msxml2.XMLHTTP'))
	&&	!(req = new ActiveXObject('Microsoft.XMLHTTP'))
	) {
		if (showalert) {
			alert('Creatie van nieuw ActiveXObject(MSXML.2) mislukt, functie onbeschikbaar!');
		}
		return false;
	}
	return req;
}
function request_alert_status(req) {
	alert(String('Verzoek resulteerde in onjuiste status %STATUS%!').replace_keywords({'STATUS':req.status,'URL':req.url}));
}
function parseJSON(data,src) {
	if (!data) {
		return false;
	}
	var actualdata = data.substring(14+2,data.length-2);
	if (!/^("(\\.|[^"\\\n\r])*?"|[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t])+?$/.test(actualdata)) { // "
		var warnobj = getobj('jsonwarning');
		var newHTML = '<span class="error">BAD JSON</span>:';
		if (src) {
			newHTML += ' ('+src+') ';
		}
		if (data.length > 1024) {
			newHTML += '<br />'+data.substring(0,1024).numericEntities();
		} else {
			newHTML += '<br />'+data.numericEntities();
		}
		if (warnobj) {
			warnobj.innerHTML = newHTML;
		} else {
			var warning = document.createElement('div')
			if (warning) {
				warning.id = 'jsonwarning';
				warning.className = 'topwarning';
				warning.innerHTML = newHTML;
				document.body.insertBefore(warning,document.body.firstChild);
			}
		}
		return false;
	}
	try {
		var result = eval('(' + actualdata + ')');
	} catch (e) {
		catchLog(e);
		return false;
	}
	return result;
}
function do_inline(method,url,action,handler,data,req,self) {
	if (!req) { req = initrequest(true); if (!req) return false }
	req.open(method,url,action != 'RETURN' && action != 'REQ');
	if (!data && self) data = self.getAttribute('data-data');
	if (data) req.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
	switch (action) {
	case 'RETURN':
		req.send(data);
		var ctype = req.getResponseHeader('Content-Type');
		return ctype && /^application\/json\b/.test(ctype) ? parseJSON(req.responseText) : req.responseText;
	case 'REQ':
		req.send(data);
		req.ctype = req.getResponseHeader('Content-Type');
		if (req.ctype && /^application\/json\b/.test(req.ctype)) {
			req.json = parseJSON(req.responseText);
		}
		return req;
	case 'FILL':
		if (!handler) {
			alert('empty FILL handler');
			return;
		}
		if (typeof handler == 'string') {
			handler = getobj(handler,true);
			if (!handler) return;
		}
		req.onreadystatechange = function() {
			if (req.readyState != 4) return;
			if (req.status == 200) handler.innerHTML = req.responseText;	
		};
		break;
	case 'ACT':
		var msgs = getobj('messages');
		if (msgs) msgs.innerHTML = '';
		req.onreadystatechange = function() {
			if (req.readyState != 4) return;
			var obj = null;
			if (req.responseText) {
				var ctype = req.getResponseHeader('Content-Type');
				if (/\bflockjsonv1\b/.test(ctype)) {
					var obj = parseJSON(req.responseText);
					if (obj && typeof obj['MESSAGES'] !== 'undefined' && msgs) {
						if (msgs) msgs.innerHTML = obj['MESSAGES'];
					}
				}
			}
			if ((handler ? handler(req,self,obj) : req.status == 200) && self) {
				var n;
				if (n = req.getResponseHeader('X-NEWNAME')) self.innerHTML = n;
				if (n = req.getResponseHeader('X-NEWDATA')) self.setAttribute('data-data',n);
			}
		};
	}
	req.send(data);
}
function changerow(node,action,arg) {
	while (node.nodeName != 'TR') node = node.parentNode;
	changenode(node,action,arg);
}
function changenode(node,action,arg) {
	switch (action) {
	case 'remove':		node.parentNode.removeChild(node); break;
	case 'addclass':	addclass(node,arg); break;
	case 'remclass':	remclass(node,arg); break;
	case 'toggleclass':	toggleclass(node,arg); break;
	case 'hide':		setdisplay(node,false); break;
	case 'show':		setdisplay(node,true); break;
	}
}
var ERR_TO_HTML = 1;
var ERR_TO_ALERT= 2;
var ERR_CLEAR	= 4;
function showerrors(req,type,map) {
	var errmsg;
	if (typeof req == 'string') {
		errmsg = req;
	} else {
		var data = req.responseText;
		var ctype;
		if (	!data
		||	!(ctype = req.getResponseHeader('Content-Type'))
		||	!ctype.match(/^([^\s;]*)/)
		) {
			errmsg = 'Er ging iets mis!';
		} else switch (RegExp.$1) {
		case 'text/html':
			errmsg = data;
			break;
		case 'application/json':
			var lines = parseJSON(data);
			if (!lines) return;
			var len = lines.length;
			var errmsg = '';
			var i = 0;
			while (i < len) {
				errmsg += lines[i];
				if (++i == len) {
					break;
				}
				errmsg += "\n";
			}
			break;
		}
		if (!map) map = {};
		map.STATUS = req.status;
	}
	var msgs = getobj('messages');
	if (msgs && (type & ERR_CLEAR)) {
		msgs.innerHTML = '';
	}
	if (map) {
		errmsg = errmsg.replace_keywords(map);
	}
	if (!type) type = msgs ? ERR_TO_HTML : ERR_TO_ALERT;
	if (type & ERR_TO_HTML && msgs)	msgs.innerHTML += errmsg;
	if (type & ERR_TO_ALERT)	alertMessage(errmsg);
}
function selectContents(node) {
	var selection = document.selection ? document.selection : (window.getSelection ? window.getSelection() : false);
	if (!selection) {
		return false;
	}
	var range =
		selection.createRange
	?	selection.createRange()
	:	(	document.createRange
		?	document.createRange()
		:	(	document.body.createTextRange
			?	document.body.createTextRange()
			:	false
			)
		);
	if (!range) {
		return false;
	}
	if (range.selectNodeContents) {
		range.selectNodeContents(node);
	}
	if (selection.removeAllRanges) {
		selection.removeAllRanges();
		selection.addRange(range);
	} else if (range.moveToElementText) {
		range.moveToElementText(node);
	}
	if (range.select) {
		range.select();
	}
	return range;
}
function focus_and_to_end(container,body,intoview) {
	if (	typeof body == 'string'
	&&	!(body = getobj(body))
	||	typeof container == 'string'
	&&	!(container = getobj(container))
	) {
		return;
	}
	if (intoview) {
		container.scrollIntoView();
	}
	pf.focus(body);
	move_to_end(body);
}
var pf = {
	focus: function(elem) { 
		if (!elem.focus) return;
		try {
			if (typeof pf_disableZoom != 'undefined') {
				pf_disableZoom();
				elem.focus();
				pf_enableZoom();
			} else {
				elem.focus();
			}
		} catch (e) {
			catchLog(e);
		}
	}
}
function catchLog(e) {
	var m = 'Er is een fout opgetreden, geef gaarne het volgende door aan de helpdesk:\n\n';
	if (!e.stack) {
		if (e.fileName) {
			m += e.fileName + ' @ ' + e.lineNumber + '\n\n';
		} else if (e.sourceURL) {
			m += e.sourceURL + ' @ ' + e.line + '\n\n';
		}
	}
	if (e.message && (!e.stack || -1 == e.stack.indexOf(e.message))) {
		m += e.message + '\n\n';
	}
	if (e.stack) {
		m += e.stack + '\n\n';
	} else if (arguments.callee.caller) {
		m += arguments.callee.caller.toString().substr(0,100).replace(/[\t\r\n\s]+/g,' ') + '\n\n';
	}
	alert(m);
}
function remevent(elem,eventname,handler,capt) {
	if (elem.removeEventListener)	elem.removeEventListener(eventname,handler,capt ? true : false);
	if (elem.detachEvent)		elem.detachEvent('on'+eventname,handler.caller);
}
function addreadyevent(handler) {
	var rdy = function() { if (handler.pffired) return; handler.pffired = true; handler() };
	addevent(document,'DOMContentLoaded',rdy);
	addevent(document,'load',rdy);
	}
function addevent(elem,eventname,handler,capt) {
	return	elem.addEventListener
	?	elem.addEventListener(eventname,handler,capt ? true : false)
	:	(	elem.attachEvent
		?	elem.attachEvent('on'+eventname,function(){handler.call(elem,window.event)})
		:	false
		);
}
addevent(window,'load',hashChange);
addevent(window,'hashchange',hashChange);
function hashChange() {
	if (!location.hash.match(/^#(m\d+)(n)?$/)) {
		return;
	}
	var msg = getobj(RegExp.$1);
	if (!msg) return;
	if (RegExp.$2) {
		msg = msg.nextSibling;
		msg.scrollIntoView(true);
	}
	var hr = arguments.callee.hr;
	if (!hr) {
		hr = document.createElement('div');
		hr.innerHTML = '&rarr;';
		hr.className = 'abs';
		hr.style.marginLeft = '-1.2em';
		hr.style.fontSize = '300%';
	}
	msg.parentNode.insertBefore(hr,msg);
	arguments.callee.hr = hr;
}
function walkarg(arg,func,ignore) {
	if (!arg) return;
	if (	typeof arg != 'object'
	||	typeof arg[0] == 'undefined'
	||	(	!(arg instanceof Array)
		&&	!arg.callee
		)
	) {
		arg = [arg];
	}
	for (var i = 0; i < arg.length; ++i) {
		var argi = arg[i];
		if (!argi) continue;
		if (typeof argi == 'string') {
			argi = getobj(argi,ignore ? false : true);
			if (!argi) continue;
		}
		func.call(arg,argi);
	}
}
function repclass(arg,className) {
	walkarg(arg,function(obj){
		obj.className = className;
	});
}
function setclass(arg,set,args,ignore) {
	if (set) addclass(arg,args,ignore);
	else	 remclass(arg,args,ignore);
}
function addclass(arg,cls,ignore) {
	if (cls instanceof Array) {
		var newcls = '';
		for (var j = 0; j < cls.length; ++j) {
			newcls += cls[j] + ' ';
		}
		cls = newcls;
	}
	walkarg(arg,function(obj){
		if (obj.className) {
			if (!obj.className.match('\\b'+cls+'\\b')) {
				obj.className += ' ' + cls;
			}
		} else {
			obj.className = cls;
		}
	},ignore);
}
function remclass(arg,cls,ignore) {
	var re = new RegExp("(\\b(\\s*)("+(cls instanceof Array ? cls.join('|') : cls)+")(\\s*)\\b)",'g');
	walkarg(arg,function(obj){
		obj.className = obj.className.replace(re,RegExp.$2 || RegExp.$4 ? ' ' : '');
	},ignore);
}
function switchTheme(span) {
	var newtheme;
	var oldtheme;
	hideobj(span);
	if (span.id == 'lightsite') {
		oldtheme = ':dark,';
		newtheme = ':,';
		unhideobj(span.nextSibling);
	} else {
		oldtheme = ':,';
		newtheme = ':dark,';
		unhideobj(span.previousSibling);
	}
	var objs = document.getElementsByTagName('link');
	for (var i = 0; i < objs.length; ++i) {
		var link = objs[i];
		if (link.rel == 'stylesheet') {
			var test = link.href.replace(oldtheme,newtheme);
			link.href = link.href.replace(oldtheme,newtheme);
		}
	}
	var maketheme = (span.id == 'lightsite' ? 'light' : 'dark');
//	var themepath = maketheme+'/';
	var imgs = document.getElementsByTagName('img');
	var re = /(dark|light)/;
	for (var i in imgs) {
		var img = imgs[i];
		if (!img.src) {
			continue;
		}
		if (re.test(img.src)) {
			img.src = img.src.replace(re,maketheme);//themepath);
		}
	}
	setCookie('FLOCK_SETTHEME',maketheme);
}
function urlencode_utf8_to_windows1252(str) {
	var HEX = '0123456789ABCDEF';
	var result = '';
	var ok = true; 
	for (var i = 0; i < str.length; ++i) {
		var ord = str.charCodeAt(i);
		if (ord == 32) {
			result += '+';
		} else if (ord < 256) {
			var chr = str.charAt(i);
			if (chr.match(/[a-zA-Z0-9]/)) {
				result += chr;
			} else {
				result += '%' + HEX.charAt(ord >> 4) + HEX.charAt(ord & 0xF);
			}
		} else {
			// javascript/browser sends unicode chars, so convert to windows1252
			switch (ord) {
			case 8364: ord = 128; break;
			case 8218: ord = 130; break;
			case 402: ord = 131; break;
			case 8222: ord = 132; break;
			case 8230: ord = 133; break;
			case 8224: ord = 134; break;
			case 8225: ord = 135; break;
			case 710: ord = 136; break;
			case 8240: ord = 137; break;
			case 352: ord = 138; break;
			case 8249: ord = 139; break;
			case 338: ord = 140; break;
			case 381: ord = 142; break;
			case 8216: ord = 145; break;
			case 8217: ord = 146; break;
			case 8220: ord = 147; break;
			case 8221: ord = 148; break;
			case 8226: ord = 149; break;
			case 8211: ord = 150; break;
			case 8212: ord = 151; break;
			case 732: ord = 152; break;
			case 8482: ord = 153; break;
			case 353: ord = 154; break;
			case 8250: ord = 155; break;
			case 339: ord = 156; break;
			case 382: ord = 158; break;
			case 376: ord = 159; break;
			case 8201: ord = 0; break;
			default: ord = 0; ok = false;
			}
			if (ord) {
				result += '%' + HEX.charAt(ord >> 4) + HEX.charAt(ord & 0xF);
			}
		}
	}
	return [result,ok];
}
function alertMessage(txt) {
	var newdiv = document.createElement('div');
	newdiv.innerHTML = txt.replace('<br />',"\n");
	alert(newdiv.textContent ? newdiv.textContent : newdiv.innerText);
}
function openLink(event,url,stop) {
	if (typeof url != 'string') {
		var resultnode = (function find_href(node) {
			if (node.href) return node;
			if (node.firstChild) return find_href(node.firstChild);
			if (node.nextSibling) return find_href(node.nextSibling);
			return null;
		})(url);
		if (!resultnode) return;
		url = resultnode.href;
	}
	if (stop) {
		if (event.stopPropagation)
			event.stopPropagation();
		else	event.cancelBubble = true;
	}
	if (event.shiftKey || event.ctrlKey || event.which == 2) {
		window.open(url);
	} else {
		location.href=url;
	}
	return false;
}
function moveAd(id) {
	var a=getobj('ad-'+id);
	var c=getobj('adc-'+id);
	if(!a||!c)return;
	a.appendChild(c);
	a.style.visibility='visible';
	c.className='';
}
function findPos(obj) {
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		do {
			curleft += obj.offsetLeft;
			curtop += obj.offsetTop;
		}
		while (obj = obj.offsetParent);
	}
	return [curleft,curtop];
}
function setattr(arg) {
	var args = arguments;
	walkarg(arg,function(obj){
		for (var i = 1; i < args.length; i+=2) {
			var key = args[i];
			var val = args[i+1];
			if (typeof val == 'boolean') {
				if (val)obj.setAttribute(key,key);
				else	obj.removeAttribute(key);
			} else {
				obj.setAttribute(key,val);
			}
			if (key == 'data-valid') {
				if (!val) {
					obj.type = 'text';
				} else switch (val) {
				case 'number':
				case 'email':
				case 'url':
				case 'tel':
					obj.type = val;
					break;
				}
			}
		}
	});
}
function swapNode(node1,node2) {
	if (typeof node1 != 'object') node1 = getobj(node1,true); if (!node1) return;
	if (typeof node2 != 'object') node2 = getobj(node2,true); if (!node2) return;
	var next = node1.nextSibling;
	var prnt = node1.parentNode;
	node2.parentNode.replaceChild(node1,node2);
	if (next)
		prnt.insertBefore(node2,next);
	else	prnt.appendChild(node2);
}

