// browser detect object
var is = {
    opera: !!window.opera,
    ie: /*@cc_on!@*/false,
    khtml: navigator.userAgent.indexOf('KHTML') > -1,
    gecko: navigator.userAgent.indexOf('KHTML') == -1 && navigator.userAgent.indexOf('Gecko') > -1,
    mac: navigator.userAgent.indexOf('Macintosh') > -1
}

Object.extend = function(dest, source, allowOverwrite)
{
    for (var prop in source)
    {
	if (source.hasOwnProperty(prop) && (allowOverwrite || !dest.hasOwnProperty(prop)))
	    dest[prop] = source[prop];
    }

    return dest;
}

Object.extend(Array.prototype,
{
    indexOf: function(searchElement, fromIndex)
    {
	var l = this.length, i = 0;
	if (fromIndex)
	{
	    i = fromIndex;
	    if (i < 0)
	    {
		i += l;
		if (i < 0) i = 0;
	    }
	}

	while (i < l)
	{
	    if (this[i] === searchElement) return i;
	    i++;
	}

	return -1;
    },
    forEach: function(func, obj)
    {
	for (var i = 0, l = this.length; i < l; i++)
	{
	    if (i in this)
		func.call(obj, this[i], i, this);
	}
    },
    filter: function(func, obj)
    {
	var res = [], val;
	for (var i = 0, l = this.length; i < l; i++)
	{
	    if (i in this)
	    {
		val = this[i]; // in case func mutates this
	            if (func.call(obj, val, i, this))
		    res.push(val);
	    }
	}

	return res;
    }
});

// Generics
['forEach', 'filter', 'slice'].forEach(
    function(func)
    {
	if (!(func in Array))
	{
	    Array[func] = function(obj)
	    {
		return this.prototype[func].apply(obj, Array.prototype.slice.call(arguments, 1));
	    }
	}
    }
);

Object.extend(String.prototype,
{
    trim: function()
    {
	return this.replace(/^\s+|\s+$/, '');
    },
    ucFirst: function()
    {
	return this.charAt(0).toUpperCase() + this.substr(1);
    },
    escapeHtml: function()
    {
	var escapeChars = {
	    '&': '&amp;',
	    '<': '&lt;',
	    '>': '&gt;',
	    '"': '&quot;'
	};

	return this.replace(/[&<>"]/g, function(c) { return escapeChars[c]; });
    },
    unescapeHtml: function()
    {
	var namedEntities = {
	    'amp': '&',
	    'lt': '<',
	    'gt': '>',
	    'quot': '"',
	    'euro': String.fromCharCode(8364)
	};

	return this.replace(
	    /&(amp|lt|gt|quot|euro|#\d+);/g,
	    function(c,n)
	    {
		return namedEntities[n] || String.fromCharCode(n.substr(1));
	    }
	);
    }
});

Object.extend(Function.prototype,
{
    bind: function()
    {
	var handler = this, args = Array.slice(arguments, 0), obj = args.shift();

	return function()
	{
	    return handler.apply(obj, args.concat(Array.slice(arguments, 0)));
	}
    }
});

RegExp.escape = function(string)
{
    return string.replace(/([.*+?^${}()|[\]\/\\])/g, '\\$1');
}

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 (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 getElementsByClassName(className, nodeName, parentElement, callback)
{
    if (!nodeName)
	nodeName = '*';

    if (!parentElement)
	parentElement = document;

    var results = [], multiple = className.indexOf('|') > -1, s, i = 0, element;

    if (parentElement.getElementsByClassName && nodeName == '*' && !multiple)
    {
	results = parentElement.getElementsByClassName(className);

	if (callback)
	    Array.forEach(results, callback);
    }
    else if (document.evaluate && !multiple)
    {
	s = document.evaluate(
	    ".//" + nodeName + "[contains(concat(' ', @class, ' '), ' " + className + " ')]",
	    parentElement,
	    null,
	    XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
	    null
	);

	while ((element = s.snapshotItem(i++)))
	{
	    results.push(element);
	    if (callback)
		callback(element);
	}
    }
    else
    {
	s = parentElement.getElementsByTagName(nodeName);
	var re = getClassRegExp(className), elementClassName;

	while ((element = s[i++]))
	{
	    elementClassName = element.className;
	    if (	elementClassName.length &&
		(	elementClassName == className ||
		    re.test(elementClassName)
		)
	    )
	    {
		results.push(element);
		if (callback)
		    callback(element);
	    }
	}
    }

    return results;
}

function is_ignorable(nod)
{
    return (nod.nodeType == 8 || (nod.nodeType == 3 && !/[^\t\n\r ]/.test(nod.data)));
}

function first_child(par, nodeName)
{
    if (par && par.nodeType == 1)
    {
	var res = par.firstChild;
	if (nodeName)
	{
	    nodeName = nodeName.toLowerCase();
	    do
	    {
		if (res.nodeName.toLowerCase() == nodeName)
		    return res;
	    }
	    while ((res = res.nextSibling));
	}
	else
	{
	    do
	    {
		if (!is_ignorable(res))
		    return res;
	    }
	    while ((res = res.nextSibling));
	}
    }

    return null;
}

function last_child(par, nodeName)
{
    if (par && par.nodeType == 1)
    {
	var res = par.lastChild;
	if (nodeName)
	{
	    nodeName = nodeName.toLowerCase();
	    do
	    {
		if (res.nodeName.toLowerCase() == nodeName)
		    return res;
	    }
	    while ((res = res.previousSibling));
	}
	else
	{
	    do
	    {
		if (!is_ignorable(res))
		    return res;
	    }
	    while ((res = res.previousSibling));
	}
    }

    return null;
}

function node_after(sib, nodeName)
{
    if (sib)
    {
	if (nodeName)
	{
	    nodeName = nodeName.toLowerCase();
	    while ((sib = sib.nextSibling))
	    {
		if (sib.nodeName.toLowerCase() == nodeName)
		    return sib;
	    }
	}
	else
	{
	    while ((sib = sib.nextSibling))
	    {
		if (!is_ignorable(sib))
		    return sib;
	    }
	}
    }

    return null;
}

function node_before(sib, nodeName)
{
    if (sib)
    {
	if (nodeName)
	{
	    nodeName = nodeName.toLowerCase();
	    while ((sib = sib.previousSibling))
	    {
		if (sib.nodeName.toLowerCase() == nodeName)
		    return sib;
	    }
	}
	else
	{
	    while ((sib = sib.previousSibling))
	    {
		if (!is_ignorable(sib))
		    return sib;
	    }
	}
    }

    return null;
}

function addClass(element, className)
{
    if (element.className.length)
    {
	var classes = getClassList(element);
	if (classes.indexOf(className) == -1)
	{
	    classes.push(className);
	    setClassList(element, classes);
	}
    }
    else
	element.className = className;
}

function removeClass(element, className)
{
    var classes = getClassList(element), index;
    if ((index = classes.indexOf(className)) > -1)
    {
	delete classes[index];
	setClassList(element, classes);
    }
}

function replaceClass(element, oldclass, newclass)
{
    var classes = getClassList(element), index;
    if ((index = classes.indexOf(oldclass)) > -1 && classes.indexOf(newclass) == -1)
    {
	classes[index] = newclass;
	setClassList(element, classes);
    }
}

function hasClass(element, className)
{
    var elementClassName = element.className;
    return	elementClassName.length &&
	(	elementClassName == className ||
	    getClassRegExp(className).test(elementClassName)
	);
}

function getClassList(element)
{
    return element.className.length ? element.className.split(/\s+/) : [];
}

function setClassList(element, classes)
{
    element.className = classes.join(' ');
}

var regExpCache = {};
function getClassRegExp(className)
{
    if (!(className in regExpCache))
	regExpCache[className] = new RegExp('(^|\\s)' + className + '(\\s|$)');

    return regExpCache[className];
}

function getOffsetTop(el, offsetParent)
{
    var offsetTop = 0;
    if (!offsetParent) offsetParent = null;
    do
    {
	offsetTop += el.offsetTop
    }
    while ((el = el.offsetParent) != offsetParent);

    return offsetTop;
}

function getOffsetLeft(el, offsetParent)
{
    var offsetLeft = 0;
    if (!offsetParent) offsetParent = null;
    do
    {
	offsetLeft += el.offsetLeft
    }
    while ((el = el.offsetParent) != offsetParent);

    return offsetLeft;
}

function getDocumentProperty(prop)
{
    return document.documentElement && document.compatMode != 'BackCompat' ? document.documentElement[prop] : document.body[prop];
}

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 = getClassRegExp('external');
    while ((a = c[i++]))
    {
	attr = a.getAttribute('rel');
	if (attr && (attr == 'external' || re.test(attr)))
	    a.target = '_blank';
    }

    return true;
}

// Generic Cookie functies
function getCookie(name)
{
    var cookie = document.cookie.split('; '), i = cookie.length, crumb;
    while (i--)
    {
	crumb = cookie[i].split('=');
	if (crumb[0] == name)
	    return crumb[1] != undefined ? unescape(crumb[1]) : null;
    }

    return null;
}

function setCookie(sName, sValue)
{
    document.cookie = sName + '=' + escape(sValue) + '; expires=Fri, 31 Dec 2099 23:59:59 GMT; path=/; domain=.' + document.domain;
}

function winopen(url, winname, width, height, extra)
{
    if (!extra) extra = ''; else extra = ',' + extra;
    var popup = window.open(url,winname,'toolbar=no,location=no,menubar=no,width='+width+',height='+height+',resizable=yes,status=no'+extra);
    try { popup.focus(); } catch(e) {}
}

function cancelEvent(e)
{
    if (e.preventDefault)
    {
	e.preventDefault();
    }
    else if (e.cancelBubble != undefined)
    {
	if (e.keyCode) e.keyCode = 0;
	e.returnValue = 0;
	e.cancelBubble = true;
    }

    return false;
}

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="">');
}

/* 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 switchpage(x,url,suffix)
{
    var s = getSelectedValue(x);
    if (s != '') window.location.href = url + '/' + s + (suffix? suffix : '');
}

function switchforum(x)
{
    switchpage(x, board_script_url + '/list_topics');
}

function switchdestinationforum(x)
{
    return getSelectedValue(x) != '';
}

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)
{
    switchpage(x, board_script_url + '/faq');
}

function switchforumpage(x,forumid)
{
    switchpage(x, board_script_url + '/list_topics/' + forumid);
}

function switchcontactpage(form)
{
    switchpage(form.elements['data[offset]'], board_script_url + '/list_contacts');
}

function switchuserpage(form)
{
    var name = form.elements['data[name]'].value;
    switchpage(form.elements['data[offset]'], board_script_url + '/list_users', (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 = getSelectedValue(x), 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 (s && !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 getSelectedValue(select)
{
    return select.options[select.selectedIndex].value;
}

function setdata(form,data)
{
    var s = form.elements[data], a=[];
    if (s != null)
    {
	if (s.length)
	{
	    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);
    }
}

//-- Browsercheck
var banner = null, bannerhide = 0, sky = null, quicksearch = null, qshide = 0;

function init_banner()
{
    if ((banner = document.getElementById('mainbanner')))
    {
	if (	(is.ie && /<(object|select|embed|applet)/i.test(banner.innerHTML)) ||
	    (	(	is.opera ||
		    is.khtml
		) &&
		/<iframe/i.test(banner.innerHTML)
	    )
	)
	{
	    banner.left = getOffsetLeft(banner);
	    banner.top = getOffsetTop(banner);
	    bannerhide = 1;
	}
    }
}

function show_banner()
{
    if (banner && bannerhide) banner.style.display = 'block';
    if (quicksearch && qshide) quicksearch.style.display = 'block';
}

function hide_banner(submenu)
{
    if (bannerhide || qshide)
    {
	if (!submenu.left)
	{
	    submenu.left = getOffsetLeft(submenu);
	    submenu.top = getOffsetTop(submenu);
	}

	if (banner && bannerhide)
	{
	    if (!(submenu.left > banner.left + banner.clientWidth || submenu.left + submenu.clientWidth < banner.left ||
		submenu.top > banner.top + banner.clientHeight || submenu.top + submenu.clientHeight < banner.top)) banner.style.display = 'none';
	}
    
	if (quicksearch && qshide)
	{
	    if (!(submenu.left > quicksearch.left + quicksearch.clientWidth || submenu.left + submenu.clientWidth < quicksearch.left ||
		submenu.top > quicksearch.top + quicksearch.clientHeight || submenu.top + submenu.clientHeight < quicksearch.top)) quicksearch.style.display = 'none';
	}
    }
}

function init_sky()
{
    if ((sky = document.getElementById('skyscraper')))
    {
	var w = getDocumentProperty('clientWidth');
	var h = getDocumentProperty('scrollHeight');
	var o = document.getElementById('layout').offsetLeft + sky.offsetLeft + sky.clientWidth;

	if (w > o && h > skytop + 600)
	{
	    if ((w - o) > 40)
	    {
		//-- extra breed
		google_ad_width = 160;
		google_ad_format = '160x600_as';
		sky.style.width = '168px';
	    }

	    document.write('<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"><\/script>');

	    sky.style.position = 'absolute';
	    sky.style.top = skytop + 'px';
	    sky.style.visibility = 'visible';
	}
	else
	{
	    sky.style.display = 'none';
	    sky = null;
	}
    }
}

function show_sky()
{
    if (sky) sky.style.display = 'block';
}

function hide_sky(code)
{
    var left = getOffsetLeft(code), top = getOffsetTop(code);
    if (sky)
    {
	var skyleft = getOffsetLeft(sky), skytop = getOffsetTop(sky);
	if (!(left > skyleft + sky.clientWidth || left + code.clientWidth < skyleft ||
	    top > skytop + sky.clientHeight || top + code.clientHeight < skytop)) sky.style.display = 'none';
    }
}

//-- skyscraper slide
var skymove = null;
var scrolltop = -1;
var skytop = 120;
function movesky()
{
    if (sky)
    {
                if (animate)
                {
                        if (skymove) clearTimeout(skymove);
                        skymove = setTimeout('slidesky()', 300);
                }
                else
                {
                        sky.style.top = (getDocumentProperty('scrollTop') + skytop) + 'px';
                }
    }
}

function slidesky()
{
    scrolltop = getDocumentProperty('scrollTop');
    var curtop = sky.offsetTop;

    if (curtop + 600 < scrolltop) curtop = scrolltop - 600;
    else if (curtop > scrolltop + getDocumentProperty('clientHeight')) curtop = getDocumentProperty('clientHeight');
    var diff = scrolltop + 50 - curtop;
    if (diff > 60) diff = 60;
    if (diff < -60) diff = -60;
    var newtop = curtop + Math.round(diff / 3);
    if (newtop < skytop)
    {
	newtop = skytop;
	diff = 0;
    }
    sky.style.top = newtop + 'px';
    if (diff) skymove = setTimeout('slidesky()', 30);
    else skymove = null;
}

function qs_init()
{
    quicksearch = document.getElementById('quicksearch');
    if (quicksearch)
    {
	quicksearch.left = getOffsetLeft(quicksearch);
	quicksearch.top = getOffsetTop(quicksearch);
	qshide = is.ie;
    }
}

var adsense_target = null;
function google_ad_request_done(google_ads)
{
    var el = adsense_target && document.getElementById('as_'+adsense_target), l;

    if (!el) return false;

    if ((l = google_ads.length) == 0)
    {
	el.style.display = 'none';
	return false;
    }

    var s = [], i = 0, google_ad;
    var feedbackurl = 'http://services.google.com/feedback/abg?url='+encodeURIComponent(adsense_page_url)+'&hl=nl&client='+google_ad_client;

    if (!window.defaultStatus) window.defaultStatus = '';

    while ((google_ad = google_ads[i++]))
    {
	feedbackurl += '&adU='+google_ad.visible_url+'&adT='+encodeURIComponent(google_ad.line1).replace(/%20/g, '+');

	/*@cc_on
	    google_ad.line1 = IE_EuroFix(google_ad.line1);
	    google_ad.line2 = IE_EuroFix(google_ad.line2);
	    google_ad.line3 = IE_EuroFix(google_ad.line3);
	@*/

	s.push('<div class="ga n' + l + '">'
	    + '<a href="' + google_ad.url + '" onmouseover="window.status=\'ga naar ' + google_ad.visible_url + '\';return true" onmouseout="window.status=window.defaultStatus;return true"'+(external?' target="_blank"':'')+'>'
	    + '<span class="firstline">' + google_ad.line1 + '</span>'
	    + '<span class="nextlines">' + google_ad.line2 + '</span>'
	    + (google_ad.line3 ? ' <span class="nextlines">' + google_ad.line3 + '</span>' : '')
	    + '<span class="link">' + google_ad.visible_url + '</span>'
	    + '</a></div>');
    }

    s.push('<div class="left"><a href="'+feedbackurl+'&done=1"'+(external?' target="_blank"':'')+'>Ads door Google</a></div>'
	+ '<div class="right"><a href="https://adwords.google.com/select/OnsiteSignupLandingPage?client='+google_ad_client+'&referringUrl='+encodeURIComponent(adsense_page_url)+'&hl=nl&gl=NL"'+(external?' target="_blank"':'')+'>Adverteer hier</a></div>'
	+ '<div class="clear"><hr></div>');

    el.innerHTML = s.join('');

    return true;
}

function IE_EuroFix(text)
{
    for (var i = 0, replaced = ''; i < text.length; i++)
    {
	switch (text.charCodeAt(i))
	{
	    case 128:
		replaced += '&euro;';
		break;
	    case 381:
		replaced += '&acute;';
		break;
	    default:
		replaced += text.charAt(i);
	}
    }

    return replaced;
}

if (window.bc) window.onload = function()
{
    var foo = new Image();
    foo.src = board_template_url + 'html/bc.php?check=' + (Math.floor(Math.random() * 100000000) * 11 + (banner && banner.childNodes.length > 1 ? 5 : 0));
}

//-- Menu
var nav_current = [], nav_hide_delay = [];

function init_menu()
{
    var li = first_child(document.getElementById('sitenav'));
    while (li)
    {
	li.menuid = 'mainmenu';
	li.onmouseover = siteNavHover;
	li.onmouseout = siteNavHideCurrentSetDelay;
	li.submenu = init_submenu(li, 'mainmenu');

	li = node_after(li);
    }
}

function unload_menu()
{
    var li = first_child(document.getElementById('sitenav'));
    while (li)
    {
	li.submenu = null;
	li = node_after(li);
    }
}
window.onunload = unload_menu;

function init_submenu(menuitem, menuid)
{
    var submenu = first_child(menuitem);
    while (submenu)
    {
	if (submenu.tagName.toLowerCase() == 'div')
	{
	    submenu.menuid = menuid;
	    submenu.onmouseover = siteNavHideClearDelay;
	    submenu.onmouseout = siteNavHideCurrentDelay;
	    if (menueffect != 'nopacity')
	    {
		setOpacity(submenu, 0.95);
	    }
    
	    return submenu;
	}
    
	submenu = node_after(submenu);
    }

    return null;
}

function siteNavHover()
{
    if (this.menuid)
    {
	var submenu = this.submenu;
	var menuid = this.menuid;

	siteNavHideCurrent(menuid, submenu);

	if (submenu)
	{
	    hide_banner(submenu);
	    nav_current[menuid] = submenu;
	    submenu.style.visibility = 'visible';
	}
    }
}

function siteNavHideCurrent(menuid, submenu)
{
    siteNavHideClearDelay(0, menuid);

    if (nav_current[menuid] && nav_current[menuid] != submenu)
    {
	nav_current[menuid].style.visibility = 'hidden';
	nav_current[menuid] = null;
	show_banner();
    }
}

function siteNavHideCurrentFade(menuid)
{
    if (nav_current[menuid])
    {
	var opacity = nav_current[menuid].opacity - 0.05;
	if (opacity <= 0)
	{
	    siteNavHideCurrent(menuid);
	}
	else
	{
	    setOpacity(nav_current[menuid], opacity);
	    nav_hide_delay[menuid] = setTimeout('siteNavHideCurrentFade(\''+menuid+'\')', 50);
	}
    }
}

function siteNavHideCurrentDelay()
{
    if (this.submenu)
    {
	siteNavHideCurrentSetDelay(0, this.menuid);
	return true;
    }

    return false;
}

function siteNavHideCurrentSetDelay(e, menuid)
{
    if (!menuid && this) menuid = this.menuid;

    if (menuid)
    {
	if (menueffect == 'fade' && !is.opera)
	{
	    nav_hide_delay[menuid] = setTimeout('siteNavHideCurrentFade(\''+menuid+'\')', 500);
	}
	else
	{
	    nav_hide_delay[menuid] = setTimeout('siteNavHideCurrent(\''+menuid+'\')', 500);
	}
    }
}

function siteNavHideClearDelay(e, menuid)
{
    if (!menuid && this) menuid = this.menuid;

    if (menuid && nav_hide_delay[menuid])
    {
	clearTimeout(nav_hide_delay[menuid]);
	nav_hide_delay[menuid] = null;
	if (menueffect == 'fade' && nav_current[menuid])
	{
	    setOpacity(nav_current[menuid], 0.95);
	}
    }
}

function setOpacity(el, opacity)
{
    if (el && (!el.opacity || el.opacity != opacity))
    {
	el.opacity = opacity;
	if (el.filters)
	{
	    if (el.filters.alpha)
	    {
		el.filters.alpha.opacity = opacity * 100;
	    }
	    else
	    {
		el.style.filter = 'alpha(opacity=' + (opacity * 100) + ')';
	    }
	}
	else
	{
	    el.style.opacity = opacity;
	}
    }
}

//-- Inklap functies
function toggle_categorydisplay(img)
{
    var row = img.parentNode, display, selects, i;

    if (img.src == fclosed.src)
    {
	img.src =  fopen.src;
	display = '';
	delete klipklapcookie[img.id];
    }
    else if (img.src == fopen.src)
    {
	img.src = fclosed.src;
	display = 'none';
	klipklapcookie[img.id] = 1;
    }

    while (row)
    {
	if (row.tagName.toLowerCase() == 'tr')
	{
	    row.className = display ? '' : 'hide';

	    while ((row = node_after(row)))
	    {
		row.style.display = display;
		if (is.ie)
		{
		    selects = row.getElementsByTagName('select'), i = selects.length;
		    while (i--)
			selects[i].style.display = display;
		}
	    }

	    writeCookies();
	    break;
	}

	row = row.parentNode;
    }
}

function readCookies()
{
    var cookiecontent = getCookie('klipklapcookie');
    if (cookiecontent)
    {
	var temp = cookiecontent.split(','), i = temp.length;
	while (i--)
	    klipklapcookie[temp[i]] = 1;

	i = categories.length;
	while (i--)
	    if (klipklapcookie[categories[i]])
		toggle(categories[i]);
    }

    skipcookie = false;
}

function writeCookies()
{
    if (!skipcookie)
    {
	var temp = [];
	for (var category in klipklapcookie)
	    if (klipklapcookie.hasOwnProperty(category))
		temp.push(category);
    
	setCookie('klipklapcookie', temp.join(','));
    }
}

function toggle(name)
{
    var el = document.getElementById(name);
    if (el && typeof el.onclick == 'function') el.onclick();
}

function toggle_userdata(img, msgid)
{
    if (img.src == fclosed.src)
	img.src =  fopen.src;
    else if (img.src == fopen.src)
	img.src = fclosed.src;
    else if (img.src == ftsclosed.src)
	img.src = ftsopen.src;
    else if (img.src == ftsopen.src)
	img.src = ftsclosed.src;

    var el = document.getElementById('extra_'+msgid), admin_display;
    if (el.style.display == 'block')
    {
	el.style.display = 'none';
	admin_display = '';
    }
    else
    {
	el.style.display = 'block';
	admin_display = 'visible';
    }

    // admin
    el = document.getElementById('admin_'+msgid);
    if (el) el.className = admin_display;
}

function toggle_admin(img, hideall)
{
    var display;

    if (img.src == aclosed.src)
    {
	img.src =  aopen.src;
	display = '';
	delete klipklapcookie[img.id];
    }
    else if (img.src == aopen.src)
    {
	img.src = aclosed.src;
	display = 'none';
	klipklapcookie[img.id] = 1;
    }

    var fe = node_after(img.parentNode);
    do
    {
	if (hideall || fe.tagName.toLowerCase() == 'dl' || fe.tagName.toLowerCase() == 'fieldset' || fe.tagName.toLowerCase() == 'table' || fe.tagName.toLowerCase() == 'ol')
	    fe.style.display = display;
    }
    while ((fe = node_after(fe)));

    writeCookies();
}

var updatetracker = null, slider_delay = null;
function init_tracker(sessiontime, prefs_linktolastpage)
{
    updatetracker = document.getElementById('updatetracker');

    if (updatetracker)
    {
	if (getCookie('tracker') == '1')
	{
	    updatetracker.className = 'open';
	    slide_tracker(500);
	    skytop = getOffsetTop(updatetracker) + updatetracker.clientHeight + 30;
	}
	else if (is.ie)
	{
	    // IE needs this
	    setTimeout(function(){updatetracker.style.clip = 'rect(0px,'+ updatetracker.offsetWidth + 'px,1200px,' + (updatetracker.offsetWidth - 16) + 'px)';}, 10);
	}

	// mark new links if sessiontime cookie is set
	var tracker = document.getElementById('headeractivetopics');
	if (tracker)
	{
	    if (sessiontime == 0) sessiontime = getCookie('SessionTime');
	    if (sessiontime != null && sessiontime > 0)
		mark_links(node_after(tracker), sessiontime);
	    if (prefs_linktolastpage)
		linktolastpage(node_after(tracker));
	}

	// mark new links if Tnet cookie is set
	tracker = document.getElementById('headerheadlines');
	if (tracker)
	{
	    var tc = getCookie('tc');
	    if (tc !== null)
	    {
		var tcontent = tc.split(',');
		sessiontime = tcontent.length == 2 ? parseInt(tcontent[0], 10) : 0;
		mark_links(node_after(tracker), sessiontime);
	    }
	}

	updatetracker.style.visibility = 'visible';
    }
}

function mark_links(tracker, sessiontime)
{
    var el = tracker.getElementsByTagName('a'), i = 0, a, attr, match;
    var re = /(^|\s)time:(\d{10})(\s|$)/;
    while ((a = el[i++]))
    {
	attr = a.getAttribute('rel');
	if (attr)
	{
	    match = re.exec(attr);

	    if (match && parseInt(match[2], 10) > sessiontime)
	    {
		addClass(a.parentNode, 'newlink');
	    }
	}
    }
}

function linktolastpage(tracker)
{
    var el = tracker.getElementsByTagName('a'), i = 0, a;
    if (is.ie)
    {
	var text = '';
	while ((a = el[i++]))
	{
	    text = a.firstChild.nodeValue;
	    a.firstChild.nodeValue = 'IE sucks';
	    a.href += '/last';
	    a.firstChild.nodeValue = text;
	}
    }
    else
    {
	while ((a = el[i++]))
	    a.href += '/last';
    }
}

function toggle_tracker()
{
    if (slider_delay) clearTimeout(slider_delay);
    slider_delay = null;
    if (updatetracker.className == 'closed')
    {
	updatetracker.className = 'open';
	skytop = getOffsetTop(updatetracker) + updatetracker.clientHeight + 30;
	if (sky) sky.style.top = skytop + 'px';
	slide_tracker((animate?12:300));
	setCookie('tracker', '1');
    }
    else
    {
	updatetracker.className = 'closed';
	slide_tracker((animate?-12:-300));
	setCookie('tracker', '0');
    }
}

function slide_tracker(s)
{
    var l = updatetracker.offsetLeft + s, w = updatetracker.parentNode.offsetWidth, t = updatetracker.offsetWidth - 16, next = true;
    if (l >= w)
    {
	l = --w;
	quicksearch.className = 'trackersupport';
	next = false;
    }
    else if (l < w - t)
    {
	l = w - t;
	quicksearch.className = '';
	skytop = 120;
	movesky();
	next = false;
    }
    updatetracker.style.left = l + 'px';
    updatetracker.style.clip = 'rect(0px,'+ (t + 16) + 'px,1200px,' + (w - l) + 'px)';
    if (next) slider_delay = setTimeout('slide_tracker('+s+')',20);
    else slider_delay = null;
}

//-- Message box editing functions
var target = null;
function initMessageBox()
{
    if (!target) target = document.getElementById('messageBox');
    if (target)
    {
	target.focus();
	if (target.createTextRange)
	{
	    target.onkeyup = storeCursor;
	    target.onclick = storeCursor;
	    target.onselect = storeCursor;
	    target.onselect();
	}

	if (!is.mac && target.tagName.toLowerCase() == 'textarea')
	{
	    if (target.createTextRange)
		target.onkeydown = shortkey;
	    else
		target.onkeypress = shortkey;
	}
    }
}

function storeCursor()
{
    this.cursorPos = document.selection.createRange().duplicate();
}

function det_replace(type, text)
{
    var val = '';
    switch (type)
    {
	case 'plain':
	    break;
	case 'AND':
	    if (text != '')	text = text.replace(/(\w+)\s+/g, '$1 AND ');
	    else text = ' AND ';
	    break;
	case 'OR':
	    if (text != '')	text = text.replace(/(\w+)\s+/g, '$1 OR ');
	    else text = ' OR ';
	    break;
	case 'brackets':
	    if (text != '')	text = '('+text+')';
	    else text = '()';
	    break;
	case 'title':
	case 'start':
	    if (text != '')	text = type+':('+text+')';
	    else text = type+':';
	    break;
	case 'bold':
	    text = '[b]'+text+'[/b]';
	    break;
	case 'italic':
	    text = '[i]'+text+'[/i]';
	    break;
	case 'underline':
	    text = '[u]'+text+'[/u]';
	    break;
	case 'strike':
	    text = '[s]'+text+'[/s]';
	    break;
	case 'sub':
	case 'sup':
	case 'small':
	case 'left':
	case 'center':
	case 'right':
	    text = '['+type+']'+text+'[/'+type+']';
	    break;
	case 'listbullet':
	    text = '[list]\r\n[*]'+(text.split(/\r?\n/).join('\r\n[*]'))+'\r\n[/list]';
	    break;
	case 'listnum':
	    text = '[list=1]\r\n[*]'+(text.split(/\r?\n/).join('\r\n[*]'))+'\r\n[/list]';
	    break;
	case 'bgcolor':
	    if ((val = prompt('Voer een hexadecimale kleurcode in:','#')))
		text = '[bgcolor='+val+']'+text+'[/bgcolor]';
	    break;
	case 'color':
	    if ((val = prompt('Voer een hexadecimale kleurcode in:','#')))
		text = '[color='+val+']'+text+'[/color]';
	    break;
	case 'url':
	    if (/^(http:\/\/|www\.)/i.test(text))
	    {
		if ((val = prompt('Voer omschrijving in:', text)))
		    text = '[url="'+text.replace(/(["\\])/g,'\\$1')+'"]'+val+'[/url]';
	    }
	    else
	    {
		val = prompt('Voer de URL in:','http:\/\/');
		if (val && val != 'http:\/\/')
		{
		    if (text == '') text = '[url]'+val+'[/url]';
		    else text = '[url="'+val.replace(/(["\\])/g,'\\$1')+'"]'+text+'[/url]';
		}
	    }
	    break;
	case 'img':
	    if (text == '')
	    {
		val = prompt('Voer de URL in:','http:\/\/');
		if (val && val != 'http:\/\/')
		    text = '[img]'+val+'[/img]';
	    }
	    else
	    {
		text = '[img]'+text+'[/img]';
	    }
	    break;
	case 'table':
	    text = '[table border=1 width=350 cellpadding=2 bordercolor=#000000]\r\n[tr]\r\n[td]'+(text.split(/\r?\n/).join('[/td]\r\n[/tr]\r\n[tr]\r\n[td]'))+'[/td]\r\n[/tr]\r\n[/table]';
	    break;
	case 'hr':
	    text += '[hr]';
	    break;
	case 'quote':
	    text += '[/quote]\r\n[quote]';
	    break;
    }

    return text;
}

function putStr(text)
{
    putExt('plain', text);
}

function putExt(type, text)
{
    if (target)
    {
	if (target.cursorPos)
	{
	    var cursorPos = target.cursorPos;
	    if (type != 'plain') text = cursorPos.text;
	    cursorPos.text = det_replace(type, text);
	}
	else if (target.selectionStart != undefined)
	{
	    // remember scrollposition
	    var scrollTop = target.scrollTop;

	    var sStart = target.selectionStart;
	    var sEnd = target.selectionEnd;
	    if (type != 'plain') text = target.value.substring(sStart, sEnd);
	    text = det_replace(type, text);
	    target.value = target.value.substr(0, sStart) + text + target.value.substr(sEnd);
	    var nStart = sStart == sEnd ? sStart + text.length : sStart;
	    var nEnd = sStart + text.length;
	    target.setSelectionRange(nStart, nEnd);

	    // reset scrollposition
	    target.scrollTop = scrollTop;
	}
	else
	{
	    if (type != 'plain') text = '';
	    target.value += det_replace(type, text);
	}

	target.focus();
	if (target.cursorPos) target.onselect();
    }
}

function shortkey(e)
{
    if (!e) e = event;

    var key = 0;
    if (e.keyCode) key = e.keyCode;
    else if (e.which) key = e.which - 32;

    if (e.ctrlKey && !e.shiftKey)
    {
	switch (key)
	{
	    case 66:
		putExt('bold');
		return cancelEvent(e);
	    case 73:
		putExt('italic');
		return cancelEvent(e);
	    case 83:
		putExt('strike');
		return cancelEvent(e);
	    case 85:
		putExt('underline');
		return cancelEvent(e);
	}
    }

    return true;
}

function increaseTextarea(img)
{
    if (!target) target = document.getElementById('messageBox');
    if (target)
    {
	if (target.style.height)
	{
	    target.style.height = '';
	    img.src = maximize.src;
	    img.title = 'Vergroot tekstveld';
	}
	else
	{
	    target.style.height = 2 * target.offsetHeight + 'px';
	    img.src = minimize.src;
	    img.title = 'Verklein tekstveld';
	}
    }
}

if (is.ie) document.onkeydown = function()
{
    var key = event.keyCode;
    var a = String.fromCharCode(key).toLowerCase();
    if (event.altKey && key > 64 && key < 91 && acckeys[a])
    {
	window.location.href = /^http:\/\//.test(acckeys[a]) ? acckeys[a] : board_script_url + acckeys[a];
	event.keyCode = 90; // use a valid keycode that is not in IE's context menu
	event.returnValue = 0;
	event.cancelBubble = true;
	return false;
    }

    return true;
}

function mark_topicstarter(user_id)
{
    var i = messageids.length, img;
    while (i--)
    {
	if (messageids[i][1] == user_id)
	{
	    img = document.getElementById('ts_'+messageids[i][0]);
	    if (img.src == fclosed.src) img.src = ftsclosed.src;
	    else img.src = ftsnone.src;
	    img.title = 'Topicstarter';

	    img = document.getElementById('oi_'+messageids[i][0]);
	    if (img.src == online.src) img.src = online_ts.src;
	    else img.src = offline_ts.src;
	    img.width = '14';
	    img.title = 'Topicstarter ' + img.title;
	}
    }
}

function user_images(warning)
{
    if (warning) showwarning = true;
    var im = getElementsByClassName('rml', 'img'), i = im.length;
    while (i--)
    {
	if (im[i].naturalWidth || im[i].complete)
	    scaleImage(0,im[i]);
	else if (typeof im[i].onreadystatechange != 'undefined')
	    im[i].onreadystatechange = scaleImage;
	else
	    im[i].onload = scaleImage;

	im[i].onerror = scaleImage;
	im[i].onabort = scaleImage;
    }

    if (is.ie && window.attachEvent) window.attachEvent('onload', user_images_ie); 
}

function user_images_ie()
{
    var im = document.images, i = im.length;
    while (i--)
    {
	if (hasClass(im[i], 'rml'))
	    scaleImage(0,im[i]);
    }
}

var showwarning = false;
function scaleImage(e, img)
{
    if (!img) img = this;
    var imgwidth = 0, imgheight = 0, el;

    if (img.width || img.complete)
    {
	if (img.naturalWidth)
	{
	    imgwidth = img.naturalWidth;
	    imgheight = img.naturalHeight;
	}
	else if (img.complete)
	{
	    var dum = new Image(); dum.src = img.src;
	    imgwidth = dum.width;
	    imgheight = dum.height;
	}

	if (imgwidth)
	{
	    if (img.onreadystatechange) img.onreadystatechange = null;
	    if (img.onload) img.onload = null;
	}

	var contentDiv = img.parentNode, inQuote = false;

	while (contentDiv)
	{
	    if (hasClass(contentDiv, 'content') || (inQuote = hasClass(contentDiv, 'message-quote-div')))
		break;

	    contentDiv = contentDiv.parentNode;
	}

	if (contentDiv)
	{
	    var maxWidth = contentDiv.offsetWidth - (inQuote ? 4 : 10);

	    if (imgwidth > maxWidth)
	    {
		maxWidth -= 2;
		if (img.parentNode.nodeName != 'A')
		{
		    if (!img.naturalWidth) img.naturalWidth = imgwidth;
		    if (!img.naturalHeight) img.naturalHeight = imgheight;
		    img.className += ' resized hand';
		    img.onclick = openImage;
		    el = img;
		}
		else
		{
		    img.className += ' resized2';
		    el = img.parentNode;
		}
    
		// create a nice warning when image is in normal post
		if (showwarning && imgwidth > 800 && !inQuote)
		{
		    var warning = document.createElement('div');
		    warning.className = 'resizewarning';
		    warning.style.width = ((img.width < maxWidth ? img.width : maxWidth) + 2) + 'px';
		    warning.innerHTML = '<div><small>Deze afbeelding is ' + imgwidth + ' * ' + imgheight + ' pixels' + (img.fileSize && img.fileSize > 0 ? ' en ' + Math.floor(img.fileSize/1024) + 'KB' : '') + ' groot. Hier op GoT verwachten we dat je <em>echte</em> thumbnails maakt.<br>Kijk in de <a href="'+board_script_url+'/faq/forumsurvival#images" onclick="window.open(this.href);return false">faq</a> als je niet weet hoe dit moet.</small></div>';
		    el.parentNode.insertBefore(warning, el.nextSibling);
		}
	    }
    
	    if (img.width > maxWidth)
	    {
		if (img.height) img.height = Math.round(maxWidth / img.width * img.height);
		img.width = maxWidth;
	    }
	}
    }
}

function openImage()
{
    var winwidth = (this.naturalWidth < screen.availWidth ? this.naturalWidth : screen.availWidth);
    var winheight = (this.naturalHeight < screen.availHeight ? this.naturalHeight : screen.availHeight);
    winopen(board_template_url+'html/showimage.html?'+escape(this.src),'',winwidth,winheight,'scrollbars=no,left=0,top=0');
}

function code_tags()
{
    var el = getElementsByClassName('phphighlight', 'table'), i = 0, table, row, div, pre, img, cw;

    while ((table = el[i++]))
    {
	row = table.rows[0];
	if (!(div = first_child(row.cells[row.cells.length - 1], 'div')))
	    continue;

	div.style.paddingBottom = '0px';

	pre = first_child(div);
	if (!pre || (pre.nodeName.toLowerCase() != 'pre' && pre.nodeName.toLowerCase() != 'code'))
	    continue;

	cw = div.clientWidth;
	if (div.scrollWidth > cw)
	{
	    div.orgWidth = cw;

	    if (is.ie)
	    {
		div.orgPadding = (div.scrollHeight - div.clientHeight) + 'px';
		div.style.paddingBottom = div.orgPadding;
	    }

	    pre.style.width = div.scrollWidth + 'px';

	    img = document.createElement('img');
	    img.src = aopen.src;
	    img.className = 'klipklap hand';
	    img.onclick = klipklap_code;
	    table.parentNode.insertBefore(img, node_before(node_before(table)));
	}
    }

    // pre tags as well
    el = getElementsByClassName('pre|cmd', 'div'), i = 0;

    while ((div = el[i++]))
    {
	div.style.paddingBottom = '0px';

	if (!(pre = first_child(div, 'pre')))
	    continue;

	cw = div.clientWidth;
	if (div.scrollWidth > cw)
	{
	    div.orgWidth = cw;

	    if (is.ie)
	    {
		div.orgPadding = (div.scrollHeight - div.clientHeight) + 'px';
		div.style.paddingBottom = div.orgPadding;
	    }

	    pre.style.width = div.scrollWidth + 'px';

	    img = document.createElement('img');
	    img.src = aopen.src;
	    img.className = 'klipklap hand';
	    img.onclick = klipklap_pre;
	    div.parentNode.insertBefore(img, div);
	}
    }
}

function klipklap_code()
{
    var table = node_after(node_after(node_after(this)));
    if (!table || table.tagName.toLowerCase() != 'table') return;
    var row = first_child(table);
    if (row.tagName.toLowerCase() != 'tr') row = first_child(row);
    var div = first_child(row.childNodes[row.childNodes.length-1]);
    if (!div || div.tagName.toLowerCase() != 'div') return;
    var pre = first_child(div);
    if (!pre || (pre.tagName.toLowerCase() != 'pre' && pre.tagName.toLowerCase() != 'code')) return;

    if (this.src == aopen.src)
    {
	this.src = aclosed.src;
	table.style.width = 'auto';
	div.style.overflow = 'visible';
	if (is.ie) div.style.paddingBottom = '0px';
	pre.style.borderRight = '1px solid black';
	div.style.width = pre.scrollWidth + 'px';
	hide_sky(pre);
    }
    else
    {
	this.src = aopen.src;
	table.style.width = '100%';
	div.style.overflow = '';
	if (is.ie) div.style.paddingBottom = div.orgPadding;
	pre.style.borderRight = 'none';
	div.style.width = div.orgWidth + 'px';
	show_sky();
    }
}

function klipklap_pre()
{
    var div = node_after(this);
    if (!div || div.tagName.toLowerCase() != 'div') return;
    var pre = first_child(div);
    if (!pre || pre.tagName.toLowerCase() != 'pre') return;

    if (this.src == aopen.src)
    {
	this.src = aclosed.src;
	div.style.overflow = 'visible';
	if (is.ie) div.style.paddingBottom = '0px';
	div.style.width = pre.scrollWidth + 'px';
	hide_sky(pre);
    }
    else
    {
	this.src = aopen.src;
	div.style.overflow = '';
	if (is.ie) div.style.paddingBottom = div.orgPadding;
	div.style.width = div.orgWidth + 'px';
	show_sky();
    }
}

function more_smilies(a)
{
    var m = document.getElementById('moresmilies');
    if (m)
    {
	if (m.style.display == 'none')
	{
	    m.style.display = 'block';
	    a.style.display = 'none';
	}
    }
}

//-- Image preload
if (window.board_template_url)
{
    var fclosed = new Image(); fclosed.src = board_template_url + 'images/icons/fieldset_closed.gif';
    var fopen = new Image(); fopen.src = board_template_url + 'images/icons/fieldset_open.gif';
    var fnone = new Image(); fnone.src = board_template_url + 'images/icons/fieldset_none.gif';
    var ftsclosed = new Image(); ftsclosed.src = board_template_url + 'images/icons/fieldset_ts_closed.gif';
    var ftsopen = new Image(); ftsopen.src = board_template_url + 'images/icons/fieldset_ts_open.gif';
    var ftsnone = new Image(); ftsnone.src = board_template_url + 'images/icons/fieldset_ts_none.gif';

    var aclosed = new Image(); aclosed.src = board_template_url + 'images/icons/admin_closed.gif';
    var aopen = new Image(); aopen.src = board_template_url + 'images/icons/admin_open.gif';

    var offline = new Image(); offline.src = board_template_url + 'images/icons/offline.gif';
    var offline_ts = new Image(); offline_ts.src = board_template_url + 'images/icons/offline_ts.gif';
    var online = new Image(); online.src = board_template_url + 'images/icons/online.gif';
    var online_ts = new Image(); online_ts.src = board_template_url + 'images/icons/online_ts.gif';

    var maximize = new Image(); maximize.src = board_template_url + 'images/icons/toolbar/maximize.gif';
    var minimize = new Image(); minimize.src = board_template_url + 'images/icons/toolbar/minimize.gif';
}

//-- Initialisation
var categories = [];
var messageids = [];
var klipklapcookie = {}, skipcookie = true;