/* regular expressions */

var EMPTY = /^\s*$/;
var BIRTHDAY = /^(19|20)\d{2}-(0?[1-9]|1[012])-(0?[1-9]|[12]\d|3[01])$/;
var NODATE = /^0*(-0*){0,2}$/;
var NUMBER = /^\d+$/;
var EMAIL = /^[\w.?&;#~=%\/-]+@[\w-]+(\.[\w-]+){1,3}$/;
var URL = /^https?:\/\/[^\s]+$/;

var helptext = [];
helptext['quote'] = 'Klik hier om dit bericht als quote in te voegen';
helptext['quotelink'] = 'Klik hier om een link zonder quote naar dit bericht in te voegen';

function help(id)
{
	if (id && helptext[id])
		window.status = helptext[id];
	else
		window.status = '';

	return true;
}

function switchforum(x)
{
	var s = x.options[x.selectedIndex];
	if (s.value != '') window.location.href = board_script_url + '/list_topics/' + s.value;
}

function switchdestinationforum(x)
{
	return x.options[x.selectedIndex].value != '';
}

function switchpage(x,url,suffix)
{
	var s = x.options[x.selectedIndex].value;
	if (s != '') window.location.href = url + '/' + s + (suffix? suffix : '');
}

function switchquotepage(formid,s)
{
	if (s != '')
	{
		document.forms[formid].elements['data[offset]'].value = s;
		document.forms[formid].elements['data[type]'].value = 'pagethru';
		document.forms[formid].submit();
	}
}

function switchfaqpage(x)
{
	var s = x.options[x.selectedIndex].value;
	if (s != '') window.location.href = board_script_url + '/faq/' + s;
}

function switchforumpage(x,forumid)
{
	var s = x.options[x.selectedIndex].value;
	if (s != '') window.location.href = board_script_url + '/list_topics/' + forumid + '/' + s;
}

function switchcontactpage(form)
{
	var x = form.elements['data[offset]'], s = x.options[x.selectedIndex].value;
	if (s != '') window.location.href = board_script_url + '/list_contacts/' + s;
}

function switchuserpage(form)
{
	var x = form.elements['data[offset]'], s = x.options[x.selectedIndex].value;
	var name = form.elements['data[name]'].value;
	if (s != '') window.location.href = board_script_url + '/list_users/' + s + (name ? '/' + escape(name) : '');
}

function selectforum(x)
{
	var i = x.options.length;
	while (i--)
	{
		if (x.options[i].id == 'switchCat') x.options[i].selected = false;
	}
}

function selectfavoriteforum(x)
{
	var s = 0, i = x.length;
	while (i--)
	{
		if (x.options[i].id == 'switchCat') x.options[i].selected = false;
		else if (x.options[i].selected)
		{
			if (++s > 3) x.options[i].selected = false;
		}
	}
}

function clearforumlist(x)
{
	var i = x.options.length;
	while (i--) x.options[i].selected = false;
}

function bookmarkCheck(checkbox)
{
	var el = checkbox.form.elements, i = el.length, all_checked = true;
	while (i--)
	{
		if (el[i].type == 'checkbox' && el[i].name != 'checkem' && !el.checked)
		{
			all_checked = false;
			break;
		}
	}

	el['checkem'].checked = all_checked;
}

function checkEmAll(checkbox)
{
	var el = checkbox.form.elements, i = el.length;
	while (i--)
	{
		if (el[i].type == 'checkbox' && el[i].name != 'checkem')
			el[i].checked = checkbox.checked;
	}
}

function checkDelete(form,type)
{
	var el = form.elements, i = el.length;
	while (i--)
	{
		if (el[i].type == 'checkbox' && el[i].name != 'checkem' && el[i].checked)
			return true;
	}

	alert('Je hebt geen ' + type + ' geselecteerd om te verwijderen');
	return false;
}

function quote_title(messageid, user)
{
	if (topicname.length > 40)
		topicname = topicname.substr(0,40)+'...';
	putStr('[message='+messageid+']'+user+' in "'+topicname+'"[/message]\n');

	return false;
}

function quote(string)
{
	putStr(string);

	return false;
}

function calcCharLeft_Fast(f,maxLength,s)
{
	var str = f.elements[s].value, len = str.length, re = /[&<>"']/g, c = re.exec(str);
	while (c != null)
	{
		switch(c[0])
		{
			case '&':
				len += 4;
				break;
			case '<':
				len += 3;
				break;
			case '>':
				len += 3;
				break;
			case '"':
				len += 5;
				break;
			case '\'':
				len += 5;
				break;
		}

		c = re.exec(str);
	}

	if (len > maxLength)
	{
		f.elements[s].value = calcCharLeft_Extended(maxLength,str);
		calcCharLeft_Fast(f,maxLength,s);
		return false;
	}

	document.getElementById('charsleft').firstChild.nodeValue = maxLength - len;
	return true;
}

function calcCharLeft_Extended(maxLength,str)
{
	var i = 0, j = str.length, len = 0;
	do
	{
		switch(str.charAt(i))
		{
			case '&':
				len += 5;
				break;
			case '<':
				len += 4;
				break;
			case '>':
				len += 4;
				break;
			case '"':
				len += 6;
				break;
			case '\'':
				len += 6;
				break;
			default:
				len++;
		}
	}
	while (len <= maxLength && ++i < j);

	return str.substring(0,i);
}

function showtopic(topicid)
{
	if (topicid.match(/^[1-9]\d*$/))
	{
		window.open(board_script_url +'/list_messages/'+topicid,'Topic');
	}
	else
	{
		alert('Het topic id is geen getal of niet ingevuld.');
	}
}

function switchcss(x)
{
	var n = x.selectedIndex, curtitle = x.options[n].text, curvalue = x.options[n].value, el = x.form.elements, i = 0, title, link;
  	do
	{
		el['data[csschoice'+i+']'].value = (1&n)+'';
		n = n >>> 1;
	} while (++i < 3);

	// show live example
	el = document.getElementsByTagName('link'), i = 0;
	while ((link = el[i++]))
	{
		if (link.getAttribute('rel').indexOf('stylesheet') > -1 && link.getAttribute('title') == curtitle)
		{
			link.disabled = false;
			break;
		}
	}
	if (i > el.length)
	{
		link = document.createElement('link');
		link.setAttribute('rel', 'stylesheet');
		link.setAttribute('type', 'text/css');
		link.setAttribute('title', curtitle);
		link.setAttribute('href', 'css/'+curvalue);
		document.getElementsByTagName('head')[0].appendChild(link);
		link.disabled = false;
	}
	else
	{
		i = 0;
		while ((link = el[i++]))
		{
			if (link.getAttribute('rel').indexOf('stylesheet') > -1 && link.getAttribute('title') != curtitle)
				link.disabled = true;
		}
	}
}

function enableSplitIds(x)
{
	var s = x.checked ? '' : 'none', i = messageids.length;
	while (i--)
	{
		document.getElementById('div_split_'+messageids[i][0]).style.display = s;
	}
}

function enableDelIds(x)
{
	var s = x.checked ? '' : 'none', i = messageids.length;
	while (i--)
	{
		document.getElementById('div_del_'+messageids[i][0]).style.display = s;
	}
}

function collectIds(action)
{
	var t = document.getElementById(action+'_messageids');
	if (t != null)
	{
		t.value = '';
		var el, i = 0, j = messageids.length;

		if (document.getElementById(action).checked)
		{
			do
			{
				el = document.getElementById('mark_'+action+'_messageid_'+messageids[i][0]);
				if (el.checked) t.value += (i > 0 ? ',' : '') + el.value;
			} while (++i < j);
		}
	}
}

function selectContact(x, target)
{
	var y = x.options[x.selectedIndex].value, t = x.form.elements[target];
	if (y && t)
	{
		if (y.indexOf("'") > -1) y = '"' + y + '"';
		else if (NUMBER.test(y) || y.indexOf('"') > -1) y = "'" + y + "'";

		var contacts = t.value ? t.value.split(/\s*,\s*/) : [];
		if (contacts.indexOf(y) == -1)
		{
			contacts[contacts.length] = y;
			t.value = contacts.join(', ');
		}
	}
}

function checkquicksearch(form)
{
	var q = form.elements['data[q]'];

	if (EMPTY.test(q.value) || q.value == 'Zoeken')
	{
		q.focus();
		return false;
	}

	var w = form.elements['where'], o = w.options[w.selectedIndex];

	switch (o.text)
	{
		case 'GoT':
			form.elements['data[forums][]'].disabled = true;
			return true;
		case 'Dit forum':
			return true;
		case 'Dit topic (AND)':
			window.location.href = board_script_url + '/list_messages/' + o.value + '?data%5Bfilter_keywords%5D=' + escape(q.value) + '&data%5Bboolean%5D=AND';
			return false;
		case 'Dit topic (OR)':
			window.location.href = board_script_url + '/list_messages/' + o.value + '?data%5Bfilter_keywords%5D=' + escape(q.value) + '&data%5Bboolean%5D=OR';
			return false;
		case 'Dit topic (NOT)':
			window.location.href = board_script_url + '/list_messages/' + o.value + '?data%5Bfilter_keywords%5D=' + escape(q.value) + '&data%5Bboolean%5D=AND%20NOT';
			return false;
		case 'Dit topic (poster)':
			window.location.href = board_script_url + '/list_messages/' + o.value + '?data%5Bfilter_userids%5D=' + escape(q.value);
			return false;
		case 'Google':
			google(q.value);
			return false;
	}

	return false;
}

function google(q)
{
	window.open('http://www.google.com/search?q='+escape(q), '_blank');
}

function checkquickloginform(form)
{
	if (EMPTY.test(form.elements['data[username]'].value) || EMPTY.test(form.elements['data[password]'].value))
	{
		window.location.href = board_script_url + '/login';
		return false;
	}
	else if (md5_vm_test())
	{
		md5_password(form, document.forms['quicklogin_shadow']);
		return false;
	}
	return true;
}

function checksearchform(form)
{
	if (EMPTY.test(form.elements['data[q]'].value)
		&& EMPTY.test(form.elements['data[poster]'].value)
		&& EMPTY.test(form.elements['data[topicstarter]'].value))
	{
		alert('Geen trefwoorden / poster of topicstarter opgegeven');
		form.elements['data[q]'].focus();
		return false;
	}
	return true;
}

function checkregisterform(form)
{
	var s = form.elements['data[nickname]'];
	if (EMPTY.test(s.value))
	{
		alert('Geen nicknaam opgegeven');
		s.focus();
		return false;
	}
	s = form.elements['data[pwd1]'];
	if (EMPTY.test(s.value))
	{
		alert('Geen wachtwoord opgegeven');
		s.focus();
		return false;
	}
	s = form.elements['data[pwd2]'];
	if (EMPTY.test(s.value))
	{
		alert('Voer je wachtwoord nogmaals in ter bevestiging');
		s.focus();
		return false;
	}
	if (s.value != form.elements['data[pwd1]'].value)
	{
		alert('Bevestigd wachtwoord is niet gelijk aan het originele wachtwoord');
		s.focus();
		return false;
	}
	s = form.elements['data[email]'];
	if (EMPTY.test(s.value))
	{
		alert('Voer je email adres in');
		s.focus();
		return false;
	}
	if (!EMAIL.test(s.value))
	{
		alert('Ongeldig email adres');
		s.focus();
		return false;
	}
	s = form.elements['data[birthday]'];
	if (!NODATE.test(s.value) && !BIRTHDAY.test(s.value))
	{
		alert('Ongeldig formaat voor geboortedatum');
		s.focus();
		return false;
	}
	return true;
}

function checkedituserform(form)
{
	var s = form.elements['data[email]'];
	if (!EMPTY.test(s.value) && !EMAIL.test(s.value))
	{
		alert('Ongeldig email adres');
		s.focus();
		return false;
	}
	s = form.elements['data[msn]'];
	if (!EMPTY.test(s.value) && !EMAIL.test(s.value))
	{
		alert('Ongeldig MSN adres');
		s.focus();
		return false;
	}
	s = form.elements['data[birthday]'];
	if (!NODATE.test(s.value) && !BIRTHDAY.test(s.value))
	{
		alert('Ongeldig formaat voor geboortedatum');
		s.focus();
		return false;
	}
	s = form.elements['data[iconurl]'];
	if (!EMPTY.test(s.value) && !URL.test(s.value))
	{
		alert('Ongeldige webiconlocatie');
		s.focus();
		return false;
	}
	s = form.elements['data[pwd]'];
	if (EMPTY.test(s.value))
	{
		alert('Voer je wachtwoord in ter bevestiging');
		s.focus();
		return false;
	}
	return true;
}

function checkpreferencesform(form)
{
	var s = form.elements['data[customcss]'];
	if (s && !EMPTY.test(s.value) && !URL.test(s.value))
	{
		alert('Ongeldige custom stylesheet url');
		s.focus();
		return false;
	}

	s = form.elements['accesskeys'];
	var i = 0, a=[], val;
	do
	{
		if ((val=s[i].value.toLowerCase()) != '')
		{
			if (!/^[a-z]$/i.test(val))
			{
				alert('Ongeldig teken "'+val+'" voor accesskey "'+s[i].id+'"; alleen letters zijn toegestaan');
				s[i].focus();
				return false;
			}
			if (a[val])
			{
				alert('Accesskey "'+val+'" al gebruikt voor "'+a[val]+'"; je kan niet dezelfde key aan meerdere acties toekennen');
				s[i].focus();
				return false;
			}
			a[val] = s[i].id;
			s[i].value = val;
		}
	} while (++i < s.length);

	s = form.elements['data[limit]'];
	if (!NUMBER.test(s.value) || parseInt(s.value,10) <= 0)
	{
		alert('Aantal berichten per pagina moet numeriek zijn en minimaal 1');
		s.focus();
		return false;
	}

	setdata(form,'accesskeys')
	return true;
}

function checkadminform(form,isalias)
{
	if (form.elements['data[delete]'] && form.elements['data[delete]'].checked)
	{
		if (isalias || form.elements['realdelete'][1].checked)
		{
			return confirm('Weet je zeker dat je ' + (isalias ? 'deze alias' : 'het hele topic') + ' wilt deleten?');
		}
		else
		{
			var x = form.elements['data[forumid]'], i = x.options.length;
			while (i--)
			{
				if (x.options[i].value == '46')
				{
					form.elements['data[delete]'].checked = false;
					form.elements['data[move]'].checked = true;
					x.selectedIndex = i;
					return true;
				}
			}
			alert ('TrashCan niet gevonden!');
			return false;
		}
	}
	return true;
}

function checkquickreply()
{
	if ((form = document.forms['quickreply_form']))
	{
		if (!EMPTY.test(form.elements['data[content]'].value))
		{
			form.elements['data[type]'].value = 'preview';
			form.submit();
			return false;
		}
	}

	return true;
}

function closeandsubmit(form)
{
	var o = form.elements['data[typeid]'];
	if (o.tagName.toLowerCase() == 'select')
	{
		var i = o.options.length;
		while (i--)
		{
			if (o.options[i].value == 'Closed')
			{
				o.selectedIndex = i;
				break;
			}
		}

		document.getElementById('status').checked = true;
	}
	else
	{
		o.value = 'Closed';
		form.elements['action'].value = 'frontend_admin';
	}

	form.elements['data[type]'].value = 'send';

	var submit = typeof form.onsubmit == 'function' ? form.onsubmit() : true;
	if (submit !== false) form.submit();
}

function toggle_radio(form, el)
{
	var radio = document.forms[form].elements[el];
	if (radio[0].checked) radio[1].checked = true;
	else radio[0].checked = true;
}

function scrolltoanchor(h)
{
	if (!h) h = window.location.hash;
	if (h != '') window.location.hash = h;
}

function setDefaultOption(select)
{
	var nd = -1;
	for (var o = select.options, i = 0; i < o.length; i++)
	{
		if (o[i].className == 'defaultSelected')
		{
			nd = i;
			break;
		}
		else if (nd == -1 && !o[i].getAttribute('disabled'))
		{
			nd = i;
		}
	}

	if (nd > -1)
		select.selectedIndex = nd;
	else
		select.disabled = true;
}

function encrypt_password(form)
{
	if (form.elements['data[passwordencryption]'].checked && !form.elements['data[passwordencryption]'].disabled)
	{
		if (md5_vm_test())
		{
			md5_password(form,document.forms['login_form_shadow']);
			return false;
		}
		else
		{
			form.elements['data[passwordencryption]'].checked = false;
			return confirm('Je browser is niet in staat je wachtwoord te versleutelen\n\nLog in zonder versleuteling?');
		}
	}
	return true;
}

function md5_password(form1,form2)
{
	var pwd = form1.elements['data[password]'].value;
	var uname = form1.elements['data[username]'].value;
	var reactid = form1.elements['data[reactid]'].value;
	form2.elements['data[username]'].value = uname;
	form2.elements['data[password]'].value = hex_md5(hex_md5(pwd)+uname+reactid);
	if (typeof form1.elements['data[locksession2ip]'] != 'undefined') form2.elements['data[locksession2ip]'].disabled = !form1.elements['data[locksession2ip]'].checked;
	form2.submit();
}

function setdata(form,data)
{
	var s = form.elements[data], a=[];
	if (s != null)
	{
		if (typeof s.length != 'undefined')
		{
			var i = s.length;
			while (i--) a[s[i].id] = s[i].value;
		}
		else a[s.id] = s.value;

		form.elements['data['+data+']'].value = serialize(a);
	}
}

function unserialize(data)
{
	var re = /(\w):([\d.]+)[:;]/g;
	re.lastIndex = 0;
	return unserialize_do(re, data);
}

function unserialize_do(re, data)
{
	var cur, ret = '', i, key;
	if ((cur = re.exec(data)) !== null)
	{
		switch (cur[1])
		{
			case 'a':
			case 'o':
				ret = cur[1] == 'a' ? [] : {};
				i = cur[2];
				while (i--)
				{
					key = unserialize_do(re, data);
					ret[key] = unserialize_do(re, data);
				}
				break;
			case 's':
				ret = data.substr(re.lastIndex+1, cur[2]);
				re.lastIndex += cur[2] - 1;
				break;
			case 'i':
			case 'd':
				ret = cur[2] / 1;
				break;
			case 'b':
				ret = cur[2] ? true : false;
				break;
		}
	}

	return ret;
}

function serialize(obj)
{
	if (typeof obj == 'undefined')
		return '';
	else if (obj === null)
		return 'N;';

	var serialized = '';
	switch (obj.constructor)
	{
		case Array:
			serialized = 'a:';
		case Object:
			if (serialized == '') serialized = 'o:';
			var item, count = 0, value, content = '';
			for (item in obj)
			{
				if ((value = serialize(obj[item])) != '')
				{
					content += serialize(isNaN(item)?item:parseInt(item,10)) + value;
					count++;
				}
			}
			serialized += count + ':{' + content + '}';
			break;
		case String:
			obj = obj.replace(/\r\n|\r|\n/g, '\r\n');
			serialized = 's:' + obj.length + ':"' + obj + '";';
			break;
		case Number:
			serialized = (Math.floor(obj) == obj ? 'i' : 'd') + ':' + obj + ';';
			break;
		case Boolean:
			serialized = 'b:' + (obj == true ? 1 : 0) + ';';
			break;
	}

	return serialized;
}

function external_links(rootid)
{
	var root = document;
	if (rootid && !(root = document.getElementById(rootid))) return false;

	var c = root.getElementsByTagName('a'), a, i = 0, attr;
	var re = /(^|\s)external(\s|$)/;
	while ((a = c[i++]))
	{
		attr = a.getAttribute('rel');
		if (attr && re.test(attr))
		{
			a.target = '_blank';
//			a.onclick = open_external_link;
		}
	}

	return true;
}

function open_external_link(e)
{
	if (!e) e = event;
	if (!leftClick(e) || e.ctrlKey || e.shiftKey) return true;
	window.open(this.href);
	return false;
}

function leftClick(e)
{
	return ((typeof e.which == 'undefined') ? (e.button == 0) : (e.which == 1 || e.button == 0));
}

function sitestat(ns_l)
{
	ns_l+='&amp;ns__t='+(new Date()).getTime();
	var ns_pixelUrl=ns_l;
	var ns_0=document.referrer;
	ns_0=(ns_0.lastIndexOf('/')==ns_0.length-1)?ns_0.substring(ns_0.lastIndexOf('/'),0):ns_0;
	if(ns_0.length>0)ns_l+='&amp;ns_referrer='+escape(ns_0);
	if(document.images)
	{
		var ns_1=new Image();
		ns_1.src=ns_l;
	}
	else
		document.write('<img src="'+ns_l+'" width="1" height="1" alt="">');
}
