// Arnostat

function lc_void()
{
	return true;
}

function lc_handle(url)
{
	var url = 'http://stats.ilsemedia.nl/click.gif'+url;
	if(document.images)
	{
		var lc_img=new Image(1,1);
		lc_img.src=url;
		lc_img.onload=function ()
		{
			lc_void();
		}
	}
	else
	{
		document.write('<img src="'+url+'" width="1" height="1" alt="">');
	}
}

function lc_click(lc_s, lc_p, lc_pv, lc_c, lc_l)
{
	var lc_url='?a=c&s='+lc_s+'&p='+lc_p+'&pv='+lc_pv+'&c='+lc_c+'&l='+escape(lc_l)+'&t='+(new Date()).getTime();
	lc_handle(lc_url);
}

function lc_visit(lc_s, lc_p, lc_pv, lc_c)
{
	var lc_url='?a=v&s='+lc_s+'&p='+lc_p+'&pv='+lc_pv+'&c='+lc_c+'&t='+(new Date()).getTime();
	var ref=document.referrer;
	
	ref=(ref.lastIndexOf('/')==ref.length-1)?ref.substring(ref.lastIndexOf('/'),0):ref;

	if(ref.length>0) 
		lc_url+='&r='+escape(ref);

	lc_handle(lc_url);
}

function linkcounter( blok,positie,link){
	if(Math.random()<(1/5))
	{	var counter=new Image();
		counter.src=("http://ilse.arnostat.nl/click.gif?b="+ blok+ "." + positie + "&l=" + link);
	}
}

function createLightbox(content, lightboxId, className)
{
	var lightbox = _getLightboxHTML.apply(this, arguments);

	document.body.appendChild(lightbox);

	addEvent(document.body, 'keyup', function(e)
	{
		if(e.keyCode == 27 && (e.srcElement || e.target) == document.body) // escape
		{
			toggleLightbox(lightboxId);
			removeEvent(document.body, 'keyup', arguments.callee)
		}
	});

	jscss('add', document.body, 'displaying-lightbox');

	if(lightbox.scrollIntoView)
		lightbox.scrollIntoView();

	return lightbox;
};

function _getLightboxHTML(content, lightboxId, className)
{
	return createDOMNode(
		'div',
		{
			'id' : lightboxId,
			'class' : 'lightbox' + (className ? ' ' + className : ''),
			'event' :
			[
				'click',
				function(e)
				{
					if(e._dontClose)
						return;

					if(jscss('check', e.target || e.srcElement, 'lightbox'))
					{
						jscss('remove', document.body, 'displaying-lightbox');
						jscss('add', this, 'display-none');
					}
				}
			]
		},
		[ content ]
	);
}

function determineLightboxIdentifier(lightboxId)
{
	if(typeof lightboxId != 'string')
	{
		var lightbox = this.parentNode;

		while(!jscss('check', lightbox, 'lightbox') && lightbox.tagName != 'html')
			lightbox = lightbox.parentNode;

		if(lightbox.tagName == 'html')
			return false;

		lightboxId = lightbox.id;
	}

	return lightboxId;
}

function toggleLightbox(lightboxId, destroy)
{
	lightboxId = determineLightboxIdentifier.call(this,lightboxId);

	var lightbox = new DOMQuery('div#' + lightboxId).get(0);

	if(lightbox)
	{
		if(destroy)
			lightbox.parentNode.removeChild(lightbox);

		jscss('toggle', document.body, 'displaying-lightbox');
		jscss('toggle', lightbox, 'display-none');

		if(!jscss('check', lightbox, 'display-none') && lightbox.scrollIntoView)
			lightbox.scrollIntoView();

		return true;
	}
};
/* used for quoteing messages to textarea */
var raw_messages = [];
var formRequiredFieldsDOMQuery = 'dt.required + dd input, dt.required + dd textarea, dt.required + dd select, dt[class^="requires-id-"] + dd input, dt[class^="requires-id-"] + dd textarea, dt[class^="requires-id-"] + dd select';
var formValidateFieldsDOMQuery = formRequiredFieldsDOMQuery + ', input[class^="validate-"], input#pwd2, input#keywords, input#query_input';
var focusableElements;

function focusFirstFormField(targets)
{
	focusableElements = getTargets(targets, 'input.focusable, textarea.focusable');

	if(focusableElements.length > 0)
	{
		setTimeout("focusableElements.get(0).focus();", 100);
	}
};

function validateForms(targets)
{
	var items = getTargets(targets, 'form');

	if(items.length == 0)
		return;

	for(var i = 0, item; (item=items.get(i));i++)
	{
		addEvent(item, 'submit', function(e) { if(!validateForm(this)) { e.preventDefault(); } } );
	}

	items = new DOMQuery(formRequiredFieldsDOMQuery);
	if(items.length > 0)
	{
		var text = new DOMQuery('div#action-header p'), p;

		if(text.length > 0)
		{
			p = text.get(0);
			p.appendChild(
				createDOMNode(null, {},
				[
					createDOMNode('br', {}, [ ]),
					createDOMNode('span', {}, [ getText('forms', 'marked_fields') ]),
					createDOMNode('span', {"class" :'required'}, ['*']),
					createDOMNode('span', {}, [ getText('forms', 'required') ])
				])
			);
		}
		else
		{
			p = createDOMNode('p', {},
				[
					createDOMNode('span', {}, [ getText('forms', 'marked_fields') ]),
					createDOMNode('span', {"class" :'required'}, ['*']),
					createDOMNode('span', {}, [ getText('forms', 'required') ])
				]
			);

			var h2 = new DOMQuery('div#action-header h2').get(0);
			if(h2)
				h2.parentNode.insertBefore(p, h2);
		}
	}

	items = new DOMQuery(formValidateFieldsDOMQuery);
	for(var j = 0; (item=items.get(j));j++)
	{
		addEvent(item, 'change', function() { validateField(this); }  );
	}
};

function hideAdvancedOptions(targets)
{
	if(forms_show_advanced_options)
	{
		jscss('add', document.body, 'show-advanced-options', '');
		return;
	}

	var advancedOptions = getTargets(targets, 'dt.advanced-option');
	if(!advancedOptions.length)
		return;

	if((new DOMQuery('span#toggle-advanced-options', document)).length == 0)
	{
		var p = new DOMQuery('div#action-header p', document).get(0);
		if(!p)
		{
			p = createDOMNode('p', {}, []);
			var h2 = new DOMQuery('div#action-header h2', document).get(0);
			if(!h2)
				return;

			h2.parentNode.insertBefore(p, h2);
		}

		p.appendChild(
			createDOMNode(null, {},
			[
				createDOMNode('br', {}, [ ]),
				createDOMNode('span',
						{
							'event' : ['click', toggleAdvancedOptions],
							'id' 	: 'toggle-advanced-options',
							'class' : 'clickable',
							'name'	: 'showAdvancedOptions'
						},
						[ getText('forms', 'show_advanced_options') ]
				)
			])
		);
	}

	if(document.location.hash == '#showAdvancedOptions')
	{
		toggleAdvancedOptions();
	}
}

function toggleAdvancedOptions()
{
	var items = new DOMQuery('form');
	if(items.length == 0)
		return;

	var indicator = new DOMQuery('span#toggle-advanced-options').get(0);
	if (!indicator)
		return;

	for(var i=0, item; (item=items.get(i)); i++)
	{
		jscss('toggle', item, 'show-advanced-options');
		if(jscss('check', item, 'show-advanced-options'))
		{
			if(isIE)
			{
				item.attributes['action'].value = item.attributes['action'].value.replace(/#(.+)$/, '') + '#showAdvancedOptions';
			}
			else
			{
				item.setAttribute('action', item.getAttribute('action').replace(/#(.+)$/, '') + '#showAdvancedOptions');
			}

			if(i)
				continue;

			if(!isIE)
				window.location.hash = '#showAdvancedOptions';

			indicator.firstChild.nodeValue = getText('forms', 'hide_advanced_options');
		}
		else
		{
			if(isIE)
			{
				item.attributes['action'].value = item.attributes['action'].value.replace(/#showAdvancedOptions$/, '');
			}
			else
			{
				item.setAttribute('action', item.getAttribute('action').replace(/#showAdvancedOptions$/, '') );
			}

			if(i)
				continue;

			if(!isIE)
			{
				if (indicator.id == 'showAdvancedOptions')
					document.location.hash = indicator.id;
				else
					document.location.hash = 'hideAdvancedOptions'; //Does not exist, but setting to '' does funky things
			}
			indicator.firstChild.nodeValue = getText('forms', 'show_advanced_options');
		}
	}
};

function validateForm(form)
{
	var items = new DOMQuery(formValidateFieldsDOMQuery, form);
	var errors = false;

	for (var i = 0, item; (item=items.get(i));i++)
	{
		errors = validateField(item, true) || errors;
	}

	if (errors)
	{
		var fields = new DOMQuery('dt.field-alert + dd input', form);

		if (fields.length > 0)
		{
			if (!jscss('check', fields.get(0).form, 'show-advanced-options'))
			{
				var hiddenFields = new DOMQuery('h3.advanced-option dt.field-alert + dd input, dt.field-alert.advanced-option + dd input', form);

				if (hiddenFields.length > 0)
					toggleAdvancedOptions();
			}

			try
			{
				fields.get(0).focus();
			} catch (e){}
		}
	}

	return !errors;
};

/*
	return false is field is valid
	return true is field is not valid
*/
function validateField(ob, ret)
{
	var field = this.tagName ?  this : ob, empty = false;

	unAlertUser(field);

	if ( jscss('check', field, 'not-required') )
		return false;

	switch(field.type)
	{
		case 'select-one':
		case 'select-multiple':
			empty = (field.selectedIndex == -1) || (field.value == '') ;
			break;
		case 'checkbox':
			if(field.name.indexOf('data[do_') != -1)
				return false;

			empty = true;
			var checkboxes = field.form[field.name];

			if(!checkboxes.length)
			{
				if(checkboxes.checked)
					empty=false;
			}
			else
			{
				for (var checkbox, i = 0; (checkbox=checkboxes[i]); i++)
				{
					if (checkbox.checked)
						empty=false;
				}
			}

			break;
		case 'radio':
			var radios = field.form[field.name];
			empty = true;
			for(var radio, i = 0; (radio=radios[i]); i++)
			{
				if(radio.checked)
				{
					empty = false;
					break;
				}
			}
		break;
		default:
			empty = (field.value.trim() == '' ? true : false);
			break;
	}

	if(!empty)
	{
		switch(board_action)
		{
			case 'create_user':
			case 'edit_user':
				switch(field.id)
				{
					case 'pwd2':
						return validatePassword(field);
					break;
					case 'nickname':
						if(field.value.length < 3)
						{
							alertUser(field, getText('forms', 'name_too_short'));
						}
						else if(!ret)
						{
							validateNickname(field);
						}
					break;
					case 'email':
						if(!ret)
						{
							validateEmail(field);
							validateEmailDomain(field);
						}
					break;
				}
			default :
				var reg, res, value = field.value;

				if(jscss('check', field, 'validate-email', ''))
				{
					reg = /^[\w-]+([\.\+][\w-]+)*@([\w-]+\.)+[a-zA-Z]{2,7}$/;
					res = reg.test(value);
					if(!res)
					{
						alertUser(field, getText('forms', 'email_incorrect'));
						return true;
					}
				}
				if(jscss('check', field, 'validate-url', ''))
				{
					if (jscss('check', field, 'no-http', ''))
						reg = /^(([0-9]{1,3}\.){3}[0-9]{1,3}|\[([a-f0-9:]+)\]|([0-9a-z_!~*'\(\)-]+\.)*([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\.[a-z]{2,6})(\/?|(\/[0-9a-z_!~*'\(\)\.;?:@&=+$,%#-]+)+\/?)$/i;
					else
						reg = /^(https?:\/\/)(([0-9]{1,3}\.){3}[0-9]{1,3}|\[([a-f0-9:]+)\]|([0-9a-z_!~*'\(\)-]+\.)*([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\.[a-z]{2,6})((\/?)|(\/[0-9a-z_!~*'\(\)\.;?:@&=+$,%#-]+)+\/?)$/i;

					res = reg.test(value);
					if(!res)
					{
						alertUser(field, getText('forms', 'url_incorrect'));
						return true;
					}
				}
				if(jscss('check', field, 'validate-integer', '') || jscss('check', field, 'validate-sofinummer', ''))
				{
					reg = /^[0-9]*$/;
					res = reg.test(value);
					if(!res)
					{
						alertUser(field, getText('forms', 'numeric_only'));
						return true;
					}
				}
				if(jscss('check', field, 'validate-sofinummer', '') || jscss('check', field, 'validate-bsn', ''))
				{
					if(value.length != 9)
					{
						alertUser(field, getText('forms', 'length_not_9'));
						return true;
					}
					/* source: http://cgi.dit.nl/sofi.cgi */
					var total = 0;
					for (i=1; i<=8; i++)
					{
						total += (10-i) * value[i-1];
					}
					total += -1 * value[8];

					if ((total % 11) > 0)
					{
						alertUser(field, getText('forms', 'sofinummer_mismatch'));
						return true;
					}
				}
				if(jscss('check', field, 'validate-zipcode', ''))
				{
					reg = /^[1-9][0-9]{3}\s*[a-z]{2}$/i;
					res = reg.test(value);
					if(!res)
					{
						alertUser(field, getText('forms', 'zipcode_mismatch'));
						return true;
					}
				}
				if(jscss('check', field, 'validate-bankaccount', ''))
				{
					reg = /^[0-9\.]+$/i;
					res = reg.test(value);
					if(!res)
					{
						alertUser(field, getText('forms', 'bankaccount_mismatch'));
						return true;
					}
				}
				if(jscss('check', field, 'validate-dutch-bankaccount', ''))
				{
					value = value.replace(/[^0-9\.]/, '');
					
					if(value.length != 9)
						alertUser(field, getText('forms', 'dutch_bankaccount_mismatch'));
					
					/* De ElfProef voor een bankrekening nummer wijkt op Ã©Ã©n punt af van de elfproef voor de BSN. Het laatste cijfer in het nummer wordt dan niet vermenigvuldigd met -1 maar met 1. */
					var total = 0;
					for (i=1; i<=8; i++)
					{
						total += (10-i) * value[i-1];
					}
					total += value[8];

					if ((total % 11) > 0)
					{
						alertUser(field, getText('forms', 'dutch_bankaccount_mismatch'));
						return true;
					}
				}
				if(jscss('check', field, 'validate-usericon', ''))
				{
					if (value.length > 0)
					{
						var filename = value.split(/[\/\\]/).pop();

						if (filename.length > 60)
						{
							alertUser(field, getText('forms', 'filename_too_long'));
							return true;
						}
						if (!filename.match(/^[ a-z0-9\_\-\.]+$/i))
						{
							alertUser(field, getText('forms', 'filename_invalid'));
							return true;
						}
						if (!filename.match(/\.(jpg|jpeg|gif|png)$/i))
						{
							alertUser(field, getText('forms', 'extension_invalid'));
							return true;
						}
					}
				}

				switch(field.id)
				{
					case 'keywords':
						reg = /[^\w0-9_\-.\u00C0-\u00FF]+/;
						var values = value.split(' ');
						for(i=0;(value=values[i]);i++)
						{
							if(value.length > 50)
							{
								alertUser(field, getText('forms', 'keyword_too_long', value));
								return true;
							}

							res = value.match(reg);
							if(res)
							{
								alertUser(field, getText('forms', 'keywords_illegal_character', value));
								return true;
							}
						}
					break;
					case 'recipients':
						var elements = [];
						var previousQuote = false;
						var is_quoted_element = false;
						var element = '';
						for( i = 0; i <= value.length; i++ )
						{
							if ( value.charAt(i) == '"')
							{
								if ( previousQuote && previousQuote == value.charAt(i) )
								{
									is_quoted_element = true;
									previousQuote = false;
									continue;
								}
								else if ( !previousQuote )
								{
									previousQuote = value.charAt(i);
									continue;
								}
							}

							if ( (value.charAt(i) == ',' && !previousQuote) || value.length == i )
							{
								if ( !is_quoted_element && element.match(/[0-9]+/) )
									element = parseInt(element.match(/[0-9]+/)[0]);
								elements.push(element);
								element = '';
								is_quoted_element = false;
								continue;
							}

							element += value.charAt(i);
						}

						if (field.getAttribute('maxentries'))
						{
							if (elements.length > field.getAttribute('maxentries'))
								alertUser(field, getText('forms', 'max_entries_reached', field.getAttribute('maxentries')));
						}

						if(elements.indexOf(board_user_id) + elements.indexOf(board_user_nickname) != -2 )
							alertUser(field, getText('forms', 'cant_send_to_yourself'));
					break;
				}

				// If you want custom-field validation, create functions and add functionnames to array 'extraValidateFields'
				if(typeof extraValidateFields == 'object')
				{
					for(i=0; i<extraValidateFields.length; i++)
					{
						extraValidateFields[i](field);
					}
				}
			break;
		}
	}

	var dtFieldName = getSiblingNode(getSiblingNode(field, 'up', 'dd'), 'previous', 'dt');
	if(dtFieldName)
	{
		var isRequired   = jscss('check', dtFieldName, 'required');

		/* Mark other fields as required when this field is not empty */
		var res = /requires\-id\-([a-z0-9_]+)/i.exec(dtFieldName.className);
		if(res && res[0])
		{
			var inputField = new DOMQuery('#' + res[1], getSiblingNode(field, 'up', 'form')).get(0);
			if(inputField)
			{
				if(!empty)
					jscss('add', getSiblingNode(inputField.parentNode, 'previous', 'dt'), 'required');
				else
					jscss('remove', getSiblingNode(inputField.parentNode, 'previous', 'dt'), 'required');

				return validateField(inputField, true);
			}
		}
	}

	if (empty && isRequired)
	{
		var text = getText('forms', 'required_field.'+ field.id);

		if (text == '[text not found: forms::required_field.'+ field.id +']')
			text =  getText('forms', 'required_field');

		alertUser(field, text);
	}
	else if (empty && !isRequired)
	{
		return false;
	}

	if (ret)
		return empty;
};

function alertUser(inputfield, str)
{
	var ddInputField = getSiblingNode(inputfield, 'up', 'dd');
	var ddErrorMsg   = getSiblingNode(getSiblingNode(inputfield, 'up', 'dd'), 'next', 'dd');
	var dtFieldName  = getSiblingNode(getSiblingNode(inputfield, 'up', 'dd'), 'previous', 'dt');

	if(!ddErrorMsg || !jscss('check',ddErrorMsg,'dd-sequence field-alert',''))
	{
		jscss( 'add', dtFieldName, 'field-alert', '');

		var x = createDOMNode('dd', {"class" :'dd-sequence field-alert'}, [str]);

		/* Add special class for IE6 if it is an advanced option */
		if(isIE6 && (jscss('check', dtFieldName, 'advanced-option') || jscss('checkParents', dtFieldName, 'advanced-option')))
			jscss( 'add', x, 'advanced-option-adjacent', '');

		ddInputField.parentNode.insertBefore(x, ddInputField.nextSibling);
	}
};

function unAlertUser(inputfield)
{
	var ddInputField = getSiblingNode(inputfield, 'up', 'dd');
	var ddErrorMsg   = getSiblingNode(getSiblingNode(inputfield, 'up', 'dd'), 'next', 'dd');
	var dtFieldName  = getSiblingNode(getSiblingNode(inputfield, 'up', 'dd'), 'previous', 'dt');

	if(ddErrorMsg && jscss('check',ddErrorMsg,'dd-sequence field-alert'))
	{
		ddInputField.parentNode.removeChild(ddErrorMsg);
		jscss('remove', dtFieldName, 'field-alert', '');
	}
};

function _validationResult(request)
{
	if (typeof request != 'undefined' && request != null && request.readyState == 4)
	{
		var response = getElementFromXHR(request, 'div#core');

		return response.firstChild.nodeValue;
	}

	return "0";
};

function _xmlrequestComplete(request)
{
	return typeof request != 'undefined' && request != null && request.readyState == 4;
};


function validatePassword(x)
{
	var pwd1 = new DOMQuery('input#pwd1', getSiblingNode(x, 'up', 'form')).get(0);

	if(pwd1.value != x.value)
	{
		alertUser(x, getText('forms', 'password_no_match'));
		return true;
	}
};


function validateNickname(field)
{
	nicknamereq = null;
	var request = 'action=custom&data%5Btemplate%5D=validate_nickname&data%5Bnickname%5D='+encodeURI(field.value);
	nicknamereq = httpreq_string(request, _validateNickname, null, true, "GET");
};

function _validateNickname()
{
	if (_xmlrequestComplete(nicknamereq) && _validationResult(nicknamereq) == '1')
	{
		alertUser(new DOMQuery('#nickname').get(0), getText('forms', 'username_taken'));
	}
};


function validateEmailDomain(field)
{
	emaildomainreq = null;
	var request = 'action=custom&data%5Btemplate%5D=validate_emaildomain&data%5Bemail%5D='+encodeURI(field.value);
	emaildomainreq = httpreq_string(request, _validateEmailDomain, false, true, "GET");
};


function _validateEmailDomain()
{
	if (_validationResult(emaildomainreq) == '1')
	{
		alertUser(new DOMQuery('#email').get(0), getText('forms', 'invalid_domain'));
	}
};


function validateEmail(field)
{
	emailreq = null;
	var request = 'action=custom&data%5Btemplate%5D=validate_email&data%5Bemail%5D='+encodeURI(field.value);
	emailreq = httpreq_string(request, _validateEmail, false, true, "GET");
};


function _validateEmail()
{
	if (emailreq && _validationResult(emailreq) == '1')
	{
		alertUser(new DOMQuery('#email').get(0), getText('forms', 'email_taken'));
	}
};

function attachCalendarSelector(targets)
{
	var calendarSelectors = getTargets(targets, 'input.date, input.datetime'), item;

	for(var i = 0, item; (item=calendarSelectors.get(i));i++)
	{
		if(item.id == '')
			continue;

		Calendar.setup({
			inputField			:		item.id,
			ifFormat			:		jscss('check', item, 'datetime') ? arguments.callee.ifFormatDateTime : arguments.callee.ifFormatDate,
			showsTime			:		jscss('check', item, 'datetime'),
			align				:		"Tl",
			step				:		1,
			electric			:		false,
			firstDay			:		1,
			onClose				:		function(cal)
										{
											cal.hide();
											if(document.createEvent)
											{
												var evt = document.createEvent("HTMLEvents");
												evt.initEvent("change", true, true);
												cal.params['inputField'].dispatchEvent(evt);
											}
											else if(document.createEventObject)
											{
												var evt = document.createEventObject();
												cal.params['inputField'].fireEvent("onchange", evt);
											}
										}
		});
	}
};
attachCalendarSelector.ifFormatDate = "%d-%m-%Y";
attachCalendarSelector.ifFormatDateTime = "%d-%m-%Y %H:%M:%S";


function selectAllRows(targets)
{
	var tables = getTargets(targets, 'div#content form table');

	if(tables.length == 0)
		return;

	for(var i = 0; i < tables.length; i++)
	{
		var checkboxes =  new DOMQuery('input[TYPE="checkbox"]', tables.get(i));
		if(checkboxes.length == 0)
			continue;

		var tablefooter = new DOMQuery("tfoot", tables.get(i)).get(0);
		if(!tablefooter)
			continue;

		var tr = createDOMNode('tr', {"class" :'footer-form'},
		[
			createDOMNode('td', {"class" :'select'},
			[
				createDOMNode('input', {"type" :'checkbox', "id" :'selectAllRows-'+i, "name" :'selectAllRows-'+i, "event" : (isIE ? ['click', _selectAllRows] : ['change', _selectAllRows]) }, [])
			]),
			createDOMNode('td', {"colSpan" :5},
			[
				isIE ?
				createDOMNode('label', { 'htmlFor' : 'selectAllRows-'+i}, [getText('forms', 'select_all_rows')])
				:
				createDOMNode('label', { 'for' : 'selectAllRows-'+i}, [getText('forms', 'select_all_rows')])
			])
		]);

		tablefooter.appendChild(tr);
	}

	if(isGecko && !isWebKit)
	{
		jscss('add',document.body,'display-none','');
		jscss('remove',document.body,'display-none','');
	}
};

function _selectAllRows()
{
	var checked = this.checked;
	var items = new DOMQuery('tbody input[TYPE="checkbox"]', getSiblingNode(this, 'up', 'table'));
	for(var i = 0, item; (item=items.get(i));i++)
	{
		item.checked = checked;
	}
};

function rewriteQuoteLinks()
{
	if(raw_messages.length == 0)
		return;

	for(var i = 0, item; (item=raw_messages[i]); i++)
	{
		/* using a reference to message-? to slightly speed up lookup */
		var links = new DOMQuery("li.message-quote a", new DOMQuery("li#message-"+item[0]).get(0) );

		if(links.length > 0)
		{
			addEvent(links.get(0), 'click', function(e) { if(!copyQuoteToRML(this)) { e.preventDefault(); } } );
		}
	}
};

function copyQuoteToRML(x)
{
	var path = board_script_url + '/quote_message/';
	var temp = x.href.substring( path.length );
	var reg = /^([0-9]+)/;
	var res = temp.match(reg);
	var messageid = res[1];

	for(var i = 0, item; (item=raw_messages[i]);i++)
	{
		if(item[0] == messageid)
		{
			putStr(item[1]);
			return false;
		}
	}

	return true;
};

/* helper function for raw messages */
function q()
{
	return '"';
};

function privateMessagingCopyContact(targets)
{
	if(board_action == 'pm_new_message')
		addEventToTargets(targets, 'change', _privateMessagingCopyContact, 'input#recipients + select');
};

function _privateMessagingCopyContact()
{
	if(this.options[this.selectedIndex].value == '')
		return;

	var input = new DOMQuery("input#recipients").get(0);

	var username = this.options[this.selectedIndex].value;

	if ( username.match("'") )
		username = '"'+ username + '"';
	else if ( username.match(/^[0-9]+$/) || username.match('"') )
		username = "'"+ username + "'";

	input.value += (input.value != '' ? ', ' : '') + username;
};

function selectSelectedTopicAdmin(targets)
{
	var selects = getTargets(targets, 'div#topic-admin select[selected]');

	for (var i = 0, select; (select=selects.get(i));i++)
	{
		for (var j = 0; j<select.options.length; j++)
		{
			if (select.options[j].value == select.getAttribute("selected"))
				select.options[j].selected = true;
		}
	}
};

function toggleChangeCheckboxTopicAdmin()
{
	var topicAdmin = new DOMQuery("div#topic-admin").get(0);
	if(!topicAdmin)
		return;

	addEventToTargets(new DOMQuery('input[type="text"], textarea, select', topicAdmin), 'change', _toggleChangeCheckboxTopicAdmin);
	addEventToTargets("input#delmessages", 'change', selectMessagesForDeletion);
	addEventToTargets("input#splitmessages", 'change', selectMessagesForSplit);
};

function _toggleChangeCheckboxTopicAdmin()
{
	var search = jscss('check', this.parentNode, 'dd-sequence') ? this.parentNode.previousSibling : this.parentNode;
	var items = new DOMQuery('input[type="checkbox"]', search);

	if(items.length > 0)
	{
		items.get(0).checked=true;
	}
};

var callbackOnMessageToggledSelected = null;
function _selectMessages(unsetCurrentMessages)
{
	var items = new DOMQuery('li.message');

	for(var i=0, item; (item=items.get(i));i++)
	{
		addEvent(item, 'click', _selectMessage);
		if(unsetCurrentMessages)
		{
			jscss('remove', item, 'selected', '');
		}
	}
};

function _selectMessage()
{
	if(!callbackOnMessageToggledSelected)
		return;

	jscss('toggle', this, 'selected', '');
	callbackOnMessageToggledSelected(this, jscss('check', this, 'selected', ''));
};

function _messageToggledForDeletion(listitem, selected)
{
	var del_messageids = new DOMQuery("input#del_messageids").get(0);
	if(!del_messageids)
		return;

	var reg = /^message\-([0-9]+)$/;
	var res = listitem.id.match(reg);
	var messageid = res[1];

	var ids = del_messageids.value.split(',');

	if(selected)
	{
		ids[ids.length] = messageid;
	}
	else
	{
		for(var i = 0; i < ids.length; i++)
		{
			if(ids[i] == messageid)
			{
				delete ids[i];
			}
		}
	}

	del_messageids.value = ids.join(',');
};

function selectMessagesForDeletion()
{
	var del_messageids = new DOMQuery("input#del_messageids").get(0);
	if(!del_messageids)
		return;

	del_messageids.value = '';

	_selectMessages(!this.checked);

	if(!this.checked)
		callbackOnMessageToggledSelected = null;
	else
		callbackOnMessageToggledSelected = _messageToggledForDeletion;

	if(this.checked)
		alert(getText('forms', 'select_messages'));
};

function _messageToggledForSplit(listitem, selected)
{
	var split_messageids = new DOMQuery("input#split_messageids").get(0);
	if(!split_messageids)
		return;

	var reg = /^message\-([0-9]+)$/;
	var res = listitem.id.match(reg);
	var messageid = res[1];

	var ids = split_messageids.value.split(',');

	if(selected)
	{
		ids[ids.length] = messageid;
	}
	else
	{
		for(var i=0, item; (item=ids[i]);i++)
		{
			if(item == messageid)
				delete item;
		}
	}

	split_messageids.value = ids.join(',');
};

function selectMessagesForSplit()
{
	var split_messageids = new DOMQuery("input#split_messageids").get(0);
	if(!split_messageids)
		return;

	split_messageids.value = '';

	_selectMessages(!this.checked);
	if(!this.checked)
		callbackOnMessageToggledSelected = null;
	else
		callbackOnMessageToggledSelected = _messageToggledForSplit;

	if(this.checked)
		alert(getText('forms', 'select_messages'));
};

function findForm()
{
	var order = new DOMQuery('form#form-find select#order').get(0);
	if(!order)
		return;

	var queryField = new DOMQuery('form#form-find input#query_input').get(0);
	if(!queryField)
		return;

	if(order.options[order.selectedIndex].value == 'relevance')
	{
		jscss('add', getSiblingNode(getSiblingNode(queryField, 'up', 'dd'), 'previous', 'dt'), 'required');
	}
	else
	{
		jscss('remove', getSiblingNode(getSiblingNode(queryField, 'up', 'dd'), 'previous', 'dt'), 'required');
		unAlertUser( queryField );
	}

	if(!arguments.callee.firstRun)
	{
		arguments.callee.firstRun = true;
		addEvent(order, 'change', arguments.callee);
	}
};
/*
 * Load FCKEditor 
 */
function fckEditor()
{
	if(typeof FCKeditor == 'undefined')
		return;

	var field = new DOMQuery('textarea#rml_textarea').get(0);

	if(!field)
		return;

	var oFCKeditor = new FCKeditor('rml_textarea');

	oFCKeditor.Config['CustomConfigurationsPath'] = board_template_url + '/js/fckconfig.js';
	oFCKeditor.BasePath = board_template_url + '/js/FCKeditor/';
	oFCKeditor.Width = fck_config.Width;
	oFCKeditor.Height = fck_config.Height;

	oFCKeditor.ReplaceTextarea();
};

/*
 * Update field linked to fckeditor input prior to submitting (and validating) forms
 */
function updateLinkedField()
{
	if(typeof FCKeditorAPI == 'undefined')
		return;
	
	var editor = FCKeditorAPI.GetInstance('rml_textarea') ;

	if(typeof editor != 'undefined')
		editor.UpdateLinkedField();
};

/*
 * Update linked field before submitting form
 */
overloadFunction('validateForm', function(form)
{
	updateLinkedField(); /* Update linked field @ fckeditor */

	return arguments.callee.previousFunctionDefinition.apply(this, arguments);
});
/**
 * Overload original _validationResult; get result value from primary react action instead of #core
 */
function _validationResult(request)
{
	if (typeof request != 'undefined' && request != null && request.readyState == 4)
	{
		var response = getElementFromXHR(request, 'div#core div.block-type-react-action.custom');

		return response.firstChild.nodeValue;
	}

	return "0";
};

/**
 * Attach to the ValidateForms function to enable lightboxes with a form
 * to stay open after the form was submitted. This allows us to give
 * the user a response in the lightbox.
 */
var validateFormsOld = validateForms;
validateForms = function (targets)
{
	addEventToTargets(null, 'click', function() 
	{ 
		if(jscss('check', this, 'preview'))
			jscss('add', getSiblingNode(this, 'up', 'form'), 'submitting-preview');
		else
			jscss('add', getSiblingNode(this, 'up', 'form'), 'submitting');
	}, 
	'form input[type=submit]');

	if(!arguments.callee.calledFromLightbox)
		return validateFormsOld.apply(this, arguments);

    var items = getTargets(targets, "form input[type=submit]");

	if(items.length == 0)
        return;

    for(var i = 0, item; (item=items.get(i));i++)
    {
        addEvent(item, 'click', function(e)
		{
			if(!validateForm(getSiblingNode(this, 'up', 'form')))
			{
				jscss('remove', getSiblingNode(this, 'up', 'form'), 'submitting');
				jscss('remove', getSiblingNode(this, 'up', 'form'), 'submitting-preview');

				e.preventDefault();
				e.stopPropagation();
				return false;
			}
		});
    }

    items = new DOMQuery(formRequiredFieldsDOMQuery);
    if(items.length > 0)
    {
        var text = new DOMQuery('div#action-header p'), p;

        if(text.length > 0)
        {
            p = text.get(0);
            p.appendChild(
                createDOMNode(null, {},
                [
                    createDOMNode('br', {}, [ ]),
                    createDOMNode('span', {}, [ getText('forms', 'marked_fields') ]),
                    createDOMNode('span', {"class" :'required'}, ['*']),
                    createDOMNode('span', {}, [ getText('forms', 'required') ])
                ])
            );
        }
        else
        {
            p = createDOMNode('p', {},
                [
                    createDOMNode('span', {}, [ getText('forms', 'marked_fields') ]),
                    createDOMNode('span', {"class" :'required'}, ['*']),
                    createDOMNode('span', {}, [ getText('forms', 'required') ])
                ]
            );

            var h2 = new DOMQuery('div#action-header h2').get(0);
            if(h2)
                h2.parentNode.insertBefore(p, h2);
        }
    }

    items = new DOMQuery(formValidateFieldsDOMQuery);
    for(var j = 0; (item=items.get(j));j++)
    {
        addEvent(item, 'change', function() { validateField(this); }  );
    }
};

/*
 * Remove default values befor validating (and submitting) form
 */
var validateFormOld = validateForm;
validateForm = function(form)
{
	updateLinkedField(); /* Update linked field @ fckeditor */
	
	var fields = new DOMQuery(default_field_values_query, form);

	for(var i = 0, field; (field = fields.get(i)); i++)
		removeDefaultValue.call(field);

	var result = validateFormOld.apply(this, arguments);

	if(!result)
	{
		jscss('add', form, 'form-contains-invalid-fields');

		for(i = 0; (field = fields.get(i)); i++)
			addDefaultValue.call(field);

		jscss('remove', form, 'submitting');
		jscss('remove', form, 'submitting-preview');
	}
	else
		jscss('remove', form, 'form-contains-invalid-fields');

	return result;
};

var validateFieldOriginal = validateField;
var validateField = function(ob, ret)
{
	var field = this.tagName ?  this : ob;
	var result;

	switch(field.id)
	{
		case 'forumname':
			if(!ret)
				validateForumname(field);
		break;
	}

	if(jscss('check', field, 'character-limit') && !jscss('check', field, 'no-character-limit') && field.value.trim() != '' && field.id != 'nickname' && field.id != 'email')
		result = _fieldMaximumCharacters.call(field);
	else
		result = validateFieldOriginal(ob, ret);

	var form = getSiblingNode(field, 'up', 'form')

	if(hasInvalidFields(form))
		jscss('add', form, 'form-contains-invalid-fields');
	else
		jscss('remove', form, 'form-contains-invalid-fields');

	return result;
};

function hasInvalidFields(form)
{
	var fields = new DOMQuery('dt.field-alert:not(.field-notification)', form);

	if(fields.length)
		return true;

	return false;
};

function _validateNickname()
{
	if (!_xmlrequestComplete(nicknamereq))
		return;

	var result = _validationResult(nicknamereq);
	var input = new DOMQuery('input#nickname').get(0);

	switch(result)
	{
		case '-1':
			alertUserExtra(input, 'error', getText('dashboard', 'username_no_match'));
		break;
		case '1':
			alertUserExtra(input, 'error', getText('dashboard', 'username_taken'));
		break;
		case '0':
		default:
			alertUserExtra(input, 'succes', getText('dashboard', 'username_available'));
		break;
	}
};

function _validateEmail()
{
	if(!emailreq)
		return;

	var result = _validationResult(emailreq);
	var input = new DOMQuery('input#email').get(0);

	if(result == '1')
		alertUserExtra(input, 'error', getText('dashboard', 'email_taken'));
	else
		alertUserExtra(input, 'succes', getText('dashboard', 'email_available'));
};

function validateForumname(field)
{
	forumnamereq = null;
	var request = 'action=custom&data%5Btemplate%5D=validate_forumname&data%5Bforumname%5D='+encodeURI(field.value);
	forumnamereq = httpreq_string(request, _validateForumname, false, true, "GET");
};

function _validateForumname()
{
	if(!forumnamereq)
		return;

	var result = _validationResult(forumnamereq);
	var input = new DOMQuery('input#forumname').get(0);

	if(result == '1')
		alertUserExtra(input, 'error', getText('dashboard', 'forumname_taken'));
	else
		alertUserExtra(input, 'succes', getText('dashboard', 'forumname_available'));
};

function alertUserExtra(input, type, msg)
{
	var dt = getSiblingNode(getSiblingNode(input, 'up', 'dd'), 'previous', 'dt');

	if(dt && jscss('check', dt, 'field-alert'))
		return;

	var span = getSiblingNode(input, 'next', 'span');

	if(!span)
	{
		span = createDOMNode('span', { 'class' : 'extended-field-alert ' + type }, [ msg ]);
		input.parentNode.appendChild(span);
	}
	else
	{
		span.firstChild.nodeValue = msg;
		span.className = 'extended-field-alert ' + type;
	}
};

/*
 * Replace alertUser and unAlertUser from base-strict. Create errormessages in labels for 
 * corresponding inputfield. Multiple inputfields can add labels to dd.errormessage, which
 * is used @ birthday fields
 */
function alertUser(inputfield, str)
{
	var ddInputField = getSiblingNode(inputfield, 'up', 'dd');
	var ddErrorMsg   = getSiblingNode(getSiblingNode(inputfield, 'up', 'dd'), 'next', 'dd');
	var dtFieldName  = getSiblingNode(getSiblingNode(inputfield, 'up', 'dd'), 'previous', 'dt');
 	
	if(ddErrorMsg)
		var ddErrorMsgLabel = new DOMQuery('label.for-' + inputfield.id, ddErrorMsg).get(0);

	if(!ddErrorMsgLabel)
	{
		if(!ddErrorMsg || !jscss('check',ddErrorMsg,'dd-sequence field-alert',''))
		{
			jscss( 'add', dtFieldName, 'field-alert', '');

			var x = createDOMNode('dd', { 'class' : 'dd-sequence field-alert' }, [ ]);

			/* Add special class for IE6 if it is an advanced option */
			if(isIE6 && (jscss('check', dtFieldName, 'advanced-option') || jscss('checkParents', dtFieldName, 'advanced-option')))
				jscss( 'add', x, 'advanced-option-adjacent', '');

			ddInputField.parentNode.insertBefore(x, ddInputField.nextSibling);
			ddErrorMsg = x;
		}

		var labels = new DOMQuery('label', ddErrorMsg);
		for(var i = 0, label; (label = labels.get(i)); i++)
			jscss('add', label, 'display-none');

		/* Add 'for-fieldid' class to label for future reference. DOMQuery on label[for] doesn't work in IE after dynamicly adding content. Thnx! :r */
		ddErrorMsg.appendChild(createDOMNode('label', { 'for' : inputfield.id, 'class' : 'for-' + inputfield.id }, [ str ]));
	}
};

function unAlertUser(inputfield)
{
	var ddInputField = getSiblingNode(inputfield, 'up', 'dd');
	var ddErrorMsg   = getSiblingNode(getSiblingNode(inputfield, 'up', 'dd'), 'next', 'dd');
	var dtFieldName  = getSiblingNode(getSiblingNode(inputfield, 'up', 'dd'), 'previous', 'dt');

	if(ddErrorMsg)
		var ddErrorMsgLabel = new DOMQuery('label.for-' + inputfield.id, ddErrorMsg).get(0);
		
	if(!ddErrorMsgLabel)
		return;

	if(ddErrorMsg && jscss('check',ddErrorMsg,'dd-sequence field-alert'))
	{
		ddErrorMsg.removeChild(ddErrorMsgLabel);
	
		var labels = new DOMQuery('label', ddErrorMsg);

		if(!labels.length)
		{
			ddInputField.parentNode.removeChild(ddErrorMsg);
			jscss('remove', dtFieldName, 'field-alert', '');
		}
	}
};

overloadFunction( 'alertUser', function(input, str)
{
	var span = getSiblingNode(input, 'next', 'span');

	if(span)
		span.parentNode.removeChild(span);

	arguments.callee.previousFunctionDefinition.apply(this, arguments);
});

function updateAlertUser(field, str, error)
{
	var ddInputField = getSiblingNode(field, 'up', 'dd');

	if(ddInputField.nextSibling)
	{
		var ddErrorMsg   = getSiblingNode(ddInputField, 'next', 'dd');
		var dtFieldName  = getSiblingNode(ddInputField, 'previous', 'dt');
		
		if(ddErrorMsg)
			var ddErrorMsgLabel = new DOMQuery('label.for-' + field.id, ddErrorMsg).get(0);
	}

	if(ddErrorMsg && ddErrorMsgLabel && jscss('check',ddErrorMsg,'dd-sequence field-alert'))
		ddErrorMsgLabel.firstChild.nodeValue = str;
	else
	{
		alertUser(field, str);

		ddErrorMsg = getSiblingNode(getSiblingNode(field, 'up', 'dd'), 'next', 'dd');
		dtFieldName  = getSiblingNode(getSiblingNode(field, 'up', 'dd'), 'previous', 'dt');
	}

	if(error)
	{
		jscss('remove', ddErrorMsg, 'field-notification');
		jscss('add', dtFieldName, 'field-alert');
	}
	else
	{
		jscss('add', ddErrorMsg, 'field-notification');
		jscss('remove', dtFieldName, 'field-alert');
	}
};

function quickSearchTargets(targets)
{
	var inputTargets = 'form#quick-search-form dl input#find_clubs, form#quick-search-form dl input#find_in_clubs';

	addEventToTargets(targets, 'change', _quickSearchTargets, inputTargets);

	var result = new DOMQuery(inputTargets);

	for (var i = 0; i < result.length; i++ )
		_quickSearchTargets.apply(result.get(i));
};

function _quickSearchTargets()
{
	var action = new DOMQuery('form#quick-search-form input[name="action"]').get(0);
	var query = new DOMQuery('input#quick-search-form-query').get(0);

	if (this.checked)
	{
		switch(this.value)
		{
			case 'find_clubs':
				action.value = 'find_clubs';
				// query.setAttribute('name', 'data[search_for]');
			break;
			case 'find_in_clubs': // FALLTRHU
			case 'find_in_current_club':
				action.value = 'find';
				query.setAttribute('name', 'data[q]');
			break;
		}
	}
};

/*
 * This function *should* delay init procedure in IE. This doesn't work as expected,
 * but just returning false *does* mysteriously 'fix' things.
 */
function initReadyStateDetectionCallback()
{
	return false;
};

function fieldMaximumCharacters(targets)
{
	var defaultTargets = 'div#core form input.character-limit, div#core form textarea.character-limit, form textarea#signature';

	addEventToTargets(targets, 'keyup', _fieldMaximumCharacters, defaultTargets);
	/* mouseup is for contextual menu copy/paste */
	addEventToTargets(targets, 'mouseup', _fieldMaximumCharacters, defaultTargets);

	var fields = new DOMQuery(defaultTargets);

	for(var i = 0, field; (field = fields.get(i)); i++)
		_fieldMaximumCharacters.call(field);
};

function _fieldMaximumCharacters()
{
	if(!jscss('check', this, 'character-limit') || jscss('check', this, 'no-character-limit'))
		return false;

	if(this.getAttribute('maxlength'))
		var maxCharacters = this.getAttribute('maxlength');
	else
		var maxCharacters = /character-limit-([0-9]+)/.exec(this.className)[1];

	var characters = this.value.length;
	var alertString, preventSubmit = false;

	if(characters > maxCharacters)
		preventSubmit = true;

	alertString = characters + '/' + maxCharacters + ' karakters gebruikt';

	updateAlertUser(this, alertString, preventSubmit);

	return preventSubmit;
};

/*
 * Get default field values from default_field_values array, add value onload / change / blur if
 * field is empty, remove on focus
 */
function defaultFieldValues()
{
	var fields = new DOMQuery(default_field_values_query);

	for(var i = 0, field; (field = fields.get(i)); i++)
	{
		addEvent(field, 'focus', function() { this.hasFocus = true; });
		addEvent(field, 'blur', function() { this.hasFocus = false; });

		addEvent(field, 'change', addDefaultValue);
		addEvent(field, 'blur', addDefaultValue);
		addEvent(field, 'focus', removeDefaultValue);

		addDefaultValue.call(field);
	}
};

function addDefaultValue(e)
{
	if(this.hasFocus)
		return;

	if(this.value.trim() == '')
	{
		var name = this.name;
		
		if(typeof default_field_values[name] == 'undefined')
			return;
		
		this.value = default_field_values[this.name];
		jscss('add', this, 'is-default');
	}
};

function removeDefaultValue()
{
	if(this.value == default_field_values[this.name])
	{
		this.value = '';
		jscss('remove', this, 'is-default');
	}
};

function selectTags(targets)
{
	var query = 'form ul.taglist li input[type="checkbox"]';

	addEventToTargets(targets, 'click', toggleTag, query);

	var fields = new DOMQuery(query);

	for(var i = 0, field; (field = fields.get(i)); i++)
		if(field.checked)
			toggleTag.call(field);
};

function toggleTag()
{
	var li = getSiblingNode(this, 'up', 'li');

	jscss('toggle', li, 'selected');
};

function handleManageForumUsers(targets)
{
	addEventToTargets(targets, 'click', _handleManageForumUsers, 'div#page-content-wrapper form input#submit-btn');
};

function _handleManageForumUsers(e)
{
	var roleSelect = new DOMQuery('#change-role').get(0);
	var userChkbox = new DOMQuery('div#userroles input[type=checkbox]');

	if(!roleSelect)
		return;
	
	var numSelected = 0;
	for (var i = 0; i < userChkbox.length; i++)
		if (userChkbox.get(i).checked)
			numSelected++;

	allowSubmit = true;

	if (roleSelect.options[roleSelect.selectedIndex].value == 'owner')
	{
		if (numSelected != 1) {
			allowSubmit = false;
			alert(getText('forms', 'select_user'));
		} else
			allowSubmit = confirm(getText('forms', 'confirm_role_owner'));
	} else
		allowSubmit = confirm(getText('forms', 'confirm_role_member'));


	if (!allowSubmit)
	{
		jscss('remove', getSiblingNode(this, 'up', 'form'), 'submitting');
		jscss('remove', getSiblingNode(this, 'up', 'form'), 'submitting-preview');
		e.preventDefault();
	}
};

var oldFindForm = findForm;
findForm = function(targets) { addEventToTargets(targets, 'change', _findFormSortResults, 'select#find-clubs-sort');  };
function _findFormSortResults()
{
	if (this.options[this.selectedIndex].value == "none")
		return;

	var new_querystring = find_clubs_search_data;
	new_querystring = new_querystring.replace(/data%5Bsort%5D=(none|start_date|num_messages|num_members)&?/, '');
	new_querystring += 'data[sort]=' + this.options[this.selectedIndex].value;

	location.href= board_script_url + "/find_clubs" + new_querystring;
};

/**
 * Remove default value before wrapping rml around textarea value
 */
overloadFunction('wrapSelection', function(lft, rgt)
{
	var txtarea = get_rmltextarea();

	removeDefaultValue.call(txtarea);
	arguments.callee.previousFunctionDefinition.apply(this, arguments);
	addDefaultValue.call(txtarea);
});

/*
 * Load FCKEditor 
 */
function fckEditor()
{
	if(typeof FCKeditor == 'undefined')
		return;

	// if(!board_user_is_redactie)
	// 	return;

	var field = new DOMQuery('textarea#rml_textarea').get(0);

	if(!field)
		return;

	var oFCKeditor = new FCKeditor('rml_textarea');

	oFCKeditor.Config['CustomConfigurationsPath'] = board_template_url + '/js/fckconfig.js';
	oFCKeditor.BasePath = board_template_url + '/js/FCKeditor/';
	oFCKeditor.Width = 584;

	if(board_action == 'list_message' || board_action == 'list_messages')
		oFCKeditor.Height = 200;
	else
		oFCKeditor.Height = 250;

	removeDefaultValue.call(field);
	oFCKeditor.ReplaceTextarea();
};
/*
	Colorpicker from http://www.colourlovers.com/blog/2008/01/16/free-advanced-dhtml-color-picker/ .
	Modified for implementation in React.
*/

/* Global variables */
var _stop = 1, _dragHandle = "", _dragHandleStyle, tX, tY, HSV = {0: 360,1: 0,2: 100}, hSV = 149, wSV = 140, _CLCPOffset = {x: 0, y: 0}, _canDragPicker = false, _CLCPdisplay = "none", _CLCPisDraggable = true, _CLCPposition = "absolute";
var _hueTrackHeight = 147, _clickMouseLocale = "", _clickMouseLocaleCLCPIinnerShell = false, _refreshTimeout = 0, _CLCPinitHex = "", _CLCPabsPos = "";
var _CLCPbasicLimits = {"CLCPbasicHex": [0,16777215],"CLCPbasicR": [0,255],"CLCPbasicG": [0,255],"CLCPbasicB": [0,255],"CLCPbasicH": [0,359],"CLCPbasicS": [0,100],"CLCPbasicV": [0,100],"CLCPbasicC": [0,100],"CLCPbasicM": [0,100],"CLCPbasicY": [0,100],"CLCPbasicK": [0,100]};
var CLCPFieldID = '';
var _CLCPdisplay = 'none';
var _CLCPisDraggable = true;
var _CLCPposition = 'absolute';
var _CLCPinitHex = '0039B3';

Array.prototype.CLCPin_array = function(_needle) {
	var _i;
	for (_i=0;_i<=this.length;_i++ ) {
		if (this[_i] == _needle) {
			return true;
		}
	}
	return false;
};

String.prototype.CLCPpadHex = function() {
	var _str = ("000000".toString() + this.toString());
	return _str.substring((_str.length - 6),_str.length); // THANKS IE!!!!
};

CLCPHandler = function(_hex)
{
	if(!CLCPFieldID)
		return;

	var CLCPField = new DOMQuery('#' + CLCPFieldID).get(0);

	if(CLCPField)
	{
		CLCPField.value = _hex;
		CLCPField.style.background = ("#" + _hex);
	}
};

CLCPdec2hex = function(_dec) {
	var _hexChars = "0123456789ABCDEF", _hex = "";
	while (_dec > 15) {
		_hex = (_hexChars.charAt((_dec - (Math.floor(_dec / 16)) * 16)) + _hex);
		_dec = Math.floor(_dec / 16);
	}
	return (_hexChars.charAt(_dec) + _hex);
};

CLCPhex2dec = function(_hex) {
	return parseInt(_hex,16);
};

if (typeof $$ != "function") {
	$$ = function(_elementID) {
		return new DOMQuery('#' + _elementID).get(0);
	}
};

if (typeof $S != "function") {
	$S = function(_elementID) {
		var element = $$(_elementID);

		if(!element)
			return false;

		return element.style;
	}
};

CLCPisHex = function(_hex) {
	return /^[a-fA-F0-9]{6}$/.test(_hex);
};

CLCPdomEvent = function(_event) {
	_event = (_event) ? _event : window.event;
	if (_event.srcElement) {
		_event.target = _event.srcElement;
	}
	_event.code = (_event.keyCode) ? _event.keyCode : _event.charCode;
	return _event;
};

CLCPabsPos = function(_object) {
	var r = {
		x : _object.offsetLeft,
		y : _object.offsetTop
	};
	if (_object.offsetParent) {
		var v = CLCPabsPos(_object.offsetParent);
		r.x += v.x;
		r.y += v.y;
	}
	return r;
};

CLCPinitPicker = function()
{
	if(!$S('CLCP'))
		return false;

	document.onmousemove = CLCPMouseHandlerOnMouseMove;
	document.onmouseup = CLCPMouseHandlerOnMouseUp;
	document.onmousedown = CLCPMouseHandlerOnMouseDown;

	$S("CLCP").left = 0;
	$S("CLCP").top = 0;
	$S("CLCP").width = "215px";
	$S("CLCP").height = "200px";
	$$("CLCP").innerHTML = "<div id=\"CLCPDragDiv\"><div id=\"CLCPIinnerShell\"><div id=\"CLCPPicker\"><div id=\"CLCPSatVal\" onmousedown=\"CLCPslide('CLCPSatValSlide','CLCPPicker',event);\"><div id=\"CLCPSatValSlide\"></div></div><div id=\"CLCPHueContainer\" onmousedown=\"CLCPslide('CLCPHueSlide','CLCPPicker',event);\"><div id=\"CLCPHueSlide\" style=\"top: -4px; left: -7px;\"></div><div id=\"CLCPHue\"></div></div><div id=\"CLCPSatContainer\" onmousedown=\"CLCPslide('CLCPSatSlide','CLCPPicker',event);\"><div id=\"CLCPSatSlide\" style=\"top: -4px; left: -7px;\"></div><div id=\"CLCPSat\"></div></div><div id=\"CLCPValContainer\" onmousedown=\"CLCPslide('CLCPValSlide','CLCPPicker',event);\"><div id=\"CLCPValSlide\" style=\"top: -4px; left: -7px;\"></div><div id=\"CLCPVal\"></div></div></div><div id=\"CLCPbPE\"><div style=\"width: 48px; margin-right: 10px; background: url(" + board_template_url + "img/icons/toolbar/colorpicker/hex.png) center top no-repeat;\"></div><div style=\"background: url(" + board_template_url + "img/icons/toolbar/colorpicker/r.png) center top no-repeat;\"></div><div style=\"background: url(" + board_template_url + "img/icons/toolbar/colorpicker/g.png) center top no-repeat;\"></div><div style=\"margin-right: 11px; background: url(" + board_template_url + "img/icons/toolbar/colorpicker/b.png) center top no-repeat;\"></div><div style=\"background: url(" + board_template_url + "img/icons/toolbar/colorpicker/h.png) center top no-repeat;\"></div><div style=\"background: url(" + board_template_url + "img/icons/toolbar/colorpicker/s.png) center top no-repeat;\"></div><div style=\"margin-right: 0; background: url(" + board_template_url + "img/icons/toolbar/colorpicker/v.png) center top no-repeat;\"></div><div class=\"CLCPClear CLCPNoDim\"></div><input type=\"text\" id=\"CLCPbasicHex\" maxlength=\"6\" value=\"\" style=\"width: 48px; margin-right: 12px; background: url(" + board_template_url + "img/icons/toolbar/colorpicker/formFieldLargeBG.png) no-repeat;\" /><input type=\"text\" id=\"CLCPbasicR\" maxlength=\"3\" /><input type=\"text\" id=\"CLCPbasicG\" maxlength=\"3\" /><input type=\"text\" id=\"CLCPbasicB\" maxlength=\"3\" style=\"margin-right: 13px;\" /><input type=\"text\" id=\"CLCPbasicH\" maxlength=\"3\" /><input type=\"text\" id=\"CLCPbasicS\" maxlength=\"3\" /><input type=\"text\" id=\"CLCPbasicV\" maxlength=\"3\" style=\"margin-right: 0;\" /><div class=\"CLCPClear\" style=\"width: 242px; height: 15px; margin: 0; font-size: 0;\"></div><div style=\"background: url(" + board_template_url + "img/icons/toolbar/colorpicker/c.png) center top no-repeat;\"></div><div style=\"background: url(" + board_template_url + "img/icons/toolbar/colorpicker/m.png) center top no-repeat;\"></div><div style=\"background: url(" + board_template_url + "img/icons/toolbar/colorpicker/y.png) center top no-repeat;\"></div><div style=\"background: url(" + board_template_url + "img/icons/toolbar/colorpicker/k.png) center top no-repeat;\"></div><div class=\"CLCPClear CLCPNoDim\"></div><div><input type=\"text\" id=\"CLCPbasicC\" maxlength=\"3\" /></div><div><input type=\"text\" id=\"CLCPbasicM\" maxlength=\"3\" /></div><div><input type=\"text\" id=\"CLCPbasicY\" maxlength=\"3\" /></div><div><input type=\"text\" id=\"CLCPbasicK\" maxlength=\"3\" /></div><span onclick=\"CLCPhidePicker(callback);\">"+getText('colorpicker', 'select_color')+"</span></></div></div>";

	$$("CLCPIinnerShell").onmousedown = function(_event) {
		_clickMouseLocaleCLCPIinnerShell = true;
		_canDragPicker = false;
	}
	$$("CLCPDragDiv").onmousedown = function() {
		if (_clickMouseLocaleCLCPIinnerShell == false) {
			_canDragPicker = true;
			_CLCPOffset.x = (_mouseCoords[0] - parseInt($S("CLCP").left));
			_CLCPOffset.y = (_mouseCoords[1] - parseInt($S("CLCP").top));
		}
	}

	if ((_CLCPdisplay == "block") || (_CLCPdisplay == "none")) {
		$S("CLCP").display = _CLCPdisplay;
	}
	if (_CLCPposition != "absolute") {
		$S("CLCP").position = "relative";
	}
	_CLCPinitHex = (CLCPisHex(_CLCPinitHex)) ? _CLCPinitHex : "ffffff";
	_CLCPabsPos = CLCPabsPos($$("CLCP"));
	$$("CLCPbasicHex").value = _CLCPinitHex;

	CLCPupdateBasicFromForm(null,"CLCPbasicHex");

	var _btns = ["CLCPbasicHex","CLCPbasicR","CLCPbasicG","CLCPbasicB","CLCPbasicH","CLCPbasicS","CLCPbasicV","CLCPbasicC","CLCPbasicM","CLCPbasicY","CLCPbasicK"];

	for (_i=0;_i<_btns.length;_i++) {
		if (["CLCPbasicC","CLCPbasicM","CLCPbasicY","CLCPbasicK"].CLCPin_array(_btns[_i]) == false) {
			$$(_btns[_i]).onblur = $$(_btns[_i]).onkeyup = function(_event) {
				_event = (_event) ? CLCPdomEvent(_event) : CLCPdomEvent(window.event);
				CLCPupdateBasicFromForm(_event,_event.target.id,true);
			}
		}

		$$(_btns[_i]).onkeydown = function(_event) {
			_event = (_event) ? CLCPdomEvent(_event) : CLCPdomEvent(window.event);
			var _val = $$(_event.target.id).value;
			if ([40,38].CLCPin_array(_event.code)) {
				_val = (_event.target.id == "CLCPbasicHex") ? CLCPhex2dec(_val) : parseInt(_val);
				(_event.code == 40) ? ((CLCPwithin(--_val,_CLCPbasicLimits[_event.target.id][0],_CLCPbasicLimits[_event.target.id][1])) ? "" : _val++) : ((CLCPwithin(++_val,_CLCPbasicLimits[_event.target.id][0],_CLCPbasicLimits[_event.target.id][1])) ? "" : _val--);
				_val = (_event.target.id == "CLCPbasicHex") ? CLCPdec2hex(_val).toString().CLCPpadHex() : _val;
				$$(_event.target.id).value = _val;
			}
			if ([13,40,38].CLCPin_array(_event.code)) {
				CLCPupdateBasicFromForm(_event,_event.target.id);
			}
		}
	}
};

CLCPDragPicker = function(_event) {
	if (_CLCPisDraggable == true) {
		var _xOffset = (_mouseCoords[0] - _CLCPOffset.x);
		if ($S("CLCP").position == "absolute") {
			_xOffset = (_xOffset < 0) ? 0 : _xOffset;
		}
		var _yOffset = (_mouseCoords[1] - _CLCPOffset.y);
		if ($S("CLCP").position == "absolute") {
			_yOffset = (_yOffset < 0) ? 0 : _yOffset;
		}
		$S("CLCP").left = (_xOffset + "px");
		$S("CLCP").top = (_yOffset + "px");
	}
};

CLCPMouseHandlerOnMouseMove = function(_event) {
	var _scrollTop = (document.documentElement.scrollTop) ? document.documentElement.scrollTop : document.body.scrollTop;
	var _scrollLeft = (document.documentElement.scrollLeft) ? document.documentElement.scrollLeft : document.body.scrollLeft;

	_event = (_event) ? _event : event;
	_mouseCoords = (document.all) ? [event.clientX + _scrollLeft,event.clientY + _scrollTop] : [_event.pageX,_event.pageY];

	if (_clickMouseLocale == "CLCPPicker") {
		CLCPdrag(_event);
	} else if (_canDragPicker) {
		CLCPDragPicker(_event);
	}
};

CLCPMouseHandlerOnMouseUp = function(_event) {
	document.onselectstart = function() {
		return true;
	}

	if (_clickMouseLocale == "CLCPPicker") {
		_stop = 1;
	}
	_clickMouseLocale = "";
	_canDragPicker = false;
	_clickMouseLocaleCLCPIinnerShell = false;
};

CLCPMouseHandlerOnMouseDown = function() {
	document.onselectstart = function() {
		return true;
	}
};

CLCPshowPicker = function(_obj) {
	var _x = (_obj && _obj._x) ? _obj._x : _mouseCoords[0];
	var _y = (_obj && _obj._y) ? _obj._y : _mouseCoords[1];

	callback = _obj.callback;

	if ($S("CLCP").position == "relative") {
		_x -= _CLCPabsPos.x;
		_y -= _CLCPabsPos.y;
	}

	if (_obj && CLCPisHex(_obj._hex)) {
		$$("CLCPbasicHex").value = _obj._hex;
		CLCPupdateBasicFromForm(null,"CLCPbasicHex");
	}

	$S("CLCP").left = (_x + "px");
	$S("CLCP").top = (_y + "px");
	$S("CLCP").display = "block";
};

CLCPhidePicker = function(callback) {
	$S("CLCP").display = "none";

	if(typeof callback == 'function')
		callback();
};

CLCPagent = function(_agent) {
	return Math.max(navigator.userAgent.toLowerCase().indexOf(_agent),0);
};

CLCPslide = function(_dH,_object,_event) {
	_clickMouseLocale = "CLCPPicker";
	if (_stop) {
		_stop = 0;

		_dragHandleStyle = $S(_dH);
		_dragHandle = _dH;
		_absolutePosition = CLCPabsPos($$(_object)), tX, tY;
		_absolutePosition.x += 7;
		_absolutePosition.y += 7;

		CLCPdrag(_event);
	}
};

CLCPXY = function(_event) {
	var _scrollTop = (document.documentElement.scrollTop) ? document.documentElement.scrollTop : document.body.scrollTop;
	var _scrollLeft = (document.documentElement.scrollLeft) ? document.documentElement.scrollLeft : document.body.scrollLeft;

	if (!document.all)
	{
		var layerpos = CLCPabsPos(_event.target);
		return [layerpos.x + _event.layerX, layerpos.y + _event.layerY];
	}

	return CLCPagent("msie") ? [event.clientX + _scrollLeft,event.clientY + _scrollTop] : [_event.pageX,_event.pageY];
};

CLCPtXY = function(_event) {
	tY = CLCPXY(_event)[1] - _absolutePosition.y;
	tX = CLCPXY(_event)[0] - _absolutePosition.x;
};

CLCPckHSV = function(a,b,_dragHandle) {
	if (CLCPwithin(a,0,b)) {
		return a;
	} else if (a > b) {
		return b;
	} else if (a < 0) {
		if (_dragHandle == "CLCPbasicSatValSlide") {
			return -3;
		} else {
			return -4;
		}
	}
};

CLCPwithin = function(_val,_low,_high) {
	return ((_val >= _low) && (_val <= _high));
};

CLCPmkHSV = function(a,b,c) {
	return Math.min(a,Math.max(0,Math.ceil((parseInt(c) / b) * a)));
};

CLCPdrag = function(_event) {
	_event = (!_event) ? window.event : _event;
	if (!_stop) {
		CLCPtXY(_event);

		clearTimeout(_refreshTimeout);
		if (_dragHandle == "CLCPSatValSlide") {
			_dragHandleStyle.left = CLCPckHSV(tX,wSV,_dragHandle) + "px";
			_dragHandleStyle.top = CLCPckHSV(tY,wSV,_dragHandle) + "px";

			$S("CLCPSatSlide").top = Math.floor((CLCPckHSV(tX,wSV,"CLCPSatValSlide") / wSV) * _hueTrackHeight) + "px";
			$S("CLCPValSlide").top = Math.floor((CLCPckHSV(tY,wSV,"CLCPSatValSlide") / wSV) * _hueTrackHeight) + "px";
			HSV[1] = CLCPmkHSV(100,wSV,_dragHandleStyle.left);
			HSV[2] = 100 - CLCPmkHSV(100,wSV,_dragHandleStyle.top);
		} else if (_dragHandle == "CLCPHueSlide") {
			var ck = CLCPckHSV(tY,_hueTrackHeight,_dragHandle);
			_dragHandleStyle.top = (ck + "px");
			HSV[0] = CLCPmkHSV(360,_hueTrackHeight,ck);
		} else if (_dragHandle == "CLCPSatSlide") {
			var ck = CLCPckHSV(tY,_hueTrackHeight,_dragHandle);
			_dragHandleStyle.top = (ck + "px");
			$S("CLCPSatValSlide").left = Math.floor((CLCPckHSV(tY,_hueTrackHeight,"CLCPSatValSlide") / _hueTrackHeight) * wSV) + "px";
			HSV[1] = CLCPmkHSV(100,_hueTrackHeight,ck);
		} else if (_dragHandle == "CLCPValSlide") {
			var ck = CLCPckHSV(tY,_hueTrackHeight,_dragHandle);
			_dragHandleStyle.top = (ck + "px");
			$S("CLCPSatValSlide").top = Math.floor((CLCPckHSV(tY,_hueTrackHeight,"CLCPSatValSlide") / _hueTrackHeight) * wSV) + "px";
			HSV[2] = (100 - CLCPmkHSV(100,_hueTrackHeight,ck));
		}

		$S("CLCPSatVal").backgroundColor = $S("CLCPSat").backgroundColor = $S("CLCPVal").backgroundColor = ("#" + CLCPhsv2hex([HSV[0],100,100]));
		if (CLCPHandler) {
			CLCPHandler(CLCPhsv2hex(HSV));
		}
		CLCPupdateBasicFormElements();
	}
};

CLCPupdateBasicFormElements = function(_except) {
	if (_except != "CLCPbasicHex") {
		$$("CLCPbasicHex").value = CLCPhsv2hex(HSV);
	}

	var _rgb = CLCPhsv2rgb(HSV);
	if (_except != "CLCPbasicR") {
		$$("CLCPbasicR").value = parseInt(_rgb[0]);
	}
	if (_except != "CLCPbasicG") {
		$$("CLCPbasicG").value = parseInt(_rgb[1]);
	}
	if (_except != "CLCPbasicB") {
		$$("CLCPbasicB").value = parseInt(_rgb[2]);
	}

	if (_except != "CLCPbasicH") {
		$$("CLCPbasicH").value = parseInt(HSV[0]);
	}
	if (_except != "CLCPbasicS") {
		$$("CLCPbasicS").value = parseInt(HSV[1]);
	}
	if (_except != "CLCPbasicV") {
		$$("CLCPbasicV").value = parseInt(HSV[2]);
	}

	var _cmyk = CLCPrgb2cmyk(CLCPhsv2rgb(HSV));
	if (_except != "CLCPbasicC") {
		$$("CLCPbasicC").value = parseInt(_cmyk[0]);
	}
	if (_except != "CLCPbasicM") {
		$$("CLCPbasicM").value = parseInt(_cmyk[1]);
	}
	if (_except != "CLCPbasicY") {
		$$("CLCPbasicY").value = parseInt(_cmyk[2]);
	}
	if (_except != "CLCPbasicK") {
		$$("CLCPbasicK").value = parseInt(_cmyk[3]);
	}
};

CLCPupdateBasicFromForm = function(_event,_elementID) {
	if (_elementID == "") {
		_event = (_event) ? _event : window.event;
		if (_event.srcElement) {
			_event.target = _event.srcElement;
		}
		var _id = _event.target.id;
	} else {
		var _id = _elementID;
	}
	var _val = $$(_id).value, _canUpdate = false, _skipHSV = false;

	if (_id == "CLCPbasicHex") {
		if (CLCPisHex(_val)) {
			HSV = CLCPrgb2hsv(CLCPhex2rgb(_val));
			_canUpdate = true, _skipHSV = true;
		}
	} else if (_id == "CLCPbasicR") {
		_val = parseInt(_val);
		if (CLCPwithin(_val,0,255)) {
			var _rgb = CLCPhsv2rgb(HSV);
			HSV = CLCPrgb2hsv([_val,_rgb[1],_rgb[2]]);
			_canUpdate = true;
		}
	} else if (_id == "CLCPbasicG") {
		_val = parseInt(_val);
		if (CLCPwithin(_val,0,255)) {
			var _rgb = CLCPhsv2rgb(HSV);
			HSV = CLCPrgb2hsv([_rgb[0],_val,_rgb[2]]);
			_canUpdate = true;
		}
	} else if (_id == "CLCPbasicB") {
		_val = parseInt(_val);
		if (CLCPwithin(_val,0,255)) {
			var _rgb = CLCPhsv2rgb(HSV);
			HSV = CLCPrgb2hsv([_rgb[0],_rgb[1],_val]);
			_canUpdate = true;
		}
	} else if (_id == "CLCPbasicH") {
		_val = parseInt(_val);
		if (CLCPwithin(_val,0,360)) {
			HSV = [_val,HSV[1],HSV[2]]
			_canUpdate = true;
		}
	} else if (_id == "CLCPbasicS") {
		_val = parseInt(_val);
		if (CLCPwithin(_val,0,360)) {
			HSV = [HSV[0],_val,HSV[2]]
			_canUpdate = true;
		}
	} else if (_id == "CLCPbasicV") {
		_val = parseInt(_val);
		if (CLCPwithin(_val,0,360)) {
			HSV = [HSV[0],HSV[1],_val]
			_canUpdate = true;
		}
	} else if ((_id == "CLCPbasicC") || (_id == "CLCPbasicM") || (_id == "CLCPbasicY") || (_id == "CLCPbasicK")) {
		_c = parseInt($$("CLCPbasicC").value);
		_m = parseInt($$("CLCPbasicM").value);
		_y = parseInt($$("CLCPbasicY").value);
		_k = parseInt($$("CLCPbasicK").value);

		if (_id == "CLCPbasicC") {
			_c = (CLCPwithin(_c,0,100)) ? _c : 0;
		} else if (_id == "CLCPbasicM") {
			_m = (CLCPwithin(_m,0,100)) ? _m : 0;
		} else if (_id == "CLCPbasicY") {
			_y = (CLCPwithin(_y,0,100)) ? _y : 0;
		} else if (_id == "CLCPbasicK") {
			_k = (CLCPwithin(_k,0,100)) ? _k : 0;
		}
		HSV = CLCPrgb2hsv(CLCPcmyk2rgb([_c,_m,_y,_k]));
		_canUpdate = true;
	}

	if (_canUpdate) {
		var _hueSliderY = CLCPh2y(HSV[0]);
		var _satSliderY = CLCPs2y(HSV[1]);
		var _valSliderY = CLCPv2y(HSV[2]);

		$S("CLCPHueSlide").top = Math.floor(CLCPckHSV((_hueSliderY - 3),_hueTrackHeight + 3,"CLCPHueSlide")) + "px";
		$S("CLCPSatSlide").top = Math.floor(CLCPckHSV((_satSliderY - 3),_hueTrackHeight + 3,"CLCPSatSlide")) + "px";
		$S("CLCPValSlide").top = Math.floor(CLCPckHSV((_valSliderY - 3),_hueTrackHeight + 3,"CLCPValSlide")) + "px";

		$S("CLCPSatValSlide").left = Math.ceil(CLCPckHSV((_satSliderY - 7),wSV,"CLCPSatValSlide")) + "px";
		$S("CLCPSatValSlide").top = Math.ceil(CLCPckHSV((_valSliderY - 7),wSV,"CLCPSatValSlide")) + "px";
		$S("CLCPSatVal").backgroundColor = $S("CLCPSat").backgroundColor = $S("CLCPVal").backgroundColor = ("#" + CLCPhsv2hex([HSV[0],100,100]));
		var _tmp = (_skipHSV == false) ? CLCPhsv2hex(HSV) : _val;

		if (CLCPHandler) {
			CLCPHandler(_tmp);
		}
		CLCPupdateBasicFormElements(_id);
	}
};


/* CONVERSIONS */
CLCPh2y = function(_hue) {
	return ((_hue / 360) * _hueTrackHeight);
};
CLCPs2y = function(_satVal) {
	return ((_satVal / 100) * _hueTrackHeight);
};
CLCPv2y = function(_valVal) {
	return (Math.abs(((_valVal / 100) * (_hueTrackHeight + 3)) - _hueTrackHeight - 3));
};
CLCPhsv2hex = function(h) {
	return CLCPrgb2hex(CLCPhsv2rgb(h));
};
CLCPtoHex = function(v) {
	v=Math.round(Math.min(Math.max(0,v),255)); return("0123456789ABCDEF".charAt((v-v%16)/16)+"0123456789ABCDEF".charAt(v%16));
};
CLCPhex2rgb = function(r) {
	return({0:parseInt(r.substr(0,2),16),1:parseInt(r.substr(2,2),16),2:parseInt(r.substr(4,2),16)});
};
CLCPrgb2hex = function(r) {
	return(CLCPtoHex(r[0])+CLCPtoHex(r[1])+CLCPtoHex(r[2]));
};
CLCPrgb2hsv = function(r) {
	var max=Math.max(r[0],r[1],r[2]), delta=max-Math.min(r[0],r[1],r[2]), H, S, V;
	if(max!=0) {
		S=Math.round(delta/max*100);
		if(r[0]==max) H=(r[1]-r[2])/delta; else if(r[1]==max) H=2+(r[2]-r[0])/delta; else if(r[2]==max) H=4+(r[0]-r[1])/delta; var H=Math.min(Math.round(H*60),360); if(H<0) H+=360;
	}
	return({0:H?H:0,1:S?S:0,2:Math.round((max/255)*100)});
};
CLCPhsv2rgb = function(r) {
	var F, R, B, G, H=r[0]/360, S=r[1]/100, V=r[2]/100;
	if(S>0) {
		if(H>=1) H=0;
		H=6*H; F=H-Math.floor(H); A=Math.round(255*V*(1-S)); B=Math.round(255*V*(1-(S*F))); C=Math.round(255*V*(1-(S*(1-F)))); V=Math.round(255*V);
		switch(Math.floor(H)) {
			case 0: R=V; G=C; B=A; break;
			case 1: R=B; G=V; B=A; break;
			case 2: R=A; G=V; B=C; break;
			case 3: R=A; G=B; B=V; break;
			case 4: R=C; G=A; B=V; break;
			case 5: R=V; G=A; B=B; break;
		}
		return([R?R:0,G?G:0,B?B:0]);
	}
	else return([(V=Math.round(V*255)),V,V]);
};
CLCPrgb2cmyk = function(r) {
	var C=1-(r[0]/255), M=1-(r[1]/255), Y=1-(r[2]/255), K=Math.min(Y,Math.min(M,Math.min(C,1)));
	C=Math.round((C-K)/(1-K)*100);
	C = (isNaN(C)) ? 0 : C;
	M=Math.round((M-K)/(1-K)*100);
	M = (isNaN(M)) ? 0 : M;
	Y=Math.round((Y-K)/(1-K)*100);
	Y = (isNaN(Y)) ? 0 : Y;
	K=Math.round(K*100);
	return([C?C:0,M?M:0,Y?Y:0,K]);
};
CLCPcmyk2rgb = function(r) {
	r[3]=r[3]/100; var R=(1-(r[0]/100*(1-r[3])+r[3]))*255, G=(1-(r[1]/100*(1-r[3])+r[3]))*255, B=(1-(r[2]/100*(1-r[3])+r[3]))*255;
	return([R,G,B]);
};
function contentInLayer(targets)
{
	if(!jscss('check', DOMQuery.prototype.scope, 'lightbox-content'))
		addEventToTargets(targets, 'click', _contentInLayer, 'a[rel^="layer"], body.list_messages div.extra-actions ul.links li[class] a, body.list_message div.extra-actions ul.links li[class] a');
};

function _contentInLayer(e)
{
	var rel = this.getAttribute('rel') && this.getAttribute('rel').match(/layer\[([^\]]+)\]/i);
	var className = 'layer' + (rel && rel.length ? '-' + rel[1] : '');

	/* Determine an id to identify this layer */
	var id;
	if(this.id)
		id = 'layer-' + this.id;
	else if(this.className)
		id = 'layer-' + this.className.replace(/\s/, '-');
	else
		id = (this.pathname + this.search).replace(/[^a-z]+/g, '-').replace(/^-*|-*$/, '');

	var specificElement = 'div#core';
	var container, onSubmitCallback;
	if(typeof _contentInLayerCallback == 'function')
	{
		var result = _contentInLayerCallback(this, id, rel);
		if(result === false)
		/* if result is explicitally 'false', the _contentInLayerCallback refuses to handle this, and indicates a removal */
		{
			e.preventDefault();
			return;
		}
		else if(result)
		{
			specificElement = result['specificElement'];
			container = result['container'];
			onSubmitCallback = result['onSubmitCallback'];
			updateType = result['updateType'];
		}
	}

	if(!container)
	{
		if(!id.length)
			return false;

		/* Check if lightbox already exists */
		if(toggleLightbox(id))
		{
			e.preventDefault();
			return;
		}

		container = createDOMNode(
			'div', 	{ 'class' : 'lightbox-content loading' }, [
				createDOMNode('span', { 'class' : 'clickable close', 'id' : 'close', 'event' : ['click', toggleLightbox] }, [ 'Sluit venster' ])
			]
		);

		var lightbox = createLightbox(container, id, className);
		jscss('add', lightbox, 'request-running');
	}

	e.preventDefault();

	/*	Fix bug in both IE6 and Safari; when a.pathname is used and the a.href contains
	 *	special characters (for example <a href=".../%FCn%EDc%A7de%20dingen">):
	 *		* IE6 - decodes both a.href and a.pathname
	 *		* Safari - decodes a.pathname
	 */
	var pathname, href;
	if (isIE6 || isWebKit)
	{
		if (isIE6)
			href = this.getAttribute('href', 2);
		else
			href = this.href;

		hrefParts = href.match(/^https?:\/\/[^/]+(\/[^?]*)/);
		pathname = hrefParts[1];

		if (isIE6)
			pathname = pathname.substring(1);
	} else
		pathname = this.pathname;
		
	var req = httpreq_string(this.search.substr(1), null, (isIE ? '/' : '') + pathname, true, 'GET');
	var invoker = this; /* we assign this to a custom name so scoping with 'this' wont be a problem later on */

	req.onreadystatechange = function()
	{
		if (req.readyState != 4)
			return;

		jscss('remove', invoker, 'request-running');

		if(lightbox)
			jscss('remove', lightbox, 'request-running');

		if(req.getResponseHeader('X-Errormessage'))
		{
			handleXErrorMessage( req.getResponseHeader('X-Errormessage'), container );
			return;
		}

		var element = getElementFromXHR(req, specificElement);
		// console.log('fetching ', specificElement, ' from ', req, ' found ', element);
		if(!element)
		{
			if(lightbox)
				toggleLightbox(id);

			document.location.href = invoker.href;
			return;
		}

		var form = new DOMQuery('form.primary-input', element).get(0);
		if(!form && element.tagName.toLowerCase() == 'form')
			form = element;

		if(form)
		{
			/*
				To prevent the onsubmit() function to submit the form using a XHR,
				we have to store wether any previous action has stopped the default action
				(submitting of the form).
				So, we attach a special event at the propagation-phase (before all events[]
				do their work) at the parentNode, and modify the event-object to store
				wether preventDefault() has been called.
				Then, the second event-listener is called during the bubble-phase - and it
				checks wether the event has determined preventDefault() has been called.

				However... IE must die!
				It doesn't support propagation for submit-events, so we use the addEvent's behaviour
				of calling the functions in sequence of assignment to emulate the behaviour.
			*/

			var eventTarget = form;
			if(form.addEventListener)
			{
				var eventTarget = element;
			}

			/* only attach the handler on the container once */
			if(eventTarget.tagName == 'form' || typeof eventTarget.__preventDefaultHandler == 'undefined')
			{
				addEvent.eventListenerUseCapture = true;
				addEvent(eventTarget, 'submit', function(e)
				{
					e.__preventDefault = e.preventDefault;
					e.preventDefault = function()
					{
						e.defaultPrevented = true;
						e.__preventDefault();
					};
				});
				addEvent.eventListenerUseCapture = false;
				eventTarget.__preventDefaultHandler = true;
			}

			var previewButton = new DOMQuery('input[name="data[preview]"]', element).get(0), previewButtonPressed = false;
			if(previewButton)
			{
				/* assumption: preview triggers a complete page refresh. If not, you'll have to reset previewButtonPressed to make other buttons work again */
				addEvent(previewButton, 'click', function(e){ previewButtonPressed = true; });
			}

			var onsubmit = function(e)
			{
				if(e.defaultPrevented)
					return false;

				jscss('add', invoker, 'request-running');

				/* find out wether preview or submit has been hit */
				if(previewButtonPressed)
					return true;

				var processResult = function(transport, error)
				{
					jscss('remove', invoker, 'request-running');

					if(error)
					{
						handleXErrorMessage( error, container );
						return;
					}

					var callbackResult = {
						removeForm: true,
						toggleLightbox: true
					};

					if(onSubmitCallback) {
						tmpCallbackResult = onSubmitCallback(transport, container, invoker);

						if (typeof tmpCallbackResult == "object")
							callbackResult = tmpCallbackResult;
					}

					if(callbackResult.removeForm)
						form.parentNode.removeChild(form);

					if(lightbox && callbackResult.toggleLightbox)
					{
						toggleLightbox(id, true);
					}

					jscss('add', invoker, 'request-completed');
					setTimeout(function() { jscss('remove', invoker, 'request-completed'); jscss('remove', invoker, 'request-active'); }, 5000);
				};

				var request = gatherHttpForm(this);

				if(request)
				{
					var updatereq = httpreq_string(request, null, null, false);

					/* Evaluate javascripts TODO */
					/*
					var scripts = new DOMQuery('script[type="text/javascript"]', updatereq);
					for(var i = 0, script; (script = scripts.get(i)); i++)
						if(script.getAttribute('src') == '')
							eval(script.innerHTML);
					*/

					processResult(updatereq, updatereq.getResponseHeader('X-Errormessage'));

					e.preventDefault();
				}
				else // submit to iframe
				{
					var iframeName = 'iframe-xhr-emulator-' + new Date().getTime();
					var oldIframe = new DOMQuery('iframe.iframe-xhr-emulator').get(0);

					if(oldIframe)
						oldIframe.parentNode.removeChild(oldIframe);

					if(isIE)
					{
						var ieHelper = createDOMNode('div', {}, []);
						ieHelper.innerHTML = '<iframe name="'+iframeName+'" id="'+iframeName+'" src="about:blank" class="display-none iframe-xhr-emulator"></iframe>';
						document.body.appendChild(ieHelper);
						ieHelper.firstChild.onreadystatechange = function(){ if(this.readyState=='complete') { processResult(this.contentWindow, parent.frames[iframeName].error_message);} };

					}
					else
					{
						document.body.appendChild(createDOMNode(
							'iframe',
							{
								'class' : 'display-none iframe-xhr-emulator',
								'name' : iframeName,
								'id' : iframeName,
								'event' : ['load', function(){ processResult(this.contentDocument, window.frames[iframeName].error_message); }]
							},
							[]
						));
					}

					this.target = iframeName;
					this.setAttribute('target', iframeName);
					this.appendChild(createDOMNode('input', {'type' : 'hidden', 'name' : 'dont_meta_refresh', 'value' : '1'}, []));

					return;
				}
			};

			addEvent(form, 'submit', onsubmit);
		}

		/*
		 * This code handles 2 updateTypes; 'replace' and 'append'. When using updateType 'replace', 
		 * in most cases the element to be replaced already exists. The 'extra-actions' though are special. 
		 * The first request appends the specified action; following requests replace the already existing form. 
		 * Todo: find a nice solution instead of checking on class 'extra-actions'
		 */
		if (typeof updateType == 'string' && updateType == 'replace') 
		{
			var extraAction = jscss('check', container, 'extra-actions');
			
			if(extraAction)
			{
				var x = container.lastChild;
			
				if(x && x.tagName.toLowerCase() == 'form') 
				{
					container.replaceChild(element, x);
					container = element;
				}
				else
					container.appendChild(element);
			}
			else
			{
				var myparent = getSiblingNode(container, 'up');
				myparent.replaceChild(element, container);
				
				container = element;
			}
		} 
		else
			container.appendChild(element);

		if(!e.inline && !extraAction)
			jscss('add', document.body, 'displaying-lightbox');

		/* Evaluate javascripts */
		var scripts = new DOMQuery('script[type="text/javascript"]', container);
		for(var i = 0, script; (script = scripts.get(i)); i++)
			if(script.getAttribute('src') == null || script.getAttribute('src') == '')
				eval(script.innerHTML);

		/* Fire events applied to container */

		_init(events, container);

		jscss('remove', container, 'loading');
	};

	e.preventDefault();
};

function handleXErrorMessage(error, container)
{
	alert( error );
};

function _contentInLayerCallback(invoker, id, rel)
{
	if(rel && rel.length) /* it's a layer */
		return;

	/* if it's not a layer, it's a topic-action */
	var li = getSiblingNode(invoker, 'up', 'li');
	if(!li)
		return;

	var topicid = invoker.href.replace(/.+(insert_topicreport|insert_bookmark|add_keywords|delete_keywords|insert_notification|rate|set_topic_posthistory|rate)(\/\D+)?\/(\d+)(.+)?/, '$3');
	if(!topicid)
		return;

	var classNames = jscss('get', li), request, formName;
	for(var i = 0; i < classNames.length;i++)
	{
		switch(classNames[i])
		{
			case 'topic-add-keyword':
			case 'topic-delete-keyword':
				// request = 'action=add_keywords&data%5Btype%5D=topic&data%5Bid%5D='+topicid;
				formName = 'form-add-keywords';

				if(classNames[i] == 'topic-delete-keyword')
				{
					request = 'action=delete_keywords&data%5Btype%5D=topic&data%5Bid%5D='+topicid;
					formName = 'form-delete-keywords';
				}

				var onSubmitCallback = function ()
				{
					var keywords = new DOMQuery('dl.topic-keywords dd').get(0);

					if(!keywords)
						return;

					var newKeywords = new DOMQuery('form#'+formname+' input#keywords').get(0).value;
					var listTopicsUrl = new DOMQuery('a', keywords).get(0).href;

					newKeywords = newKeywords.split(' ');

					for(var j = 0; j < newKeywords.length; j++)
						keywords.appendChild(createDOMNode('a', { 'href' : listTopicsUrl.replace(/=.+/i, '=' + newKeywords[j]) }, [ ' ' + newKeywords[j] ]));
				};
			break;
			case 'topic-report':
				// request = 'action=insert_topicreport&data%5Btopicid%5D='+topicid;
				formName = 'form-insert-topicreport';
			break;
			case 'topic-bookmark':
				// request = 'action=insert_bookmark&data%5Btopicid%5D='+topicid;
				formName = 'form-insert-bookmark';
			break;
			case 'topic-notification':
				// request = 'action=insert_notification&data%5Btype%5D=topic&data%5Bid%5D='+topicid;
				formName = 'form-insert-notification';
			break;
			case 'topic-posthistory':
				// request = 'action=set_topic_posthistory&data%5Btopicid%5D='+topicid;
				formName = 'form-posthistory-set';
			break;
			case 'topic-rate':
				// request = 'action=rate&data%5Btype%5D=topic&data%5Bid%5D='+topicid;
				formName = 'form-rate';
			break;
		}

		if(formName)
			break;
	}

	if(!formName)
		return;

	function removeForm()
	{
		var oldForm = new DOMQuery('form#'+formName, container).get(0);
		if(oldForm)
		{
			oldForm.parentNode.removeChild(oldForm);
			jscss('remove', invoker, 'request-active');
			jscss('remove', document.body, 'displaying-lightbox');
			return true;
		}
	}

	if(removeForm())
	{
		return false;
	}

	addEvent(document.body, 'keyup', function(e)
	{
		if(e.keyCode == 27) // escape, unlike the lightbox-escape handler we don't just allow the event on the body, but everywhere
		{
			removeForm();
			removeEvent(document.body, 'keyup', arguments.callee)
		}
	});

	var container = new DOMQuery("div.extra-actions").get(0);
	return {specificElement : 'form#' + formName, container : container, onSubmitCallback : onSubmitCallback, updateType : 'replace'};
}

function updateMessagesThruXmlHttp(targets)
{
	var items = getTargets(targets, "ol.messages li.message ul.message-links li.message-edit a");
	for(var i = 0, item;(item=items.get(i));i++)
	{
		addEvent(item, 'click',
			function(e)
			{
				var messageid = this.href.replace(/.+update_message\/(\d+)(.+)?/, '$1');
				if(!messageid)
					return true;

				var container = new DOMQuery("ol.messages li#message-" + messageid +" div.message-content").get(0);

				var result = xmlHttpForm(
						this,
						'action=update_message&data%5Bmessageid%5D='+messageid,
						container,
						function()
						{
							var request = 'action=view_message&data%5Bmessageid%5D='+messageid;
							var resultreq = httpreq_string(request, null, null, false);

							var target = new DOMQuery('div.message-content-content', container).get(0);
							while(target.childNodes.length > 0)
							{
								target.removeChild(target.firstChild);
							}

							var source = new DOMQuery('div#core form.primary-input dl.property-list dt:first-child + dd', resultreq.responseXML).get(0);
							while(source.childNodes.length > 0)
							{
								target.appendChild( source.removeChild(source.firstChild) );
							}
						}
				);

				if(result)
					e.preventDefault();
			}
		);
	}
};

function gatherHttpForm(form)
{
	var items = form.elements;
	var str = [ ];

	for(var i = 0, item;(item=items[i]);i++)
	{
		if(item.disabled)
			continue;

		switch( item.tagName.toLowerCase() )
		{
			case 'input':
				switch(item.type)
				{
					case 'text':
					case 'hidden':
					case 'password':
						str.push(encodeURIComponent(item.name)+'='+ encodeURIComponent( item.value ) );
					break;
					case 'radio':
					case 'checkbox':
						if(item.checked)
							str.push(encodeURIComponent(item.name)+'='+ encodeURIComponent( item.value ) );
					break;
					case 'file':
						if(item.value)
							return;
					break;
				}
			break;
			case 'select':
				if(item.selectedIndex > -1)
					str.push(encodeURIComponent(item.name)+'='+ encodeURIComponent( item.options[item.selectedIndex].value ) );
			break;
			case 'textarea':
				str.push(encodeURIComponent(item.name)+'='+ encodeURIComponent( item.value ) );
			break;
		}
	}

	return str.join('&');
};

function httpreq_xml(request, callback, url, async)
{
	var xmlurl = url || board_script_url + '/../xml_input.php';
  	var xmlParser, xmlDocument, req;

	if(window.XMLHttpRequest)
	{
		/* safari 1.3/2.0 doesn't support DOMParser */
		if(typeof DOMParser == "undefined")
			return false;

		req = new XMLHttpRequest();
		xmlParser = new DOMParser();
		xmlDocument = xmlParser.parseFromString(request, 'text/xml');
	}
	else if(window.ActiveXObject)
	{
		req = new ActiveXObject("MSXML2.XMLHTTP.3.0");

		xmlDocument = new ActiveXObject('Msxml2.DOMDocument.3.0');
		xmlDocument.async = false;
		xmlDocument.loadXML(request);
	}

	xmlDocument.insertBefore(xmlDocument.createProcessingInstruction("xml", "version='1.0'"), xmlDocument.firstChild);

	if(callback)
		req.onreadystatechange = callback;

	req.open("POST", xmlurl, (typeof async == "boolean" ? async : true) );

	if(window.XMLHttpRequest)
	{
		req.setRequestHeader('Content-Type', 'text/xml; utf-8');
	}

	req.send(request);

	return req;
};

function httpreq_string(request, callback, url, async, method)
{
  	var req;
	var xmlurl = url || board_script_url;
	method = method || "POST";
  	async = (typeof async == "boolean" ? async : true);

	if(window.XMLHttpRequest)
	{
		req = new XMLHttpRequest();
	}
	else if(window.ActiveXObject)
	{
		req = new ActiveXObject("MSXML2.XMLHTTP.3.0");
	}

	if(callback)
		req.onreadystatechange = callback;

	if(req.overrideMimeType)
		req.overrideMimeType('text/xml');

	request += '&dont_meta_refresh=1' + (isIE ? '&' + new Date().getTime() : '');

	if(method == "GET")
	{
		req.open(method, xmlurl + '?' + request, async );
		req.setRequestHeader('Content-type', 'application/x-www-form-urlencoded; charset=UTF-8');
		req.send(null);
	}
	else
	{
		req.open(method, xmlurl, async );
		req.setRequestHeader('Content-type', 'application/x-www-form-urlencoded; charset=UTF-8');
		req.send(request);
	}

	return req;
};

/* the container specifies the desired endpoint for the node */
function getElementFromXHR(transport, selector, container)
{
	container = container || document.body;
	var root;
	if(isWebKit || !transportHasValidResponseXML(transport) || isIE)
	{
		root = document.createElement('div');
		root.innerHTML = transport.responseText;

		/* nasty workaround; prototype actually uses getElementbyId, and so any selector with an id
		implies that the transport-content needs to be attached to the current document. Blegh. */
		if(DOMQuery.prototype.resultType == 'getElementsBySelector' && selector.match(/#/) )
		{
			document.appendChild(root);
			var cleanup = true;
		}
	}
	else
	{
		root = transport.responseXML;
	}

	var element = new DOMQuery(selector, root).get(0);
	if(cleanup)
		document.removeChild(root);

	if(!element)
		return;

	if(isWebKit || !transportHasValidResponseXML(transport) || isIE)
		return element;

	var _element;
	try
	{
		_element = container.ownerDocument.adoptNode( element, true );
	}
	catch(e)
	{
		_element = container.ownerDocument.importNode( element, true );
	}

	return container.namespaceURI == _element.namespaceURI ? _element : importNodeCurrentNS( _element );
};

function transportHasValidResponseXML(transport)
{
	if ( typeof transport.responseXML != 'undefined' || transport.responseXML.firstChild.tagName == 'parsererror' || transport.responseXML.documentElement == null || transport.responseXML.documentElement == 'undefined')
		return false;

	return true;
};

function importNodeCurrentNS(node)
{
	var clone;

	switch(node.nodeType)
	{
		default:
		case 8: /* comment */
			return;
		case 3: /* text */
			return document.createTextNode( node.nodeValue );
		case 1: /* node */
			clone = document.createElement( node.tagName );
	}

	for(var i=0, attribute; (attribute=node.attributes[i]); i++)
	{
		clone.setAttribute(attribute.name, attribute.value);
	}

	for(var j=0, subNode, importedSubNode; (subNode=node.childNodes[j]); j++)
	{
		importedSubNode = arguments.callee( node.childNodes[j] );
		if(importedSubNode)
			clone.appendChild( importedSubNode );
	}

	return clone;
};

var _contentInLayerCallbackOriginal = _contentInLayerCallback;
var _contentInLayerCallback = function(invoker, id, rel)
{
	if(rel && rel.length) /* it's a layer */
	{
		switch (rel[1]) {
			case 'community-topics':
			case 'community-photo':
			case 'communities-list':
				var current_block = getSiblingNode(invoker, 'up', 'div');

				jscss('add', invoker, 'request-running');

				return {
					specificElement: 'div.block',
					container: current_block,
					updateType: 'replace'
				};
			case 'microblog':
				var microblog_content = getSiblingNode(invoker, 'up', 'div');

				jscss('add', invoker, 'request-running');

				return {
					specificElement: 'div.microblog.block-is-primary-react-action div.microblog-content',
					container: microblog_content,
					updateType: 'replace'
				};
			break;
			case 'create_user':
			case 'login':
			case 'user_profile':
			case 'user_messages':
			case 'edit_user':

				window.scrollTo(0,0);

				switch(rel[1])
				{
					case 'create_user':
						board_action = 'create_user';
					break;
					case 'login':
						board_action = board_action_original;
					break;
					case 'edit_user':
					case 'user_profile':
						board_action = 'edit_user';
					break;
				}

				validateForms.calledFromLightbox = true;

				var dashboardWrapper = new DOMQuery('div#dashboard').get(0);
				var dashboards = new DOMQuery('div.dashboard-content', dashboardWrapper);
				var thisDashboard = new DOMQuery('div#dashboard-' + rel[1], dashboardWrapper).get(0);

				var invokerIsTab = (getSiblingNode(invoker, 'up', 'ul') && getSiblingNode(invoker, 'up', 'ul').id == 'navigation-dashboard' ? true : false);

				/* Hide all dashboards exept this one */
				for(var i = 0, dashboard; (dashboard = dashboards.get(i)); i++)
				{
					// if(thisDashboard && dashboard.id == thisDashboard.id)
						// continue;

					/* Completely remove dashboards 'user_profile' and 'edit_user' to delete old data */
					// if((rel[1] == 'edit_user' && dashboard.id == 'dashboard-user_profile') || dashboard.id == 'dashboard-edit_user')
					// 	dashboard.parentNode.removeChild(dashboard);
					// else
					// 	jscss('add', dashboard, 'display-none');
					
					dashboard.parentNode.removeChild(dashboard);
				}

				if(thisDashboard && invokerIsTab)
				{
					/* Remove scrollIntoView function to prevent toggleLightbox from scrolling */
					thisDashboard.scrollIntoView = undefined;

					/* Dashboard already exists. Toggle dashboard and return false to stop request. */
					toggleLightbox(thisDashboard.id, true);

					jscss('remove', document.body, 'displaying-lightbox');

					/* Switching between dashboard-tabs might confuse toggleLightbox, we'll double check the dashboard status and add corresponding class to body */
					// if(jscss('check', thisDashboard, 'display-none'))
					// 	jscss('remove', document.body, 'displaying-lightbox');
					// else
					// 	jscss('add', document.body, 'displaying-lightbox');

					return false;
				}

				/* Create "HUU BERT" button */
				var cancel = createDOMNode('span',
					{
						'class'	: 'cancel',
						'event' : [ 'click', function() { toggleLightbox('dashboard-' + rel[1], true); } ]
					},
					[ getText('dashboard', 'cancel') ]
				);

				/* Create loading indicator */
				var loading = createDOMNode('div', { 'class' : 'loading-indicator' }, []);

				/* Create dashboard content container */
				thisDashboard = createDOMNode('div', { 'class' : 'dashboard-content loading', 'id' : 'dashboard-' + rel[1] }, [ cancel, loading ]);
				thisDashboard.scrollIntoView = undefined;
				dashboardWrapper.appendChild(thisDashboard);

				return {
					specificElement : 'div.block-type-react-action',
					container : thisDashboard,
					onSubmitCallback : layerSubmitCallback
					// updateType : 'replace'
				};
		}
	}

	return _contentInLayerCallbackOriginal.apply(this, arguments);
};

/**
 * Handle result after submitting forms
 */
function layerSubmitCallback(xhrRequest, container, invoker)
{
	var rel = invoker.getAttribute('rel') && invoker.getAttribute('rel').match(/layer\[([^\]]+)\]/i);

	if(!rel.length)
		return;

	switch(rel[1])
	{
		case 'login':
			checkRedirect(rel[1]);

			return {
				toggleLightbox: true
			};
		break;
		case 'create_user':
			/* Find p in action-header and replace content with result message */
			var resultMessage = getElementFromXHR(xhrRequest, 'div#core div.block-is-primary-react-action p.body').firstChild.nodeValue;
			var p = new DOMQuery('div#action-header p', container).get(0);

			p.firstChild.nodeValue = resultMessage;

			return {
				removeForm : true,
				toggleLightbox: false
			};
		break;
		case 'edit_user':
			var a = new DOMQuery('ul#navigation-dashboard li.nav-profile a[rel]').get(0);

			openLightbox(a);

			return {
				toggleLightbox: true
			};
	}
};

/**
 * Forward user to action after logging in or creating accout
 */
function checkRedirect(action)
{
	var redirect_location;

	switch(board_autojoin_action)
	{
		case 'write_blog':
			redirect_location = board_script_url + '/insert_topic/' + board_community_id + '?data[topicstatusid]=8';
		break;
		case 'write_topic':
			redirect_location = board_script_url + '/insert_topic/' + board_community_id + '?data[topicstatusid]=16';
		break;
		case 'reply_topic':
		case 'reply_blog':
			redirect_location = board_script_url + '/list_messages/' + board_autojoin_action_id + '/last#list-messages-quickreply';
		break;
		case 'reply_document':
			redirect_location = board_script_url + '/list_documentmessages/' + board_autojoin_action_id + '/last#list-messages-quickreply';
		break;
		case 'add_photo':
			redirect_location = board_script_url + '/club/' + board_community_id + '/nieuwe_foto';
		break;
		case 'club_homepage':
			redirect_location = board_script_url + '/club/' + board_community_id;
		break;
		default:
			redirect_location = board_script_url + '/page/home?data[lightbox_onload]=user_profile';
		break;
	}

	if(redirect_location != '')
		document.location.href = redirect_location;
};

/**
 * Show x-error-header messages inline
 */
function handleXErrorMessage(error, container)
{
	jscss('remove', container, 'loading');

	var form = new DOMQuery('form.primary-input', container).get(0);

	if(!form)
		return;

	jscss('remove', form, 'submitting');
	jscss('remove', form, 'submitting-preview');

	var p_error = createDOMNode('p', { 'class' : 'x-error-message' }, [ error ]);
	var p = new DOMQuery('p.x-error-message', form).get(0);

	if(p)
		p.parentNode.replaceChild(p_error, p);
	else
		form.insertBefore(p_error, form.firstChild);
		
	window.scrollTo(0,0);
};

function openOnloadLightbox()
{
	if(typeof lightbox_onload == 'undefined' || !lightbox_onload)
		return;

	if(isIE)
	{
		/* DOMQuery like 'a[rel="layer[waa]"]' doesn't work in IE, use workaround to find matching link */
		var a = new DOMQuery('a[rel*=' + lightbox_onload + ']').get(0);

		if(!a)
			return;

		if(a.getAttribute('rel').indexOf('layer[' + lightbox_onload + ']') == -1)
			return;
	}
	else
		var a = new DOMQuery('a[rel="layer[' + lightbox_onload + ']"]').get(0);

	if(!a)
		return;

	openLightbox(a);
};

function openLightbox(invoker)
{
	if(document.createEvent)
	{
		var evt = document.createEvent("MouseEvents");
		evt.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
		invoker.dispatchEvent(evt);
	}
	else if(document.createEventObject)
	{
		var evt = document.createEventObject();
		invoker.fireEvent("onclick", evt);
	}

};

/**
 * Update usericon in 'my profile' tab
 */
function syncUserIcon()
{
	var userIcon = new DOMQuery('div.dashboard-content div.user-profile-data-wrapper-top img.usericon', document.body).get(0);
	var tabIcon = new DOMQuery('ul#navigation-dashboard li.nav-profile a[rel] img', document.body).get(0);

	if(userIcon && tabIcon)
		tabIcon.src = userIcon.src;
};

/**
 * Add shoutbox messages thru xmlhttp.
 */
function shoutThruXMLHttp()
{
	var form = new DOMQuery('form#form-microblog-quickreply').get(0);

	if(!form)
		return;

	var block = getSiblingNode(form, 'up', 'div');
	
	validateForms.calledFromLightbox = true;

	var onsubmit = function(e)
	{
		var request = gatherHttpForm(this);

		if(request)
		{
			var req = httpreq_string(request, null, null, true);

			jscss('add', block, 'request-running');

			req.onreadystatechange = function()
			{
				if (req.readyState != 4)
					return;

				/* find original_element; if there are no messages yet, use p.body */
				var replace_element = getElementFromXHR(req, 'div.microblog div.microblog-content');
				var original_element = new DOMQuery('div.microblog-content', block).get(0) || new DOMQuery('p.body', block).get(0);

				block.replaceChild(replace_element, original_element);

				/* empty textarea on succes */
				var textarea = new DOMQuery('textarea', form).get(0);

				if(textarea)
					textarea.value = '';

				_fieldMaximumCharacters.call(textarea);
				_init(events, replace_element);

				jscss('remove', block, 'request-running');
				jscss('remove', form, 'submitting');
				jscss('remove', form, 'submitting-preview');
			};

			e.preventDefault();
		}
	};

	addEvent(form, 'submit', onsubmit);
};

function toggleNotifications()
{
	addEventToTargets(null, 'click', _toggleNotification, 'li.insert-notification a');
};

/*
 * Add notification for blog / topic or club. No confirmationscreens, just add emailnotification
 */
function _toggleNotification(e)
{
	var a = this;
	var li = getSiblingNode(a, 'up', 'li');
	var url = a.href;

	if(!url)
		return;

	jscss('add', a, 'loading');

	/* Create request. Add some default notification-settings to create-link, add id's to delete-link */
	var request = 'data[reactid]=' + getCookie('ReactID');

	if(jscss('check', li, 'notifications-inactive'))
		request += '&data[frequency]=always&data[active]=1';
	else
	{
		var parts = url.split('?');

		url = parts[0];
		request += '&' + parts[1];
	}
		
	/* Execute request */
	var res = httpreq_string(request, null, url, true, 'POST');

	res.onreadystatechange = function()
	{
		if(res.readyState != 4)
			return;

		if(res.getResponseHeader('X-Errormessage'))
			return alert(res.getResponseHeader('X-Errormessage'));

		/* Request message with changed notification-link */
		if(jscss('check', li, 'topic-notification'))
		{
			var msgLink = new DOMQuery('div.message-data span.posted-at a', getSiblingNode(li, 'up', 'li')).get(0);
			var msgUrl = msgLink.href;
			var type = 'topic';
		}
		
		if(jscss('check', li, 'forum-notification'))
		{
			var msgUrl = document.location.href;
			var type = 'forum';
		}

		if(!msgUrl)
			return jscss('remove', a, 'loading');
		
		var msgRes = httpreq_string('', null, msgUrl, true, 'GET');

		msgRes.onreadystatechange = function()
		{
			if (msgRes.readyState != 4)
				return;
	
			var newLi = getElementFromXHR(msgRes, 'li.insert-notification.' + type + '-notification');
	
			li.parentNode.replaceChild(newLi, li);
	
			/* re-attach events to newLi */
			_init(events, newLi.parentNode);
		};
	};

	e.preventDefault();
};
/* ripped from http://www.onlinetools.org/articles/unobtrusivejavascript/cssjsseparation.html */
/* 31-10-2005 13:59 replaced with tino's code, see below */
/*
	a
		defines the action you want the function to perform.
	o
		the object in question.
	c1
		the name of the first class
	c2
		the name of the second class

	Possible actions are:

	swap
		replaces class c1 with class c2 in object o.
	add
		adds class c1 to the object o.
	remove
		removes class c1 from the object o.
	check
		test if class c1 is already applied to object o and returns true or false
	toggle
		test if class c1 is already applied to object o and remove if so, otherwise add class c1
*/
function jscss(a,o,c1,c2)
{
	switch (a)
	{
		case 'add':
			jscss.addClass(o, c1);
			break;
		case 'remove':
			jscss.removeClass(o, c1, c2);
			break;
		case 'check':
			return jscss.hasClass(o, c1);
			break;
		case 'checkParents':
			do
			{
				if (jscss.hasClass(o, c1))
					return true;

				if(o.tagName.toLowerCase() == 'body')
					return false;
			}
			while(o = o.parentNode);
			return false;
			break;
		case 'toggle':
			var operation = 'add';

			if(jscss('check', o, c1))
				operation = 'remove';

			jscss(operation, o, c1, c2);
			break;
		case 'swap':
			jscss.replaceClass(o, c2, c1);
			break;
		case 'get':
			return jscss.getClassList(o);
			break;
	}
	return null;
};

/* taken from http://therealcrisp.xs4all.nl/meuk/classdealer.js */
/* author: Tino Zijdel, 2005 */
jscss.addClass = function (element, classname)
{
	var classes = jscss.getClassList(element);
	if (classes.indexOf(classname) == -1)
	{
		classes[classes.length] = classname;
	}

	jscss.setClassList(element, classes);
};

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

	jscss.setClassList(element, classes);
};

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

	jscss.setClassList(element, classes);
};

jscss.getClassList = function (element)
{
	if (element.className)
		return element.className.split(/\s+/);
	return [];
};

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

jscss.hasClass = function (element, classname)
{
	var wantedClasses = new Array();
	if (classname.indexOf(' ') > -1)
	{
		wantedClasses = classname.split(/\s+/);
	} else {
		wantedClasses[0] = classname;
	}

	var classes = jscss.getClassList(element);

	for (var i = 0; i < wantedClasses.length; i++)
	{
		if (classes.indexOf(wantedClasses[i]) == -1)
		{
			return false;
		}
	}

	return true;
};

if (!Array.prototype.indexOf)
{
	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;
	};
}

if (!Array.prototype.lastIndexOf)
{
	Array.prototype.lastIndexOf = function(searchElement, fromIndex)
	{
		var i = this.length;
		if (!fromIndex) fromIndex = 0;
		else if (fromIndex < 1)
		{
			fromIndex += i;
			if (fromIndex < 0) fromIndex = 0;
		}

		while (i-- > fromIndex)
		{
			if (this[i] === searchElement) return i;
		}

		return -1;
	};
};

if (!Array.getUnique)
{
	Array.prototype.getUnique = function()
	{
		var new_array = [];

		for (var i=0; i < this.length; i++)
			if (new_array.indexOf(this[i]) == -1)
				new_array.push(this[i]);

		return new_array;
	}
};

if (!String.trim)
{
	String.prototype.trim = function() {
		return this.replace(/^[\0\s\t\n\r\x0B\x0C\xA0\xAD]+|[\0\s\t\n\r\x0B\x0C\xA0\xAD]+$/g, '');
	}
};

/* we're assuming cssQuery will always be available */
var cssQuery = {notLoaded:true};
var DOMQuery = function()
{
	var DOMQuery;

	if(document.querySelector) /* w3c: http://www.w3.org/TR/selectors-api/ */
	{
		DOMQuery = function(selector, contextNode, ns)
		{
			if(typeof contextNode == "undefined")
				contextNode = DOMQuery.prototype.scope;

			try
			{
				this.result = contextNode.querySelectorAll(selector);
			}
			catch(e)
			{
				if (cssQuery.notLoaded)
					loadCssQuery();

				this.result = cssQuery(selector, contextNode);
			}

			this.length = this.result.length;
		}

		DOMQuery.prototype.resultType = 'querySelector';
		DOMQuery.prototype.get = function(index) { return (index >= this.result.length) ? undefined : this.result[index]; };
	}
	else if(document.evaluate && document.implementation.hasFeature('xpath','3.0')) /* our own xpath implementation */
	{
		DOMQuery = function(selector, contextNode, ns)
		{
			if(typeof contextNode == "undefined")
				contextNode = DOMQuery.prototype.scope;

			try
			{
				var owner = '';
				if(typeof contextNode.contentType != 'undefined')
					owner = contextNode.contentType;
				else if (contextNode.ownerDocument != null && typeof contextNode.ownerDocument.contentType != 'undefined')
					owner = contextNode.ownerDocument.contentType;
				else
					owner = 'text/html';

				var namespace = ns ? ns : (['application/xml', 'application/xhtml+xml', 'text/xml'].indexOf(owner) > -1) ? 'html:' : '';

				var xpath = this.cssToXPath(selector, contextNode, namespace);

				this.result = document.evaluate(xpath, contextNode, this.NSResolver, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
				this.length = this.result.snapshotLength;
			}
			catch(e)
			{
				if (showAlertOnXpathError)
					alert('XPath error:'+selector+'\n'+xpath+'\n'+e);
			}
		}

		DOMQuery.prototype.resultType = 'XPath';
		DOMQuery.prototype.get = function(index) { return this.result.snapshotItem(index); };

		DOMQuery.prototype.NSResolver = function (prefix)
		{
			if(prefix == 'html')
			{
				return 'http://www.w3.org/1999/xhtml';
			}
			else
			{
				 //this shouldn't ever happen
				return null;
			}
		};

		DOMQuery.cachedXPaths = [ {}, {} ];

		/* tnx to http://www.joehewitt.com/ */
		DOMQuery.prototype.cssToXPath = function (rule, contextNode, namespace)
		{
			var namespaceSpecified = false;
			if(namespace == 'undefined')
				namespace = '';
			if(namespace != "")
				namespaceSpecified = true;

			var xpath = DOMQuery.cachedXPaths[ namespaceSpecified ? 0 : 1 ][rule];

			if(typeof xpath == 'string')
			{
				return xpath;
			}

			var _rule = rule;

			var regElement = /^([#.]?)([a-z0-9\\*_-]*)((\|)([a-z0-9\\*_-]*))?/i;
			var regAttr1 = /^\[([^\]]*)\]/i;
			var regAttr2 = /^\[\s*([^\^\$~*=\s]+)\s*([\^\$~*]?=)\s*(["]?)([^"]+)\3\s*\]/i;
			var regPseudo = /^:([a-z-]+)(\((["]?)([^)]+)\3\))?/i;
			var regCombinator = /^(\s*[>+\s])?/i;
			var regComma = /^\s*,/i;

			var index = 1;
			var parts = [".//", "*"], subparts = [], collection = [];
			var lastRule = null;
			var limit = false;

			while (rule.length && rule != lastRule)
			{
				lastRule = rule;

				// Trim leading whitespace
				rule = rule.replace(/^\s*|\s*$/g,"");
				if (!rule.length)
					break;

				subparts = [];

				// Match the element identifier
				var m = regElement.exec(rule);
				if (m)
				{
					if (!m[1])
					{
						if (m[5])
							parts[index] = namespace + m[5];
						else
							parts[index] = namespace + m[2];
					}
					else if (m[1] == '#')
					{
						subparts.push("@id='" + m[2] + "'");
					}
					else if (m[1] == '.')
						subparts.push("contains(concat(' ', @class, ' '),' " + m[2] + " ')");

					rule = rule.substr(m[0].length);
				}

				// Match attribute selectors
				m = regAttr2.exec(rule);
				if (m)
				{
					switch(m[2])
					{
						case '*=': /* contains */
							subparts.push("contains(@" + m[1] + ", \"" + m[4] + "\")");
						break;
						case '~=': /* contains in space-separated value */
							subparts.push("contains(concat(' ', @" + m[1] + ", ' '), \" " + m[4] + " \")");
						break;
						case '|=': /* its value either being exactly "val" or beginning with "val" immediately followed by "-"  */
							subparts.push("@" + m[1] + " = \"" + m[4] + "\") or starts-with(concat(@" + m[1] + ", '-'), \"" + m[4] + "\"))");
						break;
						case '$=': /* ends with */
							/* not supported: http://developer.mozilla.org/en/docs/XPath:Functions*/
							/*subparts.push("ends-with(\""+m[4]+"\", @"+m[1]+")");*/
							subparts.push("substring(@" + m[1] + ", string-length(@" + m[1] + ") - " + (m[4].length - 1) + ") = \"" + m[4] + "\"");
						break;
						case '^=': /* starts with */
							subparts.push("starts-with(@"+m[1]+", \""+m[4]+"\")");
						break;
						default:
							subparts.push("@" + m[1] + "=\"" + m[4] + "\"");
						break;
					}

					rule = rule.substr(m[0].length);
				}
				else
				{
					m = regAttr1.exec(rule);
					if (m)
					{
						subparts.push("@" + m[1] + "");
						rule = rule.substr(m[0].length);
					}
				}

				m = regPseudo.exec(rule);
				while (m)
				{
					rule = rule.substr(m[0].length);
					/* position() == 5 of pos[5] ? */
					/* check msdn! */
					switch(m[1])
					{
						case 'not':
							/* process type name, id name and multiple class names of the negation pseudo class in the same style as rule above	*/
							/* warning: other pseudo classes and attributes are not supported */
							var notRule = m[4];
							var notSubparts = [];
							var notLastRule = null;

							while (notRule.length && notRule != notLastRule)
							{
								notLastRule = notRule;

								// Trim leading whitespace
								notRule = notRule.replace(/^\s*|\s*$/g,"");
								if (!notRule.length)
									break;

								// Match the element identifier
								var m = regElement.exec(notRule);
								if (m)
								{
									if (!m[1])
									{
										if (m[5])
											notSubparts.push('self::'+ namespace + m[5]);
										else
											notSubparts.push('self::'+ namespace + m[2]);
									}
									else if (m[1] == '#')
									{
										notSubparts.push("@id='" + m[2] + "'");
									}
									else if (m[1] == '.')
										notSubparts.push("contains(concat(' ', @class, ' '),' " + m[2] + " ')");

									notRule = notRule.substr(m[0].length);
								}
							}

							if(notSubparts.length > 0)
							{
								subparts.push("not(" + notSubparts.join(" and ") + ")");
							}
						break;
						case 'first-child':
							subparts.push("position() = 1");
						break;
						case 'last-child':
							subparts.push("last()");
						break;
						case 'only-child':
							subparts.push("position() = 1");
							subparts.push("last()");
						break;
						case 'enabled':
						case 'disabled':
						case 'checked':
							subparts.push("@" + m[1] + " != \"\"");
						break;
						case 'empty':
							subparts.push("count(.) = 0");
						break;
						case 'lang':
							subparts.push("@lang=\""+m[4]+"\"");
						break;
						case 'contains':
							subparts.push("contains(text(), \""+m[4]+"\")");
						break;
						/* http://www.w3.org/TR/css3-selectors/#nth-child-pseudo */
						case 'nth-child':

							/* let op: tagname kan ook iets zijn als 'html div bla:nth-child(2n+1)', dus 'parent' klopt niet!!!! */
							/*position is dan ook tov div, niet bla's parent */

							switch(m[4])
							{
								/* special / frequently used cases */
								case 'odd':
								case '2n+1':
									subparts.push("position() mod 2 > 0");
									break;
								case 'even':
								case '2n':
								case '2n+0':
									subparts.push("position() mod 2 = 0");
									break;
								/* If both a and b are equal to zero, the pseudo-class represents no element in the document tree. .*/
								case '0n+0':
									subparts.push("false()");
									break;
								default:
									var found;
									/* When a=0, no repeating is used, so for example :nth-child(0n+5) matches only the fifth child. */
									if(found = m[4].match(/^(0n\+)?([0-9]+)$/))
									{
										subparts.push("position() = " + found[2]);
									}
									/* When a=1, the number may be omitted from the rule. */
									else if(found = m[4].match(/^(^|1)n$/))
									{
										;
									}
									/* If b=0, then every ath element is picked. In such a case, the b part may be omitted. */
									else if(found = m[4].match(/^([0-9]+)n(\+0|$)$/))
									{
										subparts.push("position() mod " + found[1] + " = 0");
									}
									/* The value a can be negative  */
									else if(found = m[4].match(/^-n\+([0-9]+)$/))
									{
										subparts.push("position() <= " + found[1]);
									}
									/* this matches the bth child of an element after all the children have been split into groups of a elements each. */
									else if(found = m[4].match(/^([0-9]+)n([+-])([0-9]+)$/))
									{
										subparts.push("position() mod " + found[1] + " = (" + found[1] + " " + found[2] + " " + found[3] + ") mod " + found[1]);
									}
									else
									{
										/*throw new Error("unsupported nth-child selector: "+ m[4];)*/
									}
							}
						break;

						case 'target':
							/* should read current anchor and find matching element */
						case 'hover':
						case 'root':
							/* unsupported atm http://www.quirksmode.org/css/root.html */
						default:
							throw new Error("unsupported pseudo class: "+ m[1]);
						break;
					}

					m = regPseudo.exec(rule);
				}

				if(subparts.length > 0)
				{
					parts.push('[' + subparts.join(" and ") + ']');
				}

				// Match combinators
				m = regCombinator.exec(rule);
				if (m && m[0].length)
				{
		            if(limit)
		         {
		             parts.push(limit);
		             limit = false;
		            }

					if (m[0].indexOf(">") != -1)
					{
						parts.push("/");
					}
					else if (m[0].indexOf("+") != -1)
					{
						parts.push("/following-sibling::");
						// following-sibling selects all following siblings, we need only the first next sibling
						limit = '[1]';
					}
					else
					{
						parts.push("//");
					}

					index = parts.length;
					parts.push("*");
					rule = rule.substr(m[0].length);
				}

				m = regComma.exec(rule);
				if (m)
				{
					if(limit)
					{
						parts.push(limit);
						limit = false;
					}

					collection.push( parts.join("") );

					parts = [".//", "*"];

					index = parts.length-1;
					rule = rule.substr(m[0].length);
				}
			}

		    if(limit)
				parts.push(limit);

			collection.push( parts.join("") );

			xpath = collection.join(" | ");

			DOMQuery.cachedXPaths[ namespaceSpecified ? 0 : 1 ][_rule] = xpath;

			/*DOMQuery.storeCachedXPaths();*/
			return xpath;
		};

		DOMQuery.hasXPath = true;
	}
	else if(typeof cssQuery != 'undefined') /* dean edward's cssquery */
	{
		if (cssQuery.notLoaded)
			loadCssQuery();

		DOMQuery = function(selector, contextNode, ns)
		{
			if(typeof contextNode == "undefined")
				contextNode = DOMQuery.prototype.scope;

			this.result = cssQuery(selector, contextNode);
			this.length = this.result.length;
		}

		DOMQuery.prototype.resultType = 'cssQuery';
		DOMQuery.prototype.get = function(index) { return this.result[index]; };
	}
	else if(typeof Element != 'undefined' && Element && typeof Element.getElementsBySelector != 'undefined' && Element.getElementsBySelector) /* prototype */
	{
		DOMQuery = function(selector, contextNode, ns)
		{
			if(typeof contextNode == "undefined")
				contextNode = DOMQuery.prototype.scope;

			/* prototype's highest point where getElementsBySelector is to be found is... */
			if(contextNode == document)
				contextNode = document.documentElement;

			try
			{
				this.result = $(contextNode).getElementsBySelector.apply($(contextNode), selector.split(',') );
			}
			catch(e)
			{
				this.result = [];
				this.length = 0;
				throw e;
			}
			this.length = this.result.length;
		}

		DOMQuery.prototype.resultType = 'getElementsBySelector';
		DOMQuery.prototype.get = function(index) { return this.result[index]; };
	}
	else if(typeof jQuery != 'undefined') /* jquery */
	{
		DOMQuery = function(selector, contextNode, ns)
		{
			if(typeof contextNode == "undefined")
				contextNode = DOMQuery.prototype.scope;

			this.result = jQuery(selector, contextNode);
			this.length = this.result.size();
		}

		DOMQuery.prototype.resultType = 'jQuery';
		DOMQuery.prototype.get = function(index) { return this.result[index]; };
	}

	if(typeof DOMQuery == 'undefined')
		throw "No DOMQuery handler found.";

	DOMQuery.prototype.scope = document;

	return DOMQuery;
}();

function getTargets(targets, defaultDOMQuery)
{
	if(targets)
	{
		if(typeof targets == 'string')
			return new DOMQuery(targets);
		else
			return targets;
	}
	else
	{
		if(typeof defaultDOMQuery == 'string')
			return new DOMQuery(defaultDOMQuery);
		else
			return defaultDOMQuery;
	}

	return new DOMQuery('');
};

function addClassToTargets(query, classname)
{
	var items = new DOMQuery(query);

	for(var i=0, item; (item=items.get(i)); i++)
	{
		jscss('add', item, classname, '');
	}
};

function removeClassFromTargets(query, classname)
{
	var items = new DOMQuery(query);

	for(var i=0, item; (item=items.get(i)); i++)
	{
		jscss('remove', item, classname, '');
	}
};

function addEventToTargets(targets, type, handler, defaultDOMQuery)
{
	var elements = getTargets(targets, defaultDOMQuery), el;

	for(var i=0;(el=elements.get(i));i++)
	{
		addEvent(el, type, handler);
	}

	return elements;
};

// written by Dean Edwards, 2005
// with input from Tino Zijdel - crisp@xs4all.nl
// http://dean.edwards.name/weblog/2005/10/add-event/
function addEvent(element, type, handler)
{
	if (element.addEventListener)
	{
		element.addEventListener(type, handler, arguments.callee.eventListenerUseCapture);
	}
	else
	{
		if (!handler.$$guid) handler.$$guid = addEvent.guid++;
		if (!element.events) element.events = {};
		var handlers = element.events[type];
		if (!handlers)
		{
			handlers = element.events[type] = {};
			if (element['on' + type])
				handlers[0] = element['on' + type];
			element['on' + type] = handleEvent;
		}

		handlers[handler.$$guid] = handler;
	}
}
addEvent.guid = 1;
addEvent.eventListenerUseCapture = false;

function removeEvent(element, type, handler)
{
	if (element.removeEventListener)
		element.removeEventListener(type, handler, false);
	else if (element.events && element.events[type] && handler.$$guid)
		delete element.events[type][handler.$$guid];
};

function removeEventFromTargets(targets, type, handler, defaultDOMQuery)
{
	var elements = getTargets(targets, defaultDOMQuery), el;

	for(var i=0;(el=elements.get(i));i++)
		removeEvent(el, type, handler);
};

function handleEvent(event)
{
	event = event || fixEvent(window.event);
	var returnValue = true;
	var handlers = this.events[event.type];

	for (var i in handlers)
	{
		if (!Object.prototype[i])
		{
			this.$$handler = handlers[i];
			if (this.$$handler(event) === false) returnValue = false;
		}
	}

	if (this.$$handler) this.$$handler = null;

	return returnValue;
};

function fixEvent(event)
{
	event.preventDefault = fixEvent.preventDefault;
	event.stopPropagation = fixEvent.stopPropagation;
	return event;
}

fixEvent.preventDefault = function()
{
	this.returnValue = false;
};

fixEvent.stopPropagation = function()
{
	this.cancelBubble = true;
};

// This little snippet fixes the problem that the onload attribute on the body-element will overwrite
// previous attached events on the window object for the onload event
if (!window.addEventListener)
{
	document.onreadystatechange = function()
	{
		if (window.onload && window.onload != handleEvent)
		{
			addEvent(window, 'load', window.onload);
			window.onload = handleEvent;
		}
	};
};

function getObj(ev, ob)
{
	if(!ob)
	{
		var targ;
		if (!ev) ev = window.event;

		if (ev.target) targ = ev.target;
		else if (ev.srcElement) targ = ev.srcElement;

		if (targ && targ.nodeType == 3) // defeat Safari bug
			targ = targ.parentNode;

		return targ;
	}
	else
	{
		return ob;
	}
};

function loadScript(url, prependBoardUrl)
{
	if(prependBoardUrl)
		url = board_template_url + url;

	var e = createDOMNode('script', {"type" : 'text/javascript', "src" : url}, []);

	document.getElementsByTagName("head")[0].appendChild(e);
};

function currentStyle(element, property)
{
	return window.getComputedStyle ? window.getComputedStyle(element,'').getPropertyValue(property) : element.currentStyle.getAttribute(property);
};


function overloadFunction( name, func )
{
	func.previousFunctionDefinition = window[name];
	window[name] = func;
};

function empty()
{
	if(this && this.value == this.defaultValue )
	{
		this.value = '';
	}
};

function unhtmlspecialchars(str)
{
	str = str.replace(/&amp;/gi, '&');
	str = str.replace(/&lt;/gi, '<');
	str = str.replace(/&gt;/gi, '>');
	return str;
};

/* tnx crisp */
function htmlspecialchars(input)
{
	input = input.replace(/&/g,'&amp;');
	input = input.replace(/>/g,'&gt;');
	input = input.replace(/</g,'&lt;');
	input = input.replace(/"/g,'&quot;');

	/* " < fix syntax highlighting */

	return input;
};

function getCookie(sName)
{
	var aCookie = document.cookie.split('; '), i = aCookie.length, aCrumb;
	while (i--)
	{
		aCrumb = aCookie[i].split('=');
		if (sName == aCrumb[0])
			return typeof aCrumb[1] != 'undefined'? unescape(aCrumb[1]) : null;
	}

	return null;
}

/*
 * Find the next sibling node (skipping text nodes) or a sibling with a specific tag name
 */
function getSiblingNode(startpoint, direction, tagName)
{
	var o = startpoint, tagEmpty = (tagName == undefined || tagName.length == 0);

	if (tagName != undefined)
		tagName = tagName.toLowerCase();

	do
	{
		if (direction == 'previous')
		{
			o = o.previousSibling;
		}
		else if ( direction == 'next' )
		{
			o = o.nextSibling;
		}
		else if ( direction == 'up' )
		{
			o = o.parentNode;
		}

		if ( o && o.nodeType == 1)
		{
			if (tagEmpty || o.tagName.toLowerCase() == tagName )
				return o;
		}

	} while (o);

	return null;
}

/*
example syntax:

var test = createDOMNode( 'div', {"class" : 'waa', "event" : ['click', _func] },
			[
				createDOMNode( 'span', {"class" : 'woei'},
				[
					'snotbeuken'
				]),
				'waa',
				123
			]);
creates:
text = <div class="waa"><span class="woei">snotbeuken>waa123</div>

Or add multiple events:

"event" : [
	['click', _func],
	['change', _func2]
]
*/
function createDOMNode(tagname, options, children)
{
	var option, child, me;

	if(isIE && typeof options['type'] == 'string' && (options['type'] == 'radio' || options['type'] == 'submit'))
	{
		/* IE doesn't like dynamically generated [s]radiobuttons[/] anything, so we have to set 'name' manually */
		me = document.createElement(
				'<input' +
				' type="'+options['type'] + '"' +
				' name="' + options['name'] + '"' +
				 (typeof options['checked'] != 'undefined' ? ' checked' : '') +
				'>'
			);
	}
	else if(tagname != null)
	{
		me = document.createElement(tagname);
	}
	else
	{
		me = document.createDocumentFragment();
	}

	for(option in options)
	{
		if(!options.hasOwnProperty(option))
			continue;

		if(option == 'event')
		{
			addEvent(me, options[option][0], options[option][1]);
		}
		else if(option == 'events')
		{
			var evnt;

			for(evnt in options[option])
			{
				if(typeof options[option][evnt][0] == 'string' && typeof options[option][evnt][1] == 'function')
					addEvent(me, options[option][evnt][0], options[option][evnt][1]);
			}
		}
		else
		{
			if (option == 'class')
			{
				me.setAttribute('className', options[option]);
			}
			else if (option == 'style' && me.style.setAttribute)
			{
				me.style.setAttribute('cssText', options[option]);
				continue;
			}

			me.setAttribute(option, options[option]);
		}
	}

	for(var i = 0; (child=children[i]); i++)
	{
		if( ["string", "number"].indexOf(typeof child) > -1 )
		{
			child = document.createTextNode(child);
		}
		me.appendChild(child);
	}

	return me;
};

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

// transparantPNG - Based on http://www.schillmania.com/projects/png/ but very much completely rewritten
// Apply a filter in IE to make png's (both images and background-images) transparant
function transparantPNG(targets, scalingMethod)
{
	if (!isIE || !isWin || isIE7)
		return;

	if(!scalingMethod)
		var scalingMethod = 'image';

	// Here you can decide which elements to search for png's (you can use * but that will be very slow)
	var elements = getTargets(targets, '.transparantPNG');
	var imagesource;

	for (var i=0, object; (object=elements.get(i)); i++)
	{
		if (object.getAttribute('src'))
		{
			imagesource = object.getAttribute('src');
			object.src = board_template_url + 'img/layout/iefix/transparantPNG.gif';
		}
		else if (object.currentStyle.backgroundImage.toString() && object.currentStyle.backgroundImage.toString() != "none")
		{
			var cssBackground = object.currentStyle.backgroundImage.toString();
			var j = cssBackground.indexOf('url("')+5;
			imagesource = cssBackground.substr(j,cssBackground.length-j-2);
			object.style.backgroundImage = 'none';
		}
		else
			continue;

		object.style.writingMode = 'lr-tb';
		object.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+imagesource+"',sizingMethod='" + scalingMethod + "')";

		object.style.border = '0';
	}
}

var texts = new Array();
function getText(a, b, c)
{
	if(typeof texts[a] == 'undefined' || typeof texts[a][b] == 'undefined' || !texts[a][b] )
		return '[text not found: '+a+'::'+b+']';

	if ( c )
		return texts[a][b].replace('%s',c);
	else
		return texts[a][b];
}

function insertMultipleDocuments()
{
	if (board_action != 'insert_document')
		return false;

	var insertMultipleLink = new DOMQuery('div.action-header li.insert-multiple-documents').get(0);

	// Show 'insert multiple documents' button
	jscss('remove', insertMultipleLink, 'display-none');

	addEvent(insertMultipleLink, 'click', _insertMultipleDocuments);
}

var documentInputCount = 0;
function _insertMultipleDocuments(e)
{
	jscss('add', document.getElementById('form-insert-document'), 'multiple-documents');

	if (document.getElementById('toggle-advanced-options'))
		jscss('add', document.getElementById('toggle-advanced-options'), 'display-none');

	var input = document.getElementById('userfile');
	var copy = input.cloneNode(true);
	copy.id = '';
	copy.value = '';
	copy.name += '_' + documentInputCount++;

	input.parentNode.appendChild(copy);

	e.preventDefault();
}

// Dean Edwards/Matthias Miller/John Resig
/* http://dean.edwards.name/weblog/2006/06/again/ */
function init()
{
	// quit if this function has already been called
	if (arguments.callee.done)
		return;

	// flag this function so we don't do the same thing twice
	arguments.callee.done = true;

	// kill the timer
	if (_timer)
		clearInterval(_timer);

	_init(events);
};

function rand ( n )
{
	return ( Math.floor ( Math.random ( ) * n + 1 ) );
}

function resizeIframeToFullHeight(id)
{
	var iframe = new parent.DOMQuery('iframe#' + id).get(0);

	if(!iframe)
		return;

	var iframeHeight = window.getComputedStyle ? window.getComputedStyle(iframe,'').getPropertyValue('height') : iframe.currentStyle.getAttribute('height');

	if(!arguments.callee.initialRun && (iframeHeight == 'auto' || iframeHeight == '100%'))
		iframe.resizeToFullHeight = true;

	if (iframe.resizeToFullHeight)
	{
		if(!isNaN(parseInt(iframeHeight)))
			var newHeight = Math.max(document.body.scrollHeight, parseInt(iframeHeight));
		else
			var newHeight = document.body.scrollHeight;

		iframe.style.height = newHeight + 'px';
	}

	arguments.callee.initialRun = true;
};

var timings = [];
var eventTiming = false;

if (typeof showAlertOnXpathError == "undefined")
	var showAlertOnXpathError = false;

var isIE, isIE7, isIE8, isNotIE7, isGecko, isWebKit, isWin;

function _init(events, scope)
{
	if(!document.body || (this.name && this.name.indexOf('iframe-xhr-emulator') != -1))
		return;

	var time1, time2, funcname;
	var funcPattern = /function\s+([^(]*)\s*\(/, total = 0, duration = 0;

	if(!arguments.callee.initalInit)
	{
		isIE = navigator.userAgent.indexOf('MSIE') != -1 && navigator.userAgent.indexOf('Opera') == -1;
		isIE6 = isIE && navigator.userAgent.indexOf('MSIE 6.0') != -1;
		isIE7 = isIE && navigator.userAgent.indexOf('MSIE 7.0') != -1;
		isIE8 = isIE && navigator.userAgent.indexOf('MSIE 8.0') != -1;
		isNotIE7 = !isIE7;
		isGecko = navigator.userAgent.indexOf('Gecko') != -1;
		isWebKit = navigator.userAgent.indexOf('WebKit') != -1;
		isWin = navigator.userAgent.indexOf('Windows') != -1;
		jscss('add', document.body, 'javascript', '');

		arguments.callee.initalInit = true;
	}

	if(scope)
	{
		var previousScope = DOMQuery.prototype.scope;
		DOMQuery.prototype.scope = scope;
	}

	for(var i=0; i<events.length; i++)
	{
		try
		{
			if(eventTiming)
			{
				funcname = events[i].toString().match(funcPattern);
				if(funcname && funcname[1] != '')
					funcname = funcname[1];
				else if(funcname)
					funcname = 'anonymous';
				else
					funcname = 'unknown';

				timings[i] = funcname + ' ???';
				time1 = new Date().getTime();
			}

			if(typeof events[i] == 'function')
				events[i]();
			else if(typeof events[i] == 'object')
				events[i][0].apply(window, events[i][1]);

			if(eventTiming)
			{
				time2 = new Date().getTime();
				duration = (time2 - time1);
				total += duration;

				for(j=(funcname.length + duration.toString().length); j<50; j++)
					funcname += ' ';

				timings[i] = funcname + duration + ' ms\r\n';
			}
		}
		catch (e)
		{
			/* we don't need to pass the scope again */
			arguments.callee( events.slice(i + 1) );
			if(scope)
				DOMQuery.prototype.scope = previousScope;

			throw e;
		}
	}

	if(scope)
	{
		DOMQuery.prototype.scope = previousScope;
	}

	if(eventTiming)
		document.body.appendChild(createDOMNode('pre', {}, timings));
}

/* for Mozilla/Opera9 */
if (document.addEventListener)
{
	document.addEventListener("DOMContentLoaded", init, false);
}

/* for Internet Explorer */
if (navigator.userAgent.indexOf('MSIE') != -1 && navigator.userAgent.indexOf('Opera') == -1)
{
	document.write("<script id=__ie_onload defer src=//:><\/script>");
	var script = document.getElementById("__ie_onload");
	script.onreadystatechange = function()
	{
		if (this.readyState != "complete")
			return;

		if(typeof initReadyStateDetectionCallback != 'function' || initReadyStateDetectionCallback())
		{
			init();
			return;
		}

		var _timer = setInterval(function()
		{
			if(initReadyStateDetectionCallback())
			{
				init(); // call the onload handler
			}
		}, 10);
	};
}

/* for Safari */
if (/WebKit/i.test(navigator.userAgent))
{ // sniff
	var _timer = setInterval(function()
	{
		if (/loaded|complete/.test(document.readyState))
		{
			init(); // call the onload handler
		}
	}, 10);
};

/* for other browsers */
window.onload = init;

function linkTitleInStatusbar(targets)
{
	addEventToTargets(targets, 'mouseover', showTitleInStatusbar, 'a');
	addEventToTargets(targets, 'mouseout', clearStatusbar, 'a');
};

function showTitleInStatusbar()
{
	if(this.title.length == 0)
		return;

	if(this.accessKey.length == 1)
	{
		window.status = this.title + ' - sneltoets: Alt + '+this.accessKey;
	}
	else
	{
		window.status = this.title + ' - ' + this.href;
	}
};

function clearStatusbar()
{
	window.status = '';
	return true;
};

var maxImageWidth = 595;
var maxImageHeight = 2000;
var imagesToScale = [];
function scaleImages(targets)
{
	imagesToScale = getTargets(targets, 'ol div.message-content img:not(.smiley)');

	for(var i=0, image;(image=imagesToScale.get(i));i++)
	{
		image.setAttribute('maxwidth', maxImageWidth);
		image.setAttribute('maxheight', maxImageHeight);

		if(image.complete)
			scaleImage.call(image, null);
		else
			addEvent(image, 'load', scaleImage);
	}
	imagesToScale = [];
};

function scaleImage()
{
	/* at some really old boards, an onload=scaleImage(this) was used - it is deprecated so ignore those calls */
	if(!this)
		return;

	var maxWidth = this.getAttribute('maxwidth');
	var maxHeight = this.getAttribute('maxheight');

	if(this.width <= maxWidth && this.height <= maxHeight)
		return jscss('remove', this, 'display-none');

	var scaleRatio = maxWidth / maxHeight;

	if (this.width > maxWidth || this.height > maxHeight)
	{
		var ratio = this.width / this.height;
		this.originalWidth = this.width;
		this.originalHeight = this.height;

		if (ratio > scaleRatio)
		{
			this.width = maxWidth;
			this.height = maxWidth / ratio;
		}
		else
		{
			this.height = maxHeight;
			this.width = maxHeight * ratio;
		}

		if (this.parentNode.nodeName != 'A')
		{
			addEvent(this, 'click', popupImage);
			jscss('add', this, 'enlargeable');
			this.title += getText('extra', 'click_to_enlarge');
		}
	}

	jscss('remove', this, 'display-none');
};

function popupImage()
{
	window.open(this.src, 'img', 'width='+(this.originalWidth+16)+',height='+(this.originalHeight+16)+',left=0,top=0');
};

function makeSmileysClickable(targets)
{
	addEventToTargets(targets, 'click', _insertSmiley, 'div#smileys img');
};

function _insertSmiley()
{
	putStr(' ' +  this.alt + ' ');
	hideSmileys();
};

function localAnchors()
{
	/* strict checking for the moment, should be evaluated at a later point */
	if(!jscss('check', document.body, 'list_message') && !jscss('check', document.body, 'list_messages'))
		return;

	var container = new DOMQuery('ol#messages').get(0);
	if(!container)
		return;

	var items = new DOMQuery('address.posted-at a, blockquote.quote-blockquote a.messagelink', container);
	var pattern = /list_message\//;
	for(var i = 0, item; (item=items.get(i)); i++)
	{
		if(pattern.test(item.pathname))
		{
			addEvent(item, 'click', function(e) { if(!_localAnchors(this)) { e.preventDefault(); } } );
		}
	}
};

function _localAnchors(x)
{
	var id = x.hash.substring(1), anchors = document.anchors;

	for(var i=0, anchor; (anchor=anchors[i]); i++)
	{
		if(anchor.name == id)
		{
			window.location.hash = id;
			return false;
		}
	}
};

function slashdotLinks(targets)
{
	var items = getTargets(targets, 'ol.messages a.link'), a = createDOMNode('a', {"href" : board_script_url}, []), span, clone, shortname;
	for(var i=0, item; (item = items.get(i)); i++)
	{
		if(a.hostname != item.hostname)
		{
			if(item.href == item.text || item.hostname == item.text)
				continue;

			shortname = hostnameToShortname(item.hostname);
			span = createDOMNode('span', {}, [item.cloneNode(true), ' [' + shortname + ']']);
			item.parentNode.replaceChild(span, item);
		}
	}
};
/* these regexp's have been copied from slashcode which is GPL */
/* file: utils/domainTagifyComments */
function hostnameToShortname(hostname)
{
	if(/^(\d{1,3}\.){3}\d{1,3}$/.test(hostname))
		return hostname;

	var result;

	for(var i=1; i<=3; i++)
	{
		switch(i)
		{
			case 1:
				result = hostname.match(/([\w-]+\.[a-z]{3,4})$/i);
			break;
			case 2:
				result = hostname.match(/([\w-]+\.[a-z]{2,4}\.[a-z]{2})$/i);
			break;
			case 3:
				result = hostname.match(/([a-z]+\.[a-z]{2})$/i);
			break;
		}
		if(result)
			return result[1];
	}

	var items = hostname.split('.');
	if(items.length >= 3)
		return items.reverse().slice(0,3).reverse().join('.');

	return hostname;
};

function externalLinksInPopup(targets)
{
	var items = getTargets(targets, 'ol.messages a.link'), a = createDOMNode('a', {"href" : board_script_url}, []);

	for(var i=0, item; (item = items.get(i)); i++)
	{
		if(item.href && a.hostname != item.hostname && ['http:', 'https:'].indexOf(item.protocol) != -1 )
		{
			addEvent(item, 'click', function(e) { if(!_localAnchors(this)) { window.open(this.href, 'popupexternal'); e.preventDefault(); } } );
		}
	}
};

function indicateSecureLink(targets)
{
	var items = getTargets(targets, 'ol.messages a.link'), a = createDOMNode('a', {"href" : board_script_url}, []);

	for(var i=0, item; (item = items.get(i)); i++)
	{
		if(a.hostname != item.hostname && item.protocol == 'https:')
		{
			jscss('add', item, 'secure-link');
		}
	}

};

function searchPopup(targets)
{
	addEventToTargets(targets, 'click', function() { try {_searchPopup(this);} catch (e) {} return false;}, 'div#navigation li#search-link a');
	addEventToTargets(targets, 'dblclick', function() { document.location.href = items[0].href; } , 'div#navigation li#search-link a');
};

function _searchPopup(x)
{
	var hiddenElements = [ ['action', 'find'], ['data[searchtype]', 'search'] ], input, fieldsetNodes = [];
	for(var i =0, item; (item = hiddenElements[i]);i++)
	{
		fieldsetNodes[fieldsetNodes.length] = createDOMNode('input', {"type" : 'hidden', "name" : item[0], "value" : item[1]}, []);
	}

	var form = createDOMNode('form', {"action" : board_script_url},
				[
					createDOMNode('fieldset', {},
					[
						/*fieldsetNodes,*/
						createDOMNode('input', {"type" : 'text', "name" : 'data[q]',"size" : 40, "id" : 'search-link-input', "defaultValue" : getText('extra', 'searchPopup'), "event" : ['focus', empty]}, [])
					]),

				]);

	x.parentNode.appendChild(form);

	new DOMQuery('input#search-link-input').get(0).focus();

	return false;
};

function closeAndSubmit(targets)
{
	var items = getTargets(targets, 'div#topic-admin input#status');
	if(items.length == 0)
		return;

	if(items.get(0).nextSibling.options[items.get(0).nextSibling.selectedIndex].value != 'Closed')
	{
		var input = createDOMNode('input', {"type" :'submit', "accessKey" :'c', "value" :getText('extra','close_and_submit'), "event" :['click', function() { _closeAndSubmit(this.form); }] }, []);
		items.get(0).parentNode.appendChild(input);
	}
};

function _closeAndSubmit(form)
{
	var items = new DOMQuery('input#status + select', form);
	if(items.length == 0)
		return;

	var select = items.get(0), opts = select.options;
	for(var i=0, option; (option=opts[i]); i++)
	{
		if(	option.value == 'Closed')
		{
			select.selectedIndex = i;
			select.previousSibling.checked = true;
			break;
		}
	}
};

function indicateAccesskey(targets)
{
	var items = getTargets(targets, 'input[accesskey]');

	var replacement, indicatorCharPos, textOnButton;
	for(var i=0, item; (item=items.get(i)); i++)
	{
		switch(item.type)
		{
			case 'submit':
			case 'reset':
				textOnButton = item.value;
				indicatorCharPos = textOnButton.toLowerCase().indexOf(item.accessKey);

				if(indicatorCharPos >= 0 )
				{
					replacement =	createDOMNode('button', {"accessKey" : item.accessKey, "name" : item.name, "id" : item.id, "type" : item.type, "class" : item.className},
									[
										textOnButton.substring(0, indicatorCharPos),
										createDOMNode('span', {"class" : 'accesskey'}, [textOnButton.charAt(indicatorCharPos)]),
										textOnButton.substring(indicatorCharPos+1)
									]);
				}
				else
				{
					replacement =	createDOMNode('button', {"accessKey" : item.accessKey, "name" : item.name, "id" : item.id, "type" : item.type, "class" : item.className},
									[
										textOnButton,
										' ',
										createDOMNode('span', {"class" : 'accesskey'}, [getText('extra', 'accesskey_indicator', item.accessKey)])
									]);
				}

				/* ie moet echt dood ofzo */
				/* ie pakt de 'type' attribute niet mee */
				if(isIE)
				{
					if(item.type == 'submit')
						addEvent(replacement, 'click', function() { this.form.submit(); } );
					else if(item.type == 'reset')
						addEvent(replacement, 'click', function() { this.form.reset(); } );
				}

				item.parentNode.replaceChild(replacement, item);
				break;
		}
	}

	return true;
};

function allPagesNavigation(targets)
{
	addEventToTargets(targets, 'click', _allPagesNavigation, 'dl.topic-navigation span.cutoff');
};

function _allPagesNavigation()
{
	var dl = getSiblingNode(this, 'up', 'dl');

	var link = new DOMQuery('dd a', dl);

	if(link.length == 0)
		return;
	else
		link = link.get(0);

	/* number is stored in dl's pages-... */
	var maxPage = dl.className.match(/pages\-([0-9]+)/)[1];

	var pageNumber = prompt(getText('extra','enter_page_number', maxPage), '1');
	if(!pageNumber)
		return;

	pageNumber = parseInt(pageNumber);

	if(isNaN(pageNumber) || pageNumber < 1 || pageNumber > maxPage)
	{
		alert(getText('extra', 'page_number_incorrect'));
		return;
	}

	var matches = link.href.match(/^([^0-9]+\/[0-9]+)(\/[0-9]+)?(.*)$/);
	var _link = matches[1] + '/' + pageNumber + matches[3];

	document.location.href = _link;
};

function highlightReferrerQuery()
{
	var q = '', item = null, el = [];
	var ref = document.referrer;
	if(ref != '')
	{
		ref = createDOMNode('a', {'href' : ref}, []).search.substr(1).split('&');
		/* ref now contains a list of a=b, x=y, ... sets */
		for(var i=0; (item = ref[i]); i++)
		{
			el = item.split('=');
			if(['q', 'p', 'query'].indexOf(el[0]) > -1)
			{
				q = el[1];
				break;
			}
		}

		if(q == '')
			return;

		/* tnx to http://svn.fucoder.com/fucoder/se-hilite/se_hilite_src.js */
		q = decodeURIComponent(q);
		q = q.replace(/\'|"/g, '');
		q = q.split(/[\s,\+\.]+/);

		highlightStrings(document.body, q );
	}
};

function highlightStrings(el, strs)
{
	var regexp, metch, words, replacement;
	for(var i=0, item; (item = el.childNodes[i]); i++)
	{
		if(item.nodeType == 3)
		{
			regexp = new RegExp('\\b('+strs.join('|')+')\\b', 'ig');
			if(words = item.nodeValue.split( regexp ))
			{
				/* now highlight the individual words */
				replacement = [];
				for(var j=0, word; (word = words[j]); j++)
				{
					replacement.push( strs.indexOf(word) > -1 ? createDOMNode('span', {'class' : 'highlight1'}, [word]) : word );
				}

				item.parentNode.replaceChild(createDOMNode('span', {'class' : 'highlighting'}, replacement), item);
			}
		}
		else if(item.nodeType == 1)
		{
			highlightStrings(item, strs);
		}
	}
};

function resolveIP2Hostname()
{
	var items = new DOMQuery('li.message-ip a');

	for(var i=0, item; (item=items.get(i)); i++)
	{
		addEvent(item, 'mouseover', _resolveIP2Hostname);
		addEvent(item, 'mouseout', _resolveIP2Hostname);
	}
};

var _resolveIP2HostnameXHR;
function _resolveIP2Hostname(ev)
{
	var target = this;

	switch(ev.type)
	{
		case 'mouseover':
			_resolveIP2HostnameXHR = setTimeout( function()
				{
					var callback = function()
					{
						if (typeof req != 'undefined' && req != null && req.readyState == 4)
						{
							var result = req.responseText.match(/<dd class="lookup_user">(.+)<\/dd>/);
							alert(result[1]);
						}
					};
					var req = httpreq_string('', callback, target.href, false);
				}, 250);
		break;
		case 'mouseout':
			clearTimeout(_resolveIP2HostnameXHR);
		break;
	}
};

function autocomplete(targets)
{
	var items = getTargets(targets, 'input[suggestions]');

	for(var i=0, item; (item=items.get(i));i++)
	{
		if(item.getAttribute('readonly'))
			addEvent(item, 'focus', autocompleteSuggest);
		else
			addEvent(item, 'keyup', autocompleteSuggest);

		addEvent(item, 'keypress', dontSubmit);
		addEvent(getSiblingNode(item, 'up', 'form'), 'submit', dontSubmit);
		addEvent(item, 'blur', hideAutocompleteSuggest);
		item.setAttribute('autocomplete', 'off');
		item.setAttribute('originalvalue', item.value);
	}
};

function dontSubmit(e)
{
	/* store the previous keycode for the submit-handler which follows */
	if(e.keyCode == 13 || arguments.callee.previousKeyCode == 13)
	{
		e.preventDefault();
	}

	arguments.callee.previousKeyCode = e.keyCode;
};

function hideAutocompleteSuggest()
{
	var list = new DOMQuery('div.autocomplete', document.body).get(0);
	if (list)
	{
		list.noFocus = true;
		if (list.noMouse)
			list.parentNode.removeChild(list);
	}

	if(this.getAttribute('originalvalue') != this.value)
	{
		if(document.createEvent)
		{
			var evt = document.createEvent("HTMLEvents");
			evt.initEvent("change", true, true);
			this.dispatchEvent(evt);
		}
		else if(document.createEventObject)
		{
			var evt = document.createEventObject();
			this.fireEvent("onchange", evt);
		}
	}
};

function autocompleteSuggest(e)
{
	var li_item, list = new DOMQuery('div.autocomplete', document.body).get(0);

	switch(e.keyCode)
	{
		case 27: /* escape */
		case 8:  /* backspace */
		case 46: /* delete */
		case 16: /* shift */
		case 36: /* home */
		case 35: /* end */
			if (!list)
				return;

			list.parentNode.removeChild(list);
			this.suggesting = false;
			return;
		break;

		case 40: /* down */
		case 38: /* up */
			if (!list)
				return;

			var items = new DOMQuery('li', list);
			for (var i=0, item; (item=items.get(i));i++)
			{
				if(!jscss('check', item, 'selected'))
					continue;

				var j = i;
				if(e.keyCode == 38) /* previous */
					j--;
				else				/* next */
					j++;

				var newSelection = items.get(j);
				if(newSelection)
				{
					jscss('remove', item, 'selected', '');
					jscss('add', newSelection, 'selected');

 					var corr = newSelection.offsetTop + newSelection.offsetHeight - list.scrollTop - list.offsetHeight;
					if (corr>0)
						list.scrollTop += corr;
					corr = list.scrollTop - newSelection.offsetTop;
 					if (corr>0)
 						list.scrollTop -= corr;
				}
				break;
			}
			return;
		break;

		case 13: /* enter */
			if (!list)
				return;

			var currentSelection = new DOMQuery('li.selected', list).get(0);

			if(!currentSelection)
				return;

			if (document.createEvent)
			{
				var evt = document.createEvent('MouseEvents');
				evt.initEvent('click', true, true);
				currentSelection.dispatchEvent(evt);
			}
			else if(document.createEventObject)
			{
				var evt = document.createEventObject();
				currentSelection.fireEvent('onclick', evt);
			}

			return;
		break;
	}

	var choices = this.getAttribute('suggestions').replace(/^\s+|\s+$/g, '').toLowerCase().split(/\s+/);

	if (this.getAttribute('readonly') || !this.value.split(/\s+/).pop())
		suggestions = choices;
	else
	{
		var suggestions = [];
		var last_value = this.value.split(/\s+/).pop();

		for(var i=0; i<choices.length;i++)
			if (choices[i].toLowerCase().indexOf(last_value.toLowerCase()) == 0)
				suggestions.push(choices[i]);
	}

	autocompleteShowList(suggestions, this);
}

function autocompleteShowList(choices, input)
{
	var list = new DOMQuery('div.autocomplete', document.body).get(0), suggestions = [], completed_inline = false;
	var values = input.value.replace(/^\s+|\s+$/g, '').split(/\s+/);
	var last_value = input.value.split(/\s+/).pop(); /* when the user isn't typing; we don't want to complete the last keyword */

	// Put selected values on top
	if (input.getAttribute('readonly') || !last_value)
		choices = values.concat(choices).getUnique();

	for(var i=0; i<choices.length;i++)
	{
		if (!completed_inline && last_value && !input.getAttribute('readonly') && !isIE)
		{
			var input_value_length = input.value.length;
			input.value += choices[i].substring(last_value.length);
			input.setSelectionRange(input_value_length, input.value.length);
			completed_inline = true;
		}

		li_item =
			createDOMNode(
				'li',
				{
					'class' : (suggestions.length == 0 ? 'selected' : '') + (values.indexOf(choices[i]) >= 0 ? ' picked' : ''),
					'keyword'	: choices[i],
					'event' : ['click', function()
					{
						for(var i = 0; i < values.length; i++)
						{
							if(values[i].toLowerCase() == this.getAttribute('keyword').toLowerCase())
							{
								values.splice(i,1);
								var removed = true;
								break;
							}
						}

						if (completed_inline)
							values.pop();

						keyword = this.getAttribute('keyword').toLowerCase()
						if(!removed)
							values.push( keyword );

						if (!input.value.match(/keyword$/))
							input.value = values.join(' ').replace(/^\s+|\s+$/g, '') + ' ';
					}]
				},
				[choices[i]]
			);

		addEvent(
			li_item,
			'mouseover',
			function ()
			{
				jscss('remove', new DOMQuery('li.selected', this.parentNode).get(0), 'selected', '');
				jscss('add', this, 'selected');
			}
		);

		suggestions.push(li_item);
	}

	if(list)
		list.parentNode.removeChild(list);
	input.suggesting = false;

	if(suggestions.length > 0)
	{
		var autocompleteList = createDOMNode('div', {'class' : 'autocomplete'}, [createDOMNode('ul', {}, suggestions)] );
		document.body.appendChild(autocompleteList);
		var pos = findPos(input);
		if (isIE)
			autocompleteList.style.left = (pos.x - document.body.offsetLeft) +'px';
		else
			autocompleteList.style.left = (pos.x + 6) +'px';

		autocompleteList.style.top = (pos.y + input.offsetHeight + 4) +'px';

		addEvent(autocompleteList, 'mouseover', autocompleteListMouseOver);
		addEvent(autocompleteList, 'mouseout', autocompleteListMouseOut);

		autocompleteList.noMouse = true;

		input.suggesting = true;
	}
};

function autocompleteListMouseOver()
{
	this.noMouse = false;
};

function autocompleteListMouseOut()
{
	this.noMouse = true;
	if (this.noFocus)
		this.parentNode.removeChild(this);
};

function findPos(obj)
{
	var curleft = curtop = 0;
	if (obj.offsetParent)
	{
		curleft = obj.offsetLeft;
		curtop = obj.offsetTop;
		while (obj = obj.offsetParent)
		{
			curleft += obj.offsetLeft;
			curtop += obj.offsetTop;
		}
	}
	return {x: curleft, y: curtop};
};

function stretchTextareas(targets)
{
	addEventToTargets(targets, 'keyup', stretchTextarea, 'textarea');
	addEventToTargets(targets, 'change', stretchTextarea, 'textarea');
};

function stretchTextarea()
{
	var lines = this.value.match(/([\r\n])/g);
	if(lines == null)
		return;
		
	var lineHeight = parseFloat(currentStyle(this, 'line-height'));

	this.style.height = Math.min(500, (lineHeight ? lineHeight : '13') * (lines.length + 4)) + 'px';
};

function imageGallery()
{
	if(['list_message', 'list_messages'].indexOf(board_action) == -1)
		return;

	var container = new DOMQuery('div.extra-actions ul.links').get(0);
	if(!container)
		return;

	var actionheader = new DOMQuery('div#action-header').get(0);
	if(!actionheader)
		return;

	var link = createDOMNode('li', {'class' : 'topic-gallery'},
				[
					createDOMNode('span', {'class' : 'clickable', 'title' : getText('extra', 'show_gallery'), 'event' : ['click', _imageGallery], 'request' : 'action=list_messages&data%5Btopicid%5D=' + actionheader.className.match(/topic\-topicid\-([0-9]+)/i)[1] + '&limit=999&data%5Bfilter_keywords%5D=img&data%5Bboolean%5D=AND'}, [ getText('extra', 'show_gallery') ])
				]);

	container.insertBefore(link, container.firstChild);
};

function _imageGallery()
{
	var galleryContainer = new DOMQuery('div.image-gallery').get(0);
	if(galleryContainer)
		return jscss('toggle', galleryContainer, 'display-none');

	var galleryRequest = httpreq_string(this.getAttribute('request'), null, null, false);
	var size = 180;

	if(galleryRequest.getResponseHeader('X-Errormessage'))
	{
		alert( galleryRequest.getResponseHeader('X-Errormessage') );
		return true;
	}

	var container = getElementFromXHR(galleryRequest, 'div#core');
	var items = new DOMQuery('div.message-content-content img.rml', container);

	if(items.length == 0)
		return;

	var collection = [];
	for(var i = 0, item;(item = items.get(i)); i++)
	{
		jscss('add', item, 'display-none');

		item.setAttribute('maxwidth', size);
		item.setAttribute('maxheight', size);

		addEvent(item, 'load', scaleImage);

		collection.push( createDOMNode('li', {}, [ item ]) );
	}

	var galleryContainer = createDOMNode('div', {'class' : 'image-gallery'},
	[
		createDOMNode('h3', {}, [ getText('extra', 'show_gallery_header') ]),
		createDOMNode('ol', {}, collection)
	]);

	var container = getSiblingNode(this, 'up', 'div');
	container.parentNode.appendChild(galleryContainer);
};

/*
 * Catch clicks on anchors and follow links in parent window
 */
function microblogSetup(targets)
{
	addEventToTargets(targets, 'click', function(e) { parent.location.href = this.href; e.preventDefault(); }, 'a');

	resizeIframeToFullHeight('iframe-microblog');
};

var documents_data = Array();

function scrollToAnchor()
{
	if (!location.hash)
		return;

	var link          = location.hash.substr(1);

	if (!link.match(/^[0-9a-z]+$/))
	{
		return;
	}

	var element       = new DOMQuery("a#" +link );
	var scrollElement = element.get(0);

	if (!scrollElement)
		return;

	addEvent(
		window,
		'load',
		function() { scrollElement.scrollIntoView(); }
	);
}

function loginForm()
{
	/* checks if field isn't filled by browser's autocomplete feature */
	var f = new DOMQuery('input#quick-login-form-user').get(0);

	if(f && f.value == '')
	{
		f.value = getText('forms', 'username');
		addEvent(f, 'focus', _clearFieldSetTypePassword);
	}

	f = new DOMQuery('input#quick-login-form-password').get(0);
	if(f && f.value == '')
	{
		try
		{
			var replacement = f.cloneNode(true);
			replacement.type = 'text';
			replacement.value = getText('forms', 'password');
			f.parentNode.replaceChild(replacement, f);

			addEvent( replacement, 'click', _clearFieldSetTypePassword);
			addEvent( replacement, 'focus', _clearFieldSetTypePassword);
		}
		catch(e) { ; }
	}
};

function _clearFieldSetTypePassword()
{
	var password_input = new DOMQuery('input#quick-login-form-password').get(0);
	var username_input = new DOMQuery('input#quick-login-form-user').get(0);

	if ( username_input.value != getText('forms', 'username') )
		return;

	/* IE has problems, we will simply replace the whole element */
	try
	{
		var replacement = password_input.cloneNode(true);
		replacement.type = 'password';
		replacement.value = '';
		password_input.parentNode.replaceChild(replacement, password_input);

		username_input.value = '';
	}
	catch(e) { ; }
};

function boardForumPulldown()
{
	if(this.tagName.toLowerCase() != 'select')
		return;

	if(Number(this.value) > 0)
	{
		document.location.href =  board_script_url +'/list_topics/' + this.value;
	}
	else if(this.value != '')
	{
		document.location.href = this.value;
	}
};

function createFooter()
{
	var footer = new DOMQuery('div#footer').get(0);

	if (!footer)
		return;

	/* Add RSS link */
	var item = new DOMQuery('head link[type="application/rss+xml"]');

	if(item.length > 0)
	{
		var rss = item.get(0);

		var a = createDOMNode('a', {"href" : rss.href, "type" : rss.type, "title" : rss.title, "class" : 'rss-link'}, ['RSS']);

		footer.insertBefore(a, footer.firstChild);
	}

	var form = new DOMQuery('div#navigation form');
	if(form.length > 0)
	{
		footer.insertBefore(form.get(0).cloneNode(true), footer.firstChild);
	}
};

function topicNavigationPulldown(targets)
{
	addEventToTargets(targets, 'submit', function(){ return _handleTopicNavigationPulldown(this,false);}, 'form.topic-navigation');
	addEventToTargets(targets, 'change', function(){ return _handleTopicNavigationPulldown(this.form,false);}, 'form.topic-navigation select');
	addEventToTargets(targets, 'change', function(){ return _handleTopicNavigationPulldown(this.form,true);}, 'form select.topic-navigation');
};

function _handleTopicNavigationPulldown(form, useCurrentAction)
{
	if (useCurrentAction)
	{
		switch(board_action)
		{
			case 'update_message':
			case 'quote_message':
				var selectQry = new DOMQuery('select.topic-navigation', form);

				if (selectQry.length)
				{
					var select = selectQry.get(0);
					targetUrl = board_script_url + '/' + board_action + '/' + form.elements['data[messageid]'].value + '/' + select.options[select.selectedIndex].value;
				} else {
					return false;
				}

				break;
			case 'insert_message':
				var selectQry = new DOMQuery('select.topic-navigation', form);

				if (selectQry.length)
				{
					var select = selectQry.get(0);
					targetUrl = board_script_url + '/' + board_action + '/' + form.elements['data[topicid]'].value + '//' + select.options[select.selectedIndex].value;
				} else {
					return false;
				}

				break;


			default:
				return false;
		}
	} else {
		targetUrl = form.attributes['action'].value +'/'+ form.elements['action'].value +'/'+ form.elements['data[topicid]'].value +'/'+ form.elements['data[offset]'].value;
	}

	document.location.href = targetUrl;

	return false;
};

function pulldownAutoSubmits(targets)
{
	addEventToTargets(targets, 'change', _handlePullDowns, 'select.faq-list, form.topic-navigation select, form#form-more-topic select, select#calendar-select-date, select.page-dropdown');
	addEventToTargets(null, 'change', boardForumPulldown, 'select.jump-to-action');
};

function _handlePullDowns()
{
	if(this.tagName.toLowerCase() == 'select')
		this.form.submit();
};

function toggleAuthorLinks(targets)
{
	var items = getTargets(targets, 'ol.messages div.author-nickname');

	if(items.length == 0)
		return;

	for(var i = 0, item; (item=items.get(i)); i++)
	{
		addEvent(item, 'click', _toggleAuthorLinks);
		jscss('add', item, 'author-links-toggle', '');
	}
};

function _toggleAuthorLinks(e)
{
	if(!jscss('check', (e.srcElement || e.target), 'author-nickname')) /* dont expand when clicking on a sub-element */
		return;

	var item = new DOMQuery('ul.author-links', getSiblingNode(this, 'up', 'li')).get(0);

	if (item)
		jscss('toggle', item, 'author-links-expanded');

	jscss('toggle', this, 'author-links-toggle-open');
};

function followTopicLinks()
{
	var subitems = new DOMQuery('a', this);
	if(subitems.length == 1)
	{
		window.location.href = subitems.get(0).href;
	}
}

var toggleVisibilityCookie;
function toggleVisibility(targets)
{
	var items = getTargets(
		targets,
		'h3[id] + fieldset, h3[id] + dl.property-list, tr[id].category-name td, div.extra-actions ul li#forum-tagcloud, div.discussion-folders ul.folders li[id]'
	);

	if(items.length == 0)
		return;

	getToggleVisibilityCookie();

	for(var i = 0, item;(item=items.get(i));i++)
	{
		switch(item.tagName.toLowerCase())
		{
			case 'li':
			case 'td':
				addEvent(item, 'click', _toggleVisibility);
				jscss('add',item,'toggle-icon','');

				if(toggleVisibilityCookie.indexOf(item.tagName.toLowerCase() == 'li' ? item.id : item.parentNode.id) > -1)
					_toggleVisibility(true, item);
			break;
			default:
				addEvent(item.previousSibling, 'click', _toggleVisibility);
				jscss('add',item.previousSibling,'toggle-icon','');

				if(toggleVisibilityCookie.indexOf(item.previousSibling.id) > -1)
					_toggleVisibility(true, item.previousSibling);
			break;
		}
	}
};

function _toggleVisibility(init, x)
{
	if(typeof x == 'undefined')
		x = this;

	/* don't toggle when the user clicks a link */
	if(typeof init == 'object')
	{
		var target = init.srcElement || init.target;
		if(target.tagName.toLowerCase() == 'a')
			return;
	}

	var tagname = x.tagName.toLowerCase();

	if(tagname == 'td')
	{
		if(init != true)
			storeToggleVisibility(x.parentNode.id, jscss('check', x, 'toggle-alternate-icon'));

		var node = x.parentNode;

		while( node.nextSibling && (node = node.nextSibling) && !jscss('check', node, 'category-name') )
		{
			jscss('toggle', node, 'display-none','');
		}
	}
	else
	{
		if(init != true)
		{
			storeToggleVisibility(x.id, jscss('check', x, 'toggle-alternate-icon'));
		}

		if(tagname == 'li')
		{
			jscss('toggle', x, 'display-no-childs');
		}
		else
		{
			jscss('toggle', x.nextSibling, 'display-none','');
		}
	}

	if(typeof init == 'object')
	{
		init.stopPropagation();
	}

	jscss('toggle', x, 'toggle-alternate-icon','');

	return;
};

function storeToggleVisibility(x, del)
{
	toggleVisibilityCookie = toggleVisibilityCookie.getUnique();

	if(toggleVisibilityCookie.indexOf(x) > -1 && del)
	{
		var newCookie = [];
		for(var i=0, item;(item=toggleVisibilityCookie[i]);i++)
		{
			if( item != x )
				newCookie.push(item);
		}

		toggleVisibilityCookie = newCookie;
	}
	else
	{
		if (toggleVisibilityCookie.indexOf(x) == -1)
			toggleVisibilityCookie.push(x);
	}

	setCookie('toggle', toggleVisibilityCookie.join(':'));
};

function getToggleVisibilityCookie()
{
	var c = getCookie('toggle');
	toggleVisibilityCookie = [];

	if(c)
		toggleVisibilityCookie = c.split(':');
};

function disabledOption()
{
	if(jscss('check', this.options[this.selectedIndex], 'disabled', ''))
	{
		this.selectedIndex = -1;
		alert(getText('normal', 'disabled_option'));
	}
};

function fixBrowserIssues()
{
	var i = 0, items, item;

	if(board_action == 'error_general')
	{
		var reference = new DOMQuery('ul.error-links li.home').get(0);
		if(reference)
		{
			reference.parentNode.appendChild(
				createDOMNode('li', {"class" : "back"}, [
					createDOMNode('span', {"class" : "clickable", "event" : ['click', function() { history.go(-1);}] }, [ getText('normal', 'back') ])
				])
			);
		}
	}

	if(isIE)
	{
		if (!isIE8)
		{
			items = new DOMQuery('dt.required');
			var req = null;
			for(i = 0;(item=items.get(i));i++)
			{
				req = createDOMNode('span', {"class" : 'required'}, [' *']);
				item.appendChild(req);
			}
		}

		items = new DOMQuery('button');
		for(i = 0 ; (item=items.get(i));i++)
		{
			addEvent(item, 'click', function()
			{
				this.value = this.attributes['value'].value;
				if(isIE6 && this.type == 'submit')
				/*
					http://www.w3.org/TR/html401/interact/forms.html#h-17.13.2
					"If a form contains more than one submit button, only the activated submit button is successful."
					IE6 doesn't care and sends other submit buttons as well :|
				 */
				{
					var form = getSiblingNode(this, 'up', 'form');
					if(form)
					{
						var items = new DOMQuery('button[type=submit]', form);
						for(var i = 0, item ; (item=items.get(i));i++)
						{
							if(item != this)
								item.disabled = true;
						}
					}
				}
			});
		}

		/* IE has problems with unicode characters in forms with 'multipart' encoding
		   It 'ignores' the first input field, so we add a bogus one for IE to forget */
		items = new DOMQuery('form');
		for(i = 0 ; (item=items.get(i));i++)
		{
			if(typeof item == 'undefined')
				continue;

			if ( typeof item.enctype != 'undefined' && item.enctype == 'multipart/form-data' )
			{
				var input = createDOMNode('input', {"type" : 'hidden', "name" : 'ie-dummy'}, []);

				if ( item.elements[0] )
					item.insertBefore(input, item.elements[0]);
				else
					item.insertBefore(input);
			}
		}

		var disabled = new DOMQuery("option[disabled]"), j, parent, parents = [];
		for(i = 0;(item=disabled.get(i));i++)
		{
			jscss('add', item, 'disabled', '');
			parent = getSiblingNode(item, 'up', 'select');

			if(parents.indexOf(parent) < 0)
			{
				addEvent(parent, 'change', disabledOption);

				if(jscss('check', parent.options[parent.selectedIndex], 'disabled'))
					parent.selectedIndex = -1;

				parents.push(parent);
			}
		}
		parents = null;

		// IE 6 & IE 7 have problems with a topic-navigation DL without a topic-links to push them down
		// So we add a special class to be able to fix it in IE fix css
		addClassToTargets('p + dl.topic-navigation', 'topic-navigation-nolinks');
	}

	if(isIE6)
	{
		// MSIE can't handle first-child/last-child, so let's fix it ourselfs,
		// including some other selectors ander :after fixes
		addClassToTargets('div.action-header ol li:first-child, div#navigation li:first-child, div#welcome-text li:first-child, ul.calendar-navigation-up li:first-child', 'first-child');
		addClassToTargets('form .advanced-option + *, form dt.advanced-option + * + dd.dd-sequence, form dt.advanced-option + * + dd.dd-sequence + dd.dd-sequence', 'advanced-option-adjacent');
		addClassToTargets('div.rmltoolbar + textarea#rml_textarea', 'adjacent');

		items = new DOMQuery('input, button');
		for(i=0; (item=items.get(i));i++)
		{
			jscss('add', item, item.type);
		}

		addClassToTargets('dd.poll-result span > span', 'sub');
		addClassToTargets('dt:first-child + dd + dd.poll-result span', 'first');

		var _toggleAdvancedOptions = toggleAdvancedOptions;
		/* prevent repaint problems in IE6 */
		toggleAdvancedOptions = function()
		{
			document.body.style.display = 'none';
			 _toggleAdvancedOptions();
			document.body.style.display = 'block';
		}
	}
	else if(isWebKit)
	{
		// fancyfy the searchfields; make 'm pretty
		items = new DOMQuery('input.searchfield');
		var a = createDOMNode('a', {"href" : board_script_url}, []);
		for(i = 0; (item=items.get(i));i++)
		{
			item.setAttribute('type', 'search');

			// apple prefers a nl.react.www.search syntax
			item.setAttribute('autosave', a.host.split('.').reverse().join('.')+'.search');
			item.setAttribute('results', 5);
			item.setAttribute('placeholder', getText('normal', 'search_webkit') );
		}
	}
};

function attachRMLToolbar(targets)
{
	var rmltextareas = getTargets(targets, 'textarea#rml_textarea');

	if(rmltextareas.length == 0)
		return;

	for(var i = 0, item; (item=rmltextareas.get(i));i++)
	{
		item.parentNode.insertBefore(getToolbar(board_documentlibrary_allowed), item);
		if(isIE)
		{
			addEvent(item, 'click', storeCursor);
			addEvent(item, 'keyup', storeCursor);
			addEvent(item, 'select', storeCursor);
		}
	}

	/* dirty IE hack to force reflow */
	if(isIE)
	{
		addEvent(window, 'load', function() { jscss('add', document.body, 'display-none'); jscss('remove', document.body, 'display-none'); });
	}
};

function logoutSessions(targets)
{
	if(board_action != 'logout')
		return;

	var sessions = getTargets(targets, 'input[type="checkbox"]');

	for(var i=0, item; (item=sessions.get(i)); i++)
	{
		addEvent(item, 'change', _logoutSessions);
		addEvent(item, 'click', _logoutSessions);
	}
};

function _logoutSessions()
{
	var logoutOptions = new DOMQuery('form#form-logout input[type="radio"]'), logoutBySession = new DOMQuery('input#logout_by_session');

	for(var i=0, item; (item=logoutOptions.get(i));i++)
	{
		item.checked = false;
	}

	logoutBySession.get(0).checked = true;
};

function setupToggleFolders()
{
	var menu = new DOMQuery('div.discussion-folders li');

	if(menu.length == 1)
	{
		addEvent(menu.get(0), 'click', toggleFolders);
	}
};

function toggleFolders(e)
{
	e.stopPropagation();

	var childs = new DOMQuery('ul', this);

	if(childs.length > 0)
	{
		jscss('toggle', this, 'active');
	}
};

function toggleTagcloudOverflow(e)
{
	var tagcloud = new DOMQuery('li.forum-tagcloud div').get(0);
	if(!tagcloud)
		return;

	if (new DOMQuery('a', tagcloud).length < 10)
		return;

	var more = createDOMNode('span', {'event' : ['click', function(e) { jscss('toggle', tagcloud, 'show-all'); e.stopPropagation(); }] }, [ ' ' + getText('normal', 'more') ]);

	tagcloud.appendChild(more);
};

var doclibsOpened = Array();
var currentTextarea;

var rml_buttons = [
	'bold', 'italic', 'underline', 'strike','hline',
	/*'sup', 'sub','hline',*/
	'align_left','align_center','align_right','align_justify','hline',
	'list_bullet', 'list_num','hline',
	/*'color_bg', */'color_fg','hline',
	'link', 'image','hline',
	'table', /*'hr',*/'hline',
	'maximize', 'documentlibrary', 'smileys'
];

function setCurrentTextarea(window)
{
	currentTextarea = doclibsOpened[window];
};

function getToolbar( showDocumentLibrary )
{
	var x = createDOMNode('div', {"class": "rmltoolbar"}, []);

	var img;
	for(var i = 0; i < rml_buttons.length;i++)
	{
		if(rml_buttons[i] == 'documentlibrary' && !showDocumentLibrary)
			continue;

		if(rml_buttons[i] == 'maximize' && events.indexOf(stretchTextareas) > -1)
			continue;

		if(rml_buttons[i] == 'smileys')
		{
			var smileys = (new DOMQuery('div#smileys')).get(0);

			if(!smileys)
				continue;

			var smileysClone = smileys.cloneNode(true);
			var smileysContainer = getSiblingNode(smileys, 'up', 'dd');
			var smileysContainerLabel = getSiblingNode(smileysContainer, 'previous', 'dt');

			smileysContainerLabel.parentNode.removeChild(smileysContainerLabel);
			smileysContainer.parentNode.removeChild(smileysContainer);

			x.appendChild(smileysClone);
		}

		if(rml_buttons[i] == 'color_fg' || rml_buttons[i] == 'color_bg')
		{
			var colorpicker = new DOMQuery('div#CLCP').get(0);
			if(!colorpicker)
			{
				colorpicker = createDOMNode('div', { 'id' : 'CLCP', 'class' : 'CLCP' }, []);
				document.body.appendChild(colorpicker);
				CLCPinitPicker();
			}
		}

		img = createDOMNode('img', {
			'src'	: board_template_url+'img/icons/toolbar/toolbar-sprite.gif',
			'class' : 'button',
			'title' : getText('toolbar', rml_buttons[i]),
			'alt' : getText('toolbar', rml_buttons[i])
		}, []);

		if(rml_buttons[i] != 'hline')
		{
			addEvent(img, 'click', handleRMLToolbarClick);
			img.id  = 'rmltoolbar_'+rml_buttons[i];
		}
		else
			jscss('add',img,'hline','');

		x.appendChild(img);
	}

	return x;
};

function handleRMLToolbarClick()
{
	if(this.parentNode && this.parentNode.nextSibling && this.parentNode.nextSibling.tagName.toLowerCase() == 'textarea')
	{
		currentTextarea = this.parentNode.nextSibling;
	}

	var listtype, my_link, my_title, sel, rows, type, out;

	switch(this.id)
	{
		case 'rmltoolbar_bold':
			wrapSelection('[b]','[/b]');
			return;
			break;
		case 'rmltoolbar_italic':
			wrapSelection('[i]','[/i]');
			return;
			break;
		case 'rmltoolbar_underline':
			wrapSelection('[u]','[/u]');
			return;
			break;
		case 'rmltoolbar_strike':
			wrapSelection('[s]','[/s]');
			return;
			break;
		case 'rmltoolbar_sup':
			wrapSelection('[sup]','[/sup]');
			return;
			break;
		case 'rmltoolbar_sub':
			wrapSelection('[sub]','[/sub]');
			return;
			break;
		case 'rmltoolbar_align_left':
			wrapSelection('[left]','[/left]');
			return;
			break;
		case 'rmltoolbar_align_center':
			wrapSelection('[center]','[/center]');
			return;
			break;
		case 'rmltoolbar_align_right':
			wrapSelection('[right]','[/right]');
			return;
			break;
		case 'rmltoolbar_align_justify':
			wrapSelection('[justify]','[/justify]');
			return;
			break;
		case 'rmltoolbar_list_bullet':
			listtype = '*';
		case 'rmltoolbar_list_num':
			if(typeof listtype == 'undefined')
				listtype = '1';
			var type = '*';
			var sel = getCurrentSelection();
			var rows = sel.split('\n');
			var out = '[list='+listtype+']';
			for(var i = 0, row;(row=rows[i]);i++)
			{
				if(row != '')
					out += '\n\t[li]'+row+'[/li]';
			}

			if(i==0)
			{
				out += '\n\t[li]'+row+'[/li]';
			}

			out += '\n[/list]';
			setSelection(out);
			return;
			break;
		case 'rmltoolbar_color_fg':

			if( isIE ){
				// The current selection
				var range = document.selection.createRange();
				// We'll use this as a 'dummy'
				var stored_range = range.duplicate();
				// Select all text
				stored_range.moveToElementText( currentTextarea );
				// Now move 'dummy' end point to end point of original range
				stored_range.setEndPoint( 'EndToEnd', range );
				// Now we can calculate start and end points
				currentTextarea.selectionStart = stored_range.text.length - range.text.length;
				currentTextarea.selectionEnd = currentTextarea.selectionStart + range.text.length;
			}

			CLCPshowPicker( { 'callback' : function() { wrapSelection("[fgcolor=#" + CLCPhsv2hex(HSV) + "]", "[/fgcolor]") } } );
			break;
		case 'rmltoolbar_color_bg':
			CLCPshowPicker( { 'callback' : function() { wrapSelection("[bgcolor=#" + CLCPhsv2hex(HSV) + "]", "[/bgcolor]") } } );
			break;
		case 'rmltoolbar_table':
			sel = getCurrentSelection();
			rows = sel.split('\n');
			out = '[table]';
			var j;
			for(var i = 0, row;(row=rows[i]);i++)
			{
				out += '\n[tr]';
				var cells = row.split('\t');
				for(var j=0, cell;(cell=cells[j]);j++)
				{
					out += '\n\t[td]'+cell+'[/td]';
				}
				out += '\n[/tr]';
			}
			out += '\n[/table]';

			setSelection(out);
			return;
			break;
		case 'rmltoolbar_image':
			if(getCurrentSelection() != '')
			{
				wrapSelection('[img]', '[/img]');
				return;
			}
			my_link = prompt(getText('toolbar', 'enter_img_url'),"http://");

			if (my_link != null && my_link !='http://')
			{
				lft="[img]" + my_link;
				rgt="[/img]";
				wrapSelection(lft, rgt);
			}
			return;
			break;
		case 'rmltoolbar_link':
			my_link = prompt(getText('toolbar', 'enter_url'),"http://");

			if (my_link == null)
				return;

			var selection = getCurrentSelection();
			my_title = prompt(getText('toolbar', 'enter_title'),"");

			wrapSelection('[url=' + my_link + (selection && my_title ? ',' + my_title : '') + ']' + (selection ? '' :  my_title || my_link),'[/url]');

			return;
			break;
		case 'rmltoolbar_documentlibrary':
			var width = 785;
			var height = 650;
			if(typeof wideScreenCSS != 'undefined' && wideScreenCSS)
			{
				var width = 980;
				var height = 750;
			}
			var ref = window.open(board_script_url+'/list_documents?data[small]=1','DocumentLibrary','width='+width+',height='+height+',resizable=yes,scrollbars=yes');
			doclibsOpened[ref] = this.parentNode.nextSibling;
			break;
		case 'rmltoolbar_smileys':
			toggleSmileys();
			addEvent(get_rmltextarea(), 'focus', hideSmileys);
			addEvent(get_rmltextarea(), 'blur', hideSmileys);
			break;
		case 'rmltoolbar_maximize':
			var txtarea = get_rmltextarea();
			if(jscss('check',txtarea,'extra-large',''))
			{
				jscss('remove',txtarea,'extra-large','');
				jscss('remove',txtarea,'large','');
			}
			else if( jscss('check',txtarea,'large') )
			{
				jscss('add',txtarea,'extra-large','');
			}
			else
			{
				jscss('add',txtarea,'large','');
			}
			break;
		case 'rmltoolbar_hr':
			setSelection('[hr]');
			break;
		case 'rmltoolbar_youtube':
			if(getCurrentSelection() != '')
			{
				wrapSelection('[youtube]', '[/youtube]');
				return;
			}
			my_link = prompt(getText('toolbar', 'youtube_link'), 'http://');

			if (my_link != null && my_link != 'http://')
			{
				lft="[youtube]" + my_link;
				rgt="[/youtube]";
				wrapSelection(lft, rgt);
			}
			return;
	}
};

function toggleSmileys()
{
	jscss('toggle', new DOMQuery('div#smileys').get(0), 'show');
};
function hideSmileys()
{
	jscss('remove', new DOMQuery('div#smileys').get(0), 'show');
};

function get_rmltextarea()
{
	if(typeof currentTextarea == 'undefined')
		currentTextarea = new DOMQuery('textarea#rml_textarea').get(0);
	return currentTextarea;
};

function getContentFromOriginal()
{
	get_rmltextarea().value=window.opener.get_rmltextarea().value;
};

function setContentToOriginal()
{
	window.opener.get_rmltextarea().value=get_rmltextarea().value;window.close();
};

function rescaleTextarea(txtarea)
{
	if (typeof document.all != 'undefined')
	{
		txtarea.style.height=(document.body.clientHeight-80)+'px';
		txtarea.style.width=(document.body.clientWidth-15)+'px';
	}
	else
	{
		txtarea.style.height=(window.innerHeight-80)+'px';
		txtarea.style.width=(window.innerWidth-15)+'px';
	}
};

function wrapSelection(lft, rgt)
{
	var txtarea = get_rmltextarea();

	if (isIE)
	{
		IEWrap(txtarea, lft, rgt);
	}
	else
	{
		mozWrap(txtarea, lft, rgt);
	}
};

function mozWrap(txtarea, lft, rgt)
{
	var selLength = txtarea.textLength;
	var selStart = txtarea.selectionStart;
	var selEnd = txtarea.selectionEnd;
	if (selEnd==1 || selEnd==2)
	{
		selEnd = selLength;
	}
	var s1 = txtarea.value.substring(0,selStart);
	var s2 = txtarea.value.substring(selStart, selEnd);
	var s3 = txtarea.value.substring(selEnd, selLength);

	var scrollTop = txtarea.scrollTop;
	txtarea.value = s1 + lft + s2 + rgt + s3;
	txtarea.scrollTop = scrollTop;
};

function IEWrap(txtarea, lft, rgt)
{

	var selectionRange = document.selection.createRange();

	if (selectionRange.text == "" && txtarea.selectionStart >= 0)
	{
		selectionRange = txtarea.createTextRange()
		var newend = txtarea.selectionEnd - txtarea.selectionStart;
		selectionRange.collapse(true);
		selectionRange.moveStart("character", txtarea.selectionStart);
		selectionRange.moveEnd("character", newend);
		selectionRange.select();
	}

	var strSelection = selectionRange.text;
	if (strSelection && selectionRange.parentElement() == txtarea)
	{
		document.selection.createRange().text = lft + strSelection + rgt;
	}
	else
	{
		txtarea.value += lft + rgt;
	}
};

function getCurrentSelection()
{
	if (typeof document.selection != 'undefined' && document.selection.createRange)
	{
		return IEGet();
	}
	else if (document.getElementById)
	{
		var txtarea = get_rmltextarea();
		return mozGet(txtarea);
	}
	return '';
};

function mozGet(txtarea)
{
	var selLength = txtarea.textLength;
	var selStart = txtarea.selectionStart;
	var selEnd = txtarea.selectionEnd;
	if (selEnd==1 || selEnd==2)
		selEnd=selLength;
	return (txtarea.value).substring(selStart, selEnd);
};

function IEGet()
{
	return document.selection.createRange().text;
};

function setSelection(str)
{
	var txtarea = get_rmltextarea();
	if (typeof document.all != 'undefined')
	{
		IESet(txtarea, str);
	}
	else if (document.getElementById)
	{
		mozSet(txtarea, str);
	}
};

function mozSet(txtarea, str)
{
	var selLength = txtarea.textLength;
	var selStart = txtarea.selectionStart;
	var selEnd = txtarea.selectionEnd;
	if (selEnd==1 || selEnd==2)
		selEnd=selLength;
	var s1 = txtarea.value.substring(0,selStart);
	var s2 = txtarea.value.substring(selStart, selEnd);
	var s3 = txtarea.value.substring(selEnd, selLength);
	txtarea.value = s1 + str + s3;
};

function IESet(txtarea, str)
{
	strSelection = document.selection.createRange().text;

	if (strSelection!="")
	{
		document.selection.createRange().text = str;
	}
	else
	{
		txtarea.value += str;
	}
};

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

function putStr( text )
{
	var target = get_rmltextarea();

	if ( target )
	{
		if (typeof document.all != 'undefined' && target.cursorPos)
		{
			var cursorPos = target.cursorPos;
			cursorPos.text = cursorPos.text.charAt(cursorPos.text.length - 1) == ' ' ? text + ' ' : text;
		}
		else
		{
			try
			{
				wrapSelection('', text);
			}
			catch(e)
			{
				target.value += text;
			}
		}

		target.focus();
	}
};

function getDocumentSelector(documentid)
{
	var data = raw_documents[documentid];
	var format_list = [ createDOMNode('option', {"value" : ''}, [getText('doclib', 'original')]) ];

	if(typeof formats != "undefined")
	{
		for(var i=0; i < formats.length;i++)
		{
			format_list[i+1] = createDOMNode('option', {"value" : formats[i][0]}, [formats[i][0]+ ' (' + formats[i][1][0] + 'x' + formats[i][1][1] + ')']);
		}
	}

	/**
		var float_select = new DOMQuery('select[name="float"]', this);
		var format_select = new DOMQuery('select[name="format"]', this);
		var link_input = new DOMQuery('input[name="link"]', this);
	*/

	function toggleInsertAs()
	{
		var disabled = !(this.value == 'image');
		new DOMQuery('input#link_'+documentid).get(0).disabled = disabled;
		new DOMQuery('select#format_'+documentid).get(0).disabled = disabled;
		new DOMQuery('select#float_'+documentid).get(0).disabled = disabled;
	}

	var insert_as = [
		createDOMNode('dt', {}, [getText('doclib', 'insert_as')]),
		createDOMNode('dd', {}, [
			createDOMNode('input', {"value" : 'image', "name" : 'as', "type" : 'radio', "id" : 'as_image_'+documentid+'_image', 'checked' : 'checked', 'class' : 'radio', 'event' : [(isIE ? 'click' : 'change'), toggleInsertAs] }, []),
			createDOMNode('label', {'for' : 'as_image_'+documentid+'_image'}, [getText('doclib', 'insert_as_image')]),
			createDOMNode('input', {"value" : 'text', "name" : 'as', "type" : 'radio', "id" : 'as_text_'+documentid+'_image', 'class' : 'radio', 'event' : ['change', toggleInsertAs] }, []),
			createDOMNode('label', {'for' : 'as_text_'+documentid+'_text'}, [getText('doclib', 'insert_as_text')])
		] )
	];

	var insert_as_link = [
		createDOMNode('dt', {}, [getText('doclib', 'insert_as_link')]),
		createDOMNode('dd', {},
			[
				createDOMNode('input', {"value" : 'link', "name" : 'link', "type" : 'checkbox', "id" : 'link_'+documentid, 'class' : 'checkbox'}, []),
				createDOMNode('label', {'for' : 'link_'+documentid}, [getText('doclib', 'insert_as_thumb')])
			]
		)
	];

	var format = [
		createDOMNode('dt', {}, [getText('doclib', 'format')]),
		createDOMNode('dd', {},
			[
				createDOMNode('select', {"name" : 'format', "id" : 'format_'+documentid}, format_list)
			])
	];

	var align = [
		createDOMNode('dt', {}, [getText('doclib', 'outline')]),
		createDOMNode('dd', {},
		[
			createDOMNode('select', {"name" : 'float', "id" : 'float_'+documentid},
			[
				createDOMNode('option', {"value" : ''}, [getText('doclib', 'none')]),
				createDOMNode('option', {"value" : 'left'}, [getText('doclib', 'left')]),
				createDOMNode('option', {"value" : 'right'}, [getText('doclib', 'right')])
			]),
		])
	];

	var insert = [
		createDOMNode('dt', {}, [getText('doclib', 'insert')]),
		createDOMNode('dd', {},
		[
			createDOMNode('input', {"value" : getText('doclib', 'insert_image'), "type" : 'submit'}, []),
		])
	];

	if (data[5] == '1')
	{
		/* If the document is remote and doesn't have an alternative icon. Don't show the image
	 	 * related form elements */
		if (data[6] != '1')
		{
			format = [];
			align = [];
		}
		else
		{
			insert_as_link[1].childNodes[0].disabled = true;
			insert_as_link[1].childNodes[0].checked = true;
			insert_as_link[1].childNodes[0].defaultChecked = true;
		}
	}

	var form_combined = insert_as.concat(insert_as_link, format, align, insert);

	form_combined = form_combined.concat(insert_as_link);
	form_combined = form_combined.concat(format);
	form_combined = form_combined.concat(align);
	form_combined = form_combined.concat(insert);

	var form =
		createDOMNode('div', {"id" : "document-selector"},
		[
			createDOMNode('h3', {"id" : 'insert_image'}, [getText('doclib', 'insert_image')]),
			createDOMNode('form', {"method" : 'POST', "action" : board_script_url, "event" : ['submit', copy2rml]},
			[
				createDOMNode('fieldset', {},
				[
					createDOMNode('input', {"value" : documentid, "name" : 'documentid', "type" : 'hidden'}, []),
					createDOMNode('input', {"value" : data[0], "name" : 'url', "type" : 'hidden'}, []),
					createDOMNode('input', {"value" : data[1], "name" : 'key', "type" : 'hidden'}, []),
					createDOMNode('input', {"value" : data[2], "name" : 'libraryid', "type" : 'hidden'}, []),
					createDOMNode('input', {"value" : '', "name" : 'alt', "type" : 'hidden'}, []),
					createDOMNode('input', {"value" : data[4], "name" : 'filename', "type" : 'hidden'}, []),

					createDOMNode('dl', {}, form_combined)
				])
			])
		]);

	return form;
};

function doclibInteraction()
{
	switch(board_action)
	{
		case 'edit_document':
			addEventToTargets(null, 'click', modifyThumbnail, 'img[longdesc]');
		break;

		case 'list_documents':
			if (jscss('check', document.body, 'small'))
			{
				var links = new DOMQuery('a[href*="list_documents"], a[href*="edit_document"], a[href*="insert_document"]');

				for(var i = 0, link; (link = links.get(i));i++)
				{
					if(isIE)
					{
						/*
							IE checks if the link's firstChild.nodeValue equals a "valid" url,
							if so it will swap it's value with the newly set href.

							IE considers http://, https://, ftp:// and ^www. as "valid"

							IE should really die.
						*/
						if( link.firstChild.nodeValue.match(/^(((ftp|https?):\/\/)|(www\.))/) )
						{
							link.appendChild(createDOMNode('span', {'class' : 'dummy'}, []));
						}
					}
					if(isIE || isWebKit)
					{
						/*
							IE appends search part after hash, so we strip the hash,
							append search part, and append hash again

							IE should really die. See comment above.

							WebKit however has link.search as r/o, how useful is that?
						*/
						parts = link.href.split('#');

						link.href = parts[0];
						link.href += (link.search.length ? '&' : '?') +'data[small]=1';

						if(parts[1])
							link.hash = parts[1];
					}
					else
					{
						link.search += (link.search.length ? '&' : '?') +'data[small]=1';
					}
				}

				addEventToTargets(null, 'click', doclibImageClick, 'body.list_documents div.document');
			}
			else
			{
				addEventToTargets(null, 'click', selectAllDocuments, 'input#select_all_documents');
				addEventToTargets(null, 'click', selectDocument, 'body.list_documents div.document img, body.list_documents div.document li.select input');
			}
		break;
	}

	/* yes, it's doubtfull wether this is the best place... */
	var items = new DOMQuery('ol.messages a.doclib');
	for(var i = 0, item; (item = items.get(i)); i++)
	{
		addEvent(item, 'click', function(e) { window.open(this.href, 'popupdoclib'); e.preventDefault(); } );
	}
};


/*
	this function can be called in 3 ways:
	- by the checkbox itself
	- by a click on the image
	- by selectAllDocuments()
*/
function selectDocument(obj)
{
	var callingElement = this.tagName ?  this : obj, checkbox;
	var container = getSiblingNode(callingElement, 'up', 'div');

	/* if it's not the checkbox itself who's calling us, toggle it */
	if ( callingElement.tagName.toLowerCase() != 'input' )
	{
		checkbox = new DOMQuery('input[type=checkbox]', container).get(0);
		checkbox.checked = !checkbox.checked;
	}
	else
	{
		checkbox = callingElement;
	}

	if ( checkbox.checked )
	{
		jscss('add', container, 'selected', '');

		if( (new DOMQuery('div.document input')).length == (new DOMQuery('div.document.selected input')).length)
			(new DOMQuery('input#select_all_documents').get(0)).checked = true;
	}
	else
	{
		jscss('remove', container, 'selected', '');

		(new DOMQuery('input#select_all_documents').get(0)).checked = false;
	}
};

function selectAllDocuments()
{
	/* uncheck selected images */
	if(board_action == 'list_documents')
	{
		var img = new DOMQuery('div.document.selected img');
		for(var i = 0; i < img.length;i++)
		{
			selectDocument(img.get(i));
		}
	}

	if(!this.checked)
		return;

	if(board_action == 'list_documents')
	{
		img = new DOMQuery('div.document img');

		for(i=0; i < img.length;i++)
		{
			selectDocument(img.get(i));
		}
	}
};

function deselectAllDocuments()
{
	var selectedDocuments = new DOMQuery('div.document.selected');
	for(var i = 0, selectedDocument; (selectedDocument=selectedDocuments.get(i)); i++)
	{
		jscss('remove', selectedDocument, 'selected', '');
	}
}

function doclibImageClick(e)
{
	var x = this;
	if(x.tagName.toLowerCase() != 'img')
		x = new DOMQuery('img', this ).get(0);

	if (typeof x == 'undefined')
		return;

	var container = getSiblingNode(x, 'up', 'div');
	var documentid = container.id.replace(/^document_/, '');

	/* store for later use */
	var currentlySelected = jscss('check', container, 'selected');
	deselectAllDocuments();

	/* destroy existing */
	var currentForm = new DOMQuery("div.discussion-content div#document-selector").get(0);
	if(currentForm)
		currentForm.parentNode.removeChild(currentForm);

	/* show just one form at a time */
	var searchForm = new DOMQuery('form#form-documents-find').get(0);
	if(currentlySelected)
	{
		jscss('remove', searchForm, 'display-none');
		jscss('remove', getSiblingNode(searchForm, 'previous', 'h3'), 'display-none');
		deselectAllDocuments();
		/* we're de-selecting, so no info to parent window */
		return;
	}
	else
	{
		jscss('add', container, 'selected', '');

		if(searchForm)
		{
			jscss('add', searchForm, 'display-none');
			jscss('add', getSiblingNode(searchForm, 'previous', 'h3'), 'display-none');
		}
	}

	// do we have to notify the document selector opener?
	if(window.opener != null && typeof window.opener.selectedDocument != 'undefined')
	{
		try
		{
			window.opener.selectedDocument(documentid, window);
		}
		catch(e)
		{
			;
		}
	}

	var form = getDocumentSelector( documentid );
	if(!form)
		return;

	var p = new DOMQuery("div.discussion-content").get(0);
	if(!p)
		return;

	p.insertBefore(form, p.childNodes[0]);
};

function copy2rml(e)
{
	e.preventDefault();

	if (typeof window.opener == 'undefined' || !window.opener.document)
		return false;

	// Are we called from a FCKEditor image-selector?
	if(typeof window.opener.SetUrl != 'undefined')
	{
		window.opener.SetUrl(board_script_url +
				'/../download.php/download_document/' +
				new DOMQuery('input[name="documentid"]', this).get(0).value +
				'/' + new DOMQuery('input[name="key"]', this).get(0).value +
				'/' +
				new DOMQuery('select[name="format"]', this).get(0).value
		);
		window.close();
		return false;
	}

	/* find out which radio button was selected */
	var items = new DOMQuery('input[name="as"]', this), data_as;
	for(var i = 0, item; (item = items.get(i)); i++)
	{
		if(item.type == 'hidden' || item.checked)
		{
			data_as = item;
			break;
		}
	}

	if(!data_as)
		return false;

	var rml = '';
	switch( data_as.value )
	{
		case 'image':
			var float_select = new DOMQuery('select[name="float"]', this);
			var format_select = new DOMQuery('select[name="format"]', this);
			var link_input = new DOMQuery('input[name="link"]', this);

			var link = '0';

			var float = '', format='';

			if (float_select.length > 0)
				float = float_select.get(0).options[ float_select.get(0).selectedIndex ].value;

			if (format_select.length > 0)
				format = format_select.get(0).options[ format_select.get(0).selectedIndex ].value;

			if ( link_input.length > 0)
			{
				link = link_input.get(0).checked ? '1' : '0';
			}

			rml = '[doclib=' +
					new DOMQuery('input[name="documentid"]', this).get(0).value +
					',' +
					new DOMQuery('input[name="key"]', this).get(0).value +
					',' +
					new DOMQuery('input[name="libraryid"]', this).get(0).value +
					',' +
					format +
					',' +
					link +
					(float != "" ? ("," + float) : "" ) +
					']\n';
		break;
		case 'text':
			rml = '[doclib=' +
					new DOMQuery('input[name="documentid"]', this).get(0).value +
					',' +
					new DOMQuery('input[name="key"]', this).get(0).value +
					',' +
					new DOMQuery('input[name="libraryid"]', this).get(0).value +
					',,0]' +
					new DOMQuery('input[name="filename"]', this).get(0).value +
					'[/]\n';
		break;
		default:
			return;
	}
	window.opener.setCurrentTextarea(window);
	window.opener.putStr(rml);
	window.opener.focus();
	window.close();

	return false;
};
function documentSelector()
{
	var documentSelectors = new DOMQuery('div.document-selector'), input, image;

	for (var i = 0, container; (container=documentSelectors.get(i)); i++)
	{
		input = new DOMQuery('input[type=hidden]', container).get(0);
		image = new DOMQuery('img', container).get(0);

		container.appendChild(createDOMNode('ul', {}, []));

		if (!image || image.src != board_script_url + '/')
			documentSelectorActions(container);
		else if(image)
			image.parentNode.removeChild(image);

		addEventToTargets(null, 'mouseup', _documentSelector, 'li.select-document a');
		addEventToTargets(null, 'click', _documentSelector, 'li.select-document a');
	}
};

function _documentSelector(e)
{
	var li = getSiblingNode(this, 'up', 'li');
	var container = getSiblingNode(li, 'up', 'div');
	var input = new DOMQuery('input[type=hidden]', container).get(0);
	var image = new DOMQuery('img', container).get(0);
	var input_do = new DOMQuery('input#' + input.id + '-change').get(0);

	switch(li.className)
	{
		case 'add-document':
			documentWindow = window.open(
				board_script_url + '/insert_document?data[small]=1',
				'DocumentLibrary',
				'width=900, height=500, resizable=yes, scrollbars=yes'
			);
			doclibsOpened[ documentWindow ] = container;

			e.preventDefault();
		break;

		case 'select-document':
			documentWindow = window.open(
				board_script_url + '/list_documents?data[small]=1',
				'DocumentLibrary',
				'width=900, height=500, resizable=yes, scrollbars=yes'
			);
			doclibsOpened[ documentWindow ] = container;

			e.preventDefault();
		break;

		case 'delete-document':
			input.value = '';
			image.parentNode.removeChild(image);
			documentSelectorActions(container);

			/* Re-attach contentInLayer event after recreating selectorActions */
			contentInLayer(new DOMQuery('li.add-document a', container));

			e.preventDefault();
		break;
	}
	
	if(input_do)
		input_do.setAttribute('checked', 'checked');
};

function documentSelectorActions(container)
{
	var ul = new DOMQuery('ul', container).get(0);
	var input = new DOMQuery('input[type=hidden]', container).get(0);
	var image = new DOMQuery('img', container).get(0);

	if(!ul)
		return;

	while(ul.firstChild)
		ul.removeChild(ul.firstChild);

	if (image && image.getAttribute('src', 2) != '')
	{
		var editLink = createDOMNode(
			'li',
			{ 'class' : 'edit-document' },
			[
				createDOMNode(
					'a',
					{
						'href' : board_script_url + '/edit_document/' + input.value.split('/').shift(),
						'target' : '_blank',
						'event' : [ 'click', _documentSelector ]
					},
					[ getText('publish', 'edit_document') ]
				)
			]
		);

		var deleteLink = createDOMNode(
			'li',
			{ 'class' : 'delete-document' },
			[
				createDOMNode(
					'a',
					{
						'href' : 'javascript:void(0)',
						'class' : 'clickable',
						'event' : [ 'click', _documentSelector ]
					},
					[ getText('publish', 'remove_document') ]
				)
			]
		);

		ul.appendChild(editLink);
		ul.appendChild(deleteLink);
	}
	else
	{
		var addLink = createDOMNode(
			'li',
			{ 'class' : 'add-document' },
			[
				createDOMNode(
					'a',
					{
						'href' : board_script_url + '/insert_document',
						'rel' : 'layer[add-document]',
						'class' : input.name.replace(/[^a-z0-9]+/g, '_'),
						'event' : [ 'click', function() {
							var dsc = getSiblingNode(getSiblingNode(this, 'up', 'li'), 'up', 'div');
							doclibsOpened[ documentWindow ] =  dsc;
						}]
					},
					[ getText('publish', 'upload_document') ]
				)
			]
		);
		var selectLink = createDOMNode(
			'li',
			{ 'class' : 'select-document' },
			[
				createDOMNode(
					'a',
					{
						'href' : board_script_url + '/list_documents',
						'target' : '_blank',
						'event' : [ 'click', _documentSelector ]
					},
					[ getText('publish', 'add_document') ]
				)
			]
		);

		ul.appendChild(addLink);
		ul.appendChild(selectLink);
	}
};

function selectedDocument(document_id, popup_win)
{
	var container = doclibsOpened[ popup_win ];
	if(!container || container.tagName.toUpperCase() == 'TEXTAREA')
		return;
	
	var document_hash = popup_win.raw_documents[document_id][0].split('/');

	document_hash.pop();
	document_hash = document_hash.pop();
		
	var ul = new DOMQuery('ul', container).get(0);
	var input = new DOMQuery('input[type=hidden]', container).get(0);
	var image = new DOMQuery('img', container).get(0);
	var input_do = new DOMQuery('input#' + input.id + '-change').get(0);
	
	if(!image)
	{
		image = createDOMNode(
			'img',
			{
				'src' : board_script_url + '/download_document/' + document_id +'/'+ document_hash +'/document'
			},
			[ ]
		);

		ul.parentNode.insertBefore(image, ul);
	}
	else
		image.src = board_script_url + '/download_document/' + document_id +'/'+ document_hash +'/document';

	if(input_do)
		input_do.setAttribute('checked', 'checked');

	input.value = document_id +'/'+ document_hash;
	popup_win.close();

	documentSelectorActions(container);
};

if (typeof _contentInLayerCallback == 'function')
	var _contentInLayerCallbackOriginal = _contentInLayerCallback;

_contentInLayerCallback = function(invoker, id, rel)
{
	if(rel && rel.length) /* jaey, it's a layer */
	{
		switch (rel[1]) {
			case 'add-document':
				return {
					specificElement : 'form.primary-input'
				};
		}
	}

	return _contentInLayerCallbackOriginal.apply(this, arguments);
};
/*
	cssQuery, version 2.0 (2005/05/23)
	Copyright: 2004-2005, Dean Edwards (http://dean.edwards.name/)
	License: http://creativecommons.org/licenses/LGPL/2.1/
*/

function loadCssQuery()
{

	eval(function(p,a,c,k,e,d){e=function(c){return(c<a?"":e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1;};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p;}('8 C=6(){8 1H="2.0 (2S)";8 $2B=/\\s*,\\s*/;8 C=6($d,$$b){2T{8 $m=[];8 $1S=c.2Q.2A&&!$$b;8 $1K=($$b)?($$b.2R==2E)?$$b:[$$b]:[X];8 $$E=1o($d).22($2B),i;x(i=0;i<$$E.y;i++){$d=1C($$E[i]);9(16&&$d.S(0,3).2w("")==" *#"){$d=$d.S(2);$$b=26([],$1K,$d[1])}1I $$b=$1K;8 j=0,$U,$F,$c,$1a="";I(j<$d.y){$U=$d[j++];$F=$d[j++];$1a+=$U+$F;$c="";9($d[j]=="("){I($d[j++]!=")")$c+=$d[j];$c=$c.S(0,-1);$1a+="("+$c+")"}$$b=($1S&&19[$1a])?19[$1a]:2u($$b,$U,$F,$c);9($1S)19[$1a]=$$b}$m=$m.2N($$b)}1Y C.1m;7 $m}2P($1m){C.1m=$1m;7[]}};C.2i=6(){7"6 C() {\\n  [1H "+1H+"]\\n}"};8 19={};C.2A=P;C.33=6($d){9($d){$d=1C($d).2w("");1Y 19[$d]}1I 19={}};8 1P={};8 1X=P;C.1s=6($1b,$1q){9(1X)1n("$1q="+1i($1q));1P[$1b]=12 $1q()};C.30=6($Y){7 $Y?1n($Y):z};8 E={};8 v={};8 Z=[];E[" "]=6($l,$b,$q,$p){8 $5,i,j;x(i=0;i<$b.y;i++){8 $1r=1f($b[i],$q,$p);x(j=0;($5=$1r[j]);j++){9(O($5)&&1p($5,$p))$l.D($5)}}};E["#"]=6($l,$b,$H){8 $5,j;x(j=0;($5=$b[j]);j++)9($5.H==$H)$l.D($5)};E["."]=6($l,$b,$17){$17=12 1R("(^|\\\\s)"+$17+"(\\\\s|$)");8 $5,i;x(i=0;($5=$b[i]);i++)9($17.h($5.17))$l.D($5)};E[":"]=6($l,$b,$2y,$c){8 $h=v[$2y],$5,i;9($h)x(i=0;($5=$b[i]);i++)9($h($5,$c))$l.D($5)};v["2X"]=6($5){8 $X=V($5);9($X.1G)x(8 i=0;i<$X.1G.y;i++){9($X.1G[i]==$5)7 R}};v["35"]=6($5){};8 O=6($5){7($5&&$5.1Z==1&&$5.q!="!")?$5:2q};8 1l=6($5){I($5&&($5=$5.32)&&!O($5))2G;7 $5};8 K=6($5){I($5&&($5=$5.2U)&&!O($5))2G;7 $5};8 1L=6($5){7 O($5.2b)||K($5.2b)};8 2L=6($5){7 O($5.29)||1l($5.29)};8 15=6($5){8 $15=[];$5=1L($5);I($5){$15.D($5);$5=K($5)}7 $15};8 16=R;8 2z=6($5){7 V($5).31=="2V 2Y"};8 V=6($5){7 $5.2Z||$5.X};8 1f=6($5,$q){7($q=="*"&&$5.1J)?$5.1J:$5.1f($q)};8 1t=6($5,$q,$p){9($q=="*")7 O($5);9(!1p($5,$p))7 P;7 $5.q.28()==$q.28()};8 1p=6($5,$p){7!$p||($p=="*")||($5.2W==$p)};8 1V=6($5){7 $5.2K};6 26($l,$b,H){8 $m,i,j;x(i=0;i<$b.y;i++){9($m=$b[i].1J.34(H)){9($m.y==2q)$l.D($m);1I x(j=0;j<$m.y;j++)$l.D($m[j])}}7 $l};8 $1F=/\\|/;6 2u($$b,$U,$F,$c){9($1F.h($F)){$F=$F.22($1F);$c=$F[0];$F=$F[1]}8 $l=[];9(E[$U]){E[$U]($l,$$b,$F,$c)}7 $l};8 $2m=/^[^\\s>+~]/;8 $$2h=/[\\s#.:>+~()@]|[^\\s#.:>+~()@]+/g;6 1C($d){9($2m.h($d))$d=" "+$d;7 $d.m($$2h)||[]};8 $2g=/\\s*([\\s>+~(),]|^|$)\\s*/g;8 $2f=/([\\s>+~,]|[^(]\\+|^)([#.:@])/g;8 1o=6($d){7 $d.G($2g,"$1").G($2f,"$1*$2")};8 1Q={2i:6(){7"\'"},m:/^(\'[^\']*\')|("[^"]*")$/,h:6($u){7 z.m.h($u)},25:6($u){7 z.h($u)?$u:z+$u+z},2k:6($u){7 z.h($u)?$u.S(1,-1):$u}};8 1O=6($14){7 1Q.2k($14)};8 $2j=/([\\/()[\\]?{}|*+-])/g;6 10($u){7 $u.G($2j,"\\\\$1")};C.1s("1x-2a",6(){E[">"]=6($l,$b,$q,$p){8 $5,i,j;x(i=0;i<$b.y;i++){8 $1r=15($b[i]);x(j=0;($5=$1r[j]);j++)9(1t($5,$q,$p))$l.D($5)}};E["+"]=6($l,$b,$q,$p){x(8 i=0;i<$b.y;i++){8 $5=K($b[i]);9($5&&1t($5,$q,$p))$l.D($5)}};E["@"]=6($l,$b,$2l){8 $h=Z[$2l].h;8 $5,i;x(i=0;($5=$b[i]);i++)9($h($5))$l.D($5)};v["3s-1e"]=6($5){7!1l($5)};v["1B"]=6($5,$Y){$Y=12 1R("^"+$Y,"i");I($5&&!$5.1j("1B"))$5=$5.24;7 $5&&$Y.h($5.1j("1B"))};8 k={};k.1E="@";k.N={};k.m=/\\[([\\w-]+)\\s*(\\W?=)?\\s*([^\\]]*)\\]/g;k.G=6($m,$t,$2s,$A){8 $1y=k.1E+$m;9(!Z[$1y]){$t=k.2t($t,$2s||"",$A||"");Z[$1y]=$t;Z.D($t)}7 Z[$1y].H};k.2e=6($d){7 $d.G(z.m,z.G)};k.2t=6($1D,$h,$A){8 $1g={};$1g.H=k.1E+Z.y;$1g.1b=$1D;$h=z.N[$h];$h=$h?$h(k.1j($1D),1O($A)):P;$1g.h=12 2r("e","7 "+$h);7 $1g};k.1j=6($1b){1w($1b.3y()){B"H":7"e.H";B"3v":7"e.17";B"x":7"e.3x";B"27":9(16){7"1i((e.3n.m(/27=\\"?([^\\\\s\\"]*)\\"?/)||[])[1]||\'\')"}}7"e.1j(\'"+$1b+"\')"};z.k=k;k.N[""]=6($t){7 $t};k.N["="]=6($t,$A){7 $t+"=="+1Q.25($A)};k.N["~="]=6($t,$A){7"/(^|\\\\s)"+10($A)+"(\\\\s|$)/.h("+$t+")"};k.N["|="]=6($t,$A){7"/^"+10($A)+"(-|$)/.h("+$t+")"};8 2d=1o;1o=6($d){7 2d(k.2e($d))}});C.1s("1x-37",6(){8 1A=1P["1x-2a"];9(!1A)7;E["~"]=6($l,$b,$q,$p){8 $5,i;x(i=0;($5=$b[i]);i++){I($5=K($5)){9(1t($5,$q,$p))$l.D($5)}}};v["38"]=6($5,$14){$14=12 1R(10(1O($14)));7 $14.h(1V($5))};v["3k"]=6($5){7 $5==V($5).2J};v["3j"]=6($5){8 $M,i;x(i=0;($M=$5.2H[i]);i++){9(O($M)||$M.1Z==3)7 P}7 R};v["2v-1e"]=6($5){7!K($5)};v["3m-1e"]=6($5){$5=$5.24;7 1L($5)==2L($5)};v["3l"]=6($5,$d){8 $1N=C($d,V($5));x(8 i=0;i<$1N.y;i++){9($1N[i]==$5)7 P}7 R};v["2x-1e"]=6($5,$c){7 1z($5,$c,1l)};v["2x-2v-1e"]=6($5,$c){7 1z($5,$c,K)};v["3i"]=6($5){7 $5.H==3c.3b.S(1)};v["2F"]=6($5){7 $5.2F};v["3A"]=6($5){7 $5.1M===P};v["1M"]=6($5){7 $5.1M};v["2D"]=6($5){7 $5.2D};8 k=1A.k;k.N["^="]=6($t,$A){7"/^"+10($A)+"/.h("+$t+")"};k.N["$="]=6($t,$A){7"/"+10($A)+"$/.h("+$t+")"};k.N["*="]=6($t,$A){7"/"+10($A)+"/.h("+$t+")"};6 1z($5,$c,$1u){1w($c){B"n":7 R;B"3r":$c="2n";Q;B"3p":$c="2n+1"}8 $$23=15($5.24);6 1T($13){8 $13=($1u==K)?$$23.y-$13:$13-1;7 $$23[$13]==$5};9(!1d($c))7 1T($c);$c=$c.22("n");8 $T=2C($c[0]);8 $L=2C($c[1]);9((1d($T)||$T==1)&&$L==0)7 R;9($T==0&&!1d($L))7 1T($L);9(1d($L))$L=0;8 $1h=1;I($5=$1u($5))$1h++;9(1d($T)||$T==1)7($1u==K)?($1h<=$L):($L>=$1h);7($1h%$T)==$L}});C.1s("1x-3t",6(){16=1n("P;/*@3o@9(@\\3q)16=R@39@*/");9(!16){1f=6($5,$q,$p){7 $p?$5.3h("*",$q):$5.1f($q)};1p=6($5,$p){7!$p||($p=="*")||($5.3f==$p)};2z=X.2I?6($5){7/3g/i.h(V($5).2I)}:6($5){7 V($5).2J.q!="3e"};1V=6($5){7 $5.1k||$5.2K||20($5)};6 20($5){8 $1k="",$M,i;x(i=0;($M=$5.2H[i]);i++){1w($M.1Z){B 11:B 1:$1k+=20($M);Q;B 3:$1k+=$M.36;Q}}7 $1k}}});12 6(){8 $$18=6($6,$2c,$c){$6.18($2c,$c)};9(\'\'.G(/^/,1i)){8 2o=1i.1U.G;8 2p=6($1v,$1c){8 $m,$1W="",$u=z;I($u&&($m=$1v.3d($u))){$1W+=$u.S(0,$m.13)+$$18($1c,z,$m);$u=$u.S($m.3a)}7 $1W+$u};1i.1U.G=6($1v,$1c){z.G=(3w $1c=="6")?2p:2o;7 z.G($1v,$1c)}}9(!2r.18){8 J="18-"+3z(12 3u);$$18=6(f,o,a){8 r;o[J]=f;1w(a.y){B 0:r=o[J]();Q;B 1:r=o[J](a[0]);Q;B 2:r=o[J](a[0],a[1]);Q;B 3:r=o[J](a[0],a[1],a[2]);Q;B 4:r=o[J](a[0],a[1],a[2],a[3]);Q;2M:8 21=[],i=a.y-1;2O 21[i]="a["+i+"]";I(i--);1n("r=o[J]("+21+")")}1Y o[J];7 r}}9(![].D)2E.1U.D=6(){x(8 i=0;i<c.y;i++){z[z.y]=c[i]}7 z.y}};1X=R;7 C}();',62,223,'|||||element|function|return|var|if||from|arguments|selector||||test|||AttributeSelector|results|match|||namespace|tagName|||attribute|string|pseudoClasses||for|length|this|value|case|cssQuery|push|selectors|filter|replace|id|while|APPLY|nextElementSibling|step|node|tests|thisElement|false|break|true|slice|multiplier|token|getDocument||document|code|attributeSelectors|regEscape||new|index|text|childElements|isMSIE|className|apply|cache|cacheSelector|name|replacement|isNaN|child|getElementsByTagName|attributeSelector|count|String|getAttribute|textContent|previousElementSibling|error|eval|parseSelector|compareNamespace|script|subset|addModule|compareTagName|traverse|expression|switch|css|key|nthChild|css2|lang|_toStream|propertyName|PREFIX|NAMESPACE|links|version|else|all|base|firstElementChild|disabled|negated|getText|modules|Quote|RegExp|useCache|_checkIndex|prototype|getTextContent|newString|loaded|delete|nodeType|_getTextContent|aa|split|children|parentNode|add|_msie_selectById|href|toUpperCase|lastChild|level2|firstChild|object|_parseSelector|parse|IMPLIED_ALL|WHITESPACE|STREAM|toString|ESCAPE|remove|attributeSelectorID|STANDARD_SELECT||_stringReplace|_functionReplace|null|Function|compare|create|select|last|join|nth|pseudoClass|isXML|caching|COMMA|parseInt|indeterminate|Array|checked|continue|childNodes|contentType|documentElement|innerText|lastElementChild|default|concat|do|catch|callee|constructor|beta|try|nextSibling|XML|scopeName|link|Document|ownerDocument|valueOf|mimeType|previousSibling|clearCache|item|visited|nodeValue|level3|contains|end|lastIndex|hash|location|exec|HTML|prefix|xml|getElementsByTagNameNS|target|empty|root|not|only|outerHTML|cc_on|odd|x5fwin32|even|first|standard|Date|class|typeof|htmlFor|toLowerCase|Number|enabled'.split('|'),0,{}));
	window.cssQuery = cssQuery;
}

var texts = [];

texts['doclib'] = [];
texts['doclib']['insert_as']			= 'Invoegen als';
texts['doclib']['insert_as_image']		= 'afbeelding';
texts['doclib']['insert_as_text']		= 'tekst';
texts['doclib']['insert_as_link']		= 'Link';
texts['doclib']['insert_as_thumb']		= 'Link thumbnail naar origineel';
texts['doclib']['format']				= 'Formaat';
texts['doclib']['original']				= 'Origineel';
texts['doclib']['outline']				= 'Uitlijning';
texts['doclib']['none']					= 'Geen';
texts['doclib']['left']					= 'Links';
texts['doclib']['right']				= 'Rechts';
texts['doclib']['insert']				= 'Invoegen';
texts['doclib']['insert_image']			= 'Afbeelding invoegen';
texts['doclib']['not_implemented']		= 'Nog niet mogelijk';

texts['forms'] = [];
texts['forms']['marked_fields']			= 'Velden gemarkeerd met een ';
texts['forms']['required']				= ' zijn verplicht';
texts['forms']['hide_advanced']			= 'Uitgebreide mogelijkheden verbergen';
texts['forms']['show_advanced']			= 'Uitgebreide mogelijkheden weergeven';
texts['forms']['max_chars']				= 'Je mag hier maximaal %s karakters gebruiken';
texts['forms']['name_too_short']		= 'Deze gebruikersnaam is te kort';
texts['forms']['email_incorrect']		= 'Dit emailadres is incorrect';
texts['forms']['url_incorrect']			= 'Deze URL is incorrect';
texts['forms']['numeric_only']			= 'Dit veld kan alleen getallen bevatten';
texts['forms']['required_field']		= 'Dit veld is verplicht';
texts['forms']['required_field.query_input']= 'Dit veld is verplicht bij sortering op relevantie';
texts['forms']['password_no_match']		= 'De ingevoerde wachtwoorden komen niet overeen.';
texts['forms']['username_taken']		= 'Deze gebruikersnaam is al in gebruik.';
texts['forms']['invalid_domain']		= 'Dit domein mag niet op dit forum gebruikt worden. Kies svp een ander email-adres.';
texts['forms']['email_taken']			= 'Dit email-adres is al in gebruik.';
texts['forms']['select_all_rows']		= 'Selecteer alle rijen';
texts['forms']['select_messages']		= 'Klik op één of meerdere berichten om deze te selecteren. Klik vervolgens op Verstuur om ze daadwerkelijk te verwijderen.';
texts['forms']['username']				= 'Gebruikersnaam';
texts['forms']['password']				= 'Wachtwoord';
texts['forms']['bankaccount_mismatch']	= 'Dit is geen geldig bankrekeningnummer';
texts['forms']['dutch_bankaccount_mismatch']	= 'Dit is geen geldig nederlands bankrekeningnummer';
texts['forms']['sofinummer_mismatch']	= 'Dit getal voldoet niet aan de 11-proef, sofinummer ongeldig.';
texts['forms']['zipcode_mismatch']		= 'Dit is geen geldige postcode.';
texts['forms']['length_not_9']			= 'Dit veld moet precies 9 karakters bevatten.';
texts['forms']['show_advanced_options']	= 'Toon uitgebreide opties.';
texts['forms']['hide_advanced_options']	= 'Verberg uitgebreide opties.';
texts['forms']['keyword_too_long']		= 'Sleutelwoord `%s` is te lang, gebruik maximaal 50 karakters';
texts['forms']['keywords_illegal_character']	= 'Sleutelwoord `%s` bevat ongeldige karakters; gebruik enkel a-z, 0-9 en - of _';
texts['forms']['max_entries_reached']	= 'Je mag maximaal %s stuks opgeven';
texts['forms']['cant_send_to_yourself']	= 'Je kan geen prive-bericht naar jezelf sturen';
texts['forms']['filename_too_long']		= 'De bestandsnaam overschrijdt de limiet van 60 karakters';
texts['forms']['filename_invalid']		= 'De bestandsnaam bevat ongeldige karakters';
texts['forms']['extension_invalid']		= 'De extensie is ongeldig';

texts['imagewizard'] = [];
texts['imagewizard']['sizes_error']		= 'error :: original sizes of sourcefile not found';

texts['normal'] = [];
texts['normal']['disabled_option']		= 'Deze optie is niet mogelijk.';
texts['normal']['more']					= 'Meer...';
texts['normal']['search_webkit']		= 'Zoek binnen dit forum...';
texts['normal']['back']					= 'Terug';

texts['xmlhttp'] = [];
texts['xmlhttp']['close']				= 'Sluit';
texts['xmlhttp']['form_already_exists']	= 'Er is al een formulier op het scherm voor.\nWilt u deze vervangen?';

texts['extra'] = [];
texts['extra']['searchPopup']			= 'Zoek...';
texts['extra']['close_and_submit']		= 'Sluit & verstuur';
texts['extra']['accesskey_indicator']	= '(%s)';
texts['extra']['click_to_enlarge']		= ' - klik om te vergroten';
texts['extra']['enter_page_number']		= 'Geef een paginanummer tussen 1 en %s';
texts['extra']['page_number_incorrect']	= 'U heeft geen geldig paginanummer opgegeven.';
texts['extra']['show_gallery']			= 'Toon alle afbeeldingen in dit onderwerp';
texts['extra']['show_gallery_header']	= 'Alle afbeeldingen in dit onderwerp';

texts['toolbar'] = [];
texts['toolbar']['enter_img_url']		= 'Geef de URL van de afbeelding op:';
texts['toolbar']['enter_url']			= 'Geef de URL op:';
texts['toolbar']['enter_title']			= 'Geef optioneel een titel:';

texts['toolbar']['hline'] = '';
texts['toolbar']['bold'] = 'Maak tekst vetgedrukt';
texts['toolbar']['italic'] = 'Maak tekst schuingedrukt';
texts['toolbar']['underline'] = 'Maak tekst onderstreept';
texts['toolbar']['strike'] = 'Streep tekst door';
texts['toolbar']['sup'] = 'Plaats tekst hoger';
texts['toolbar']['sub'] = 'Plaats tekst lager';
texts['toolbar']['align_left'] = 'Lijn tekst links uit';
texts['toolbar']['align_center'] = 'Lijn tekst in het midden uit';
texts['toolbar']['align_right'] = 'Lijn tekst rechts uit';
texts['toolbar']['align_justify'] = 'Vul tekst uit';
texts['toolbar']['list_bullet'] = 'Maak een lijst';
texts['toolbar']['list_num'] = 'Maak een genummerde lijst';
texts['toolbar']['color_bg'] = 'Wijzig de achtergrondkleur';
texts['toolbar']['color_fg'] = 'Wijzig de tekstkleur';
texts['toolbar']['link'] = 'Voeg een link toe';
texts['toolbar']['image'] = 'Voeg een afbeelding toe';
texts['toolbar']['table'] = 'Voeg een tabel toe';
texts['toolbar']['hr'] = 'Voeg een horizontale streep toe';
texts['toolbar']['maximize'] = 'Vergroot het invoerveld';
texts['toolbar']['documentlibrary'] = 'Open de documentenbibliotheek';
texts['toolbar']['smileys'] = 'Kies een smiley';
texts['toolbar']['youtube'] = 'Plaats YouTube filmpje';
texts['toolbar']['youtube_link'] = 'Link naar YouTube filmpje';

texts['calendar'] = [];
texts['calendar']['calendarevent'] = 'Afspraken';
texts['calendar']['calendareventallday'] = 'Dagafspraken';
texts['calendar']['topicstart'] = 'Onderwerpen';
texts['calendar']['topicevent'] = 'Topicstarts';
texts['calendar']['birthday'] = 'Verjaardagen';

texts['colorpicker'] = [];
texts['colorpicker']['select_color'] = 'Gebruik de geselecteerde kleur';
texts['publish'] = [];
texts['publish']['edit_document'] 			= 'Wijzig bestand';
texts['publish']['remove_document'] 		= 'Geen bestand';
texts['publish']['upload_document']			= 'Upload bestand';
texts['publish']['add_document']			= 'Kies bestand';
if(navigator.userAgent.indexOf('MSIE') != -1)
	var newline = "\r\n";
else
	var newline = "\n";

/* Translations */
texts['dashboard'] = [];
texts['dashboard']['cancel'] = 'dashboard inklappen';
texts['dashboard']['username_taken'] = 'Gebruikersnaam is al in gebruik!';
texts['dashboard']['username_available'] = 'Gebruikersnaam is beschikbaar!';
texts['dashboard']['username_no_match'] = 'Gebruikersnaam bevat niet toegestane karakters!';
texts['dashboard']['email_taken'] = 'E-mailadres is al in gebruik!';
texts['dashboard']['email_available'] = 'E-mailadres is beschikbaar!';
texts['dashboard']['forumname_taken'] = 'Clubnaam is al in gebruik!';
texts['dashboard']['forumname_available'] = 'Clubnaam is beschikbaar!';

texts['forms']['confirm_role_owner'] = 'Weet je zeker dat je deze gebruiker beheerder wilt maken?';
texts['forms']['confirm_role_member'] = 'Weet je zeker dat je deze gebruiker volger wilt maken?';
texts['forms']['select_user'] = 'Selecteer 1 persoon om de nieuwe beheerder te worden';

texts['publish']['remove_document'] = 'Verwijder de afbeelding bij je blog';
texts['publish']['upload_document']	= 'Upload een afbeelding bij je blog';

/* Default form field values */
var default_field_values = {
	'data[q]' : 'trefwoorden',
	'data[community_name]' : 'Typ hier een naam',
	'data[community_description]' : 'Typ hier een korte omschrijving over jouw club',
	'data[biography]' : 'Vertel iets over jezelf, dingen die je leuk vindt om te doen, onderwerpen waar je eindeloos over kunt kletsen, alle dromen die je hebt. Of gewoon wat je in het dagelijks leven doet...',
	'data[sender_email]' : 'mijn.email@voorbeeld.nl',
	'data[receiver_email][]' : 'vriendin@voorbeeld.nl',
	'data[personal_text]' : 'Typ hier je extra tekst...',
	'data[name]' : 'Typ hier een titel',
	'data[nickname]' : ' ', /* IE quickfix */
	'data[content]' : 'Typ hier je bericht',
	'data[intro]' : 'Typ hier een korte introductie',
	'data[signature]' : 'Je kunt in je handtekening de volgende tags gebruiken: ' + newline + '[img] = afbeelding toevoegen ' + newline + '[url=] = link toevoegen ' + newline + '[b] = bold maken'
};

var fieldName, default_field_values_query = [];

for(fieldName in default_field_values)
{
	if(navigator.userAgent.indexOf('MSIE') != -1) // _init has not been called yet and thus isIE doesn't exist
	{
		var name = fieldName.replace(/\[\]/, '');
		name = /data\[(.+)\]/.exec(name);
		
		if(!name)
			continue;

		fieldName = name[1];
		default_field_values_query.push('input[name*="' + fieldName + '"],textarea[name*="' + fieldName + '"]');
	}
	else
	{
		default_field_values_query.push('input[name="' + fieldName + '"],textarea[name="' + fieldName + '"]');
	}
}

default_field_values_query = default_field_values_query.join(',');
/*	Unobtrusive Flash Objects (UFO) v3.20 <http://www.bobbyvandersluis.com/ufo/>
	Copyright 2005, 2006 Bobby van der Sluis
	This software is licensed under the CC-GNU LGPL <http://creativecommons.org/licenses/LGPL/2.1/>
*/

var UFO = {
	req: ["movie", "width", "height", "majorversion", "build"],
	opt: ["play", "loop", "menu", "quality", "scale", "salign", "wmode", "bgcolor", "base", "flashvars", "devicefont", "allowscriptaccess", "seamlesstabbing", "allowfullscreen"],
	optAtt: ["id", "name", "align"],
	optExc: ["swliveconnect"],
	ximovie: "ufo.swf",
	xiwidth: "215",
	xiheight: "138",
	ua: navigator.userAgent.toLowerCase(),
	pluginType: "",
	fv: [0,0],
	foList: [],

	create: function(FO, id) {
		if (!UFO.uaHas("w3cdom") || UFO.uaHas("ieMac")) return;
		UFO.getFlashVersion();
		UFO.foList[id] = UFO.updateFO(FO);
		UFO.createCSS("#" + id, "visibility:hidden;");
		UFO.domLoad(id);
	},

	updateFO: function(FO) {
		if (typeof FO.xi != "undefined" && FO.xi == "true") {
			if (typeof FO.ximovie == "undefined") FO.ximovie = UFO.ximovie;
			if (typeof FO.xiwidth == "undefined") FO.xiwidth = UFO.xiwidth;
			if (typeof FO.xiheight == "undefined") FO.xiheight = UFO.xiheight;
		}
		FO.mainCalled = false;
		return FO;
	},

	domLoad: function(id) {
		var _t = setInterval(function() {
			if ((document.getElementsByTagName("body")[0] != null || document.body != null) && document.getElementById(id) != null) {
				UFO.main(id);
				clearInterval(_t);
			}
		}, 250);
		if (typeof document.addEventListener != "undefined") {
			document.addEventListener("DOMContentLoaded", function() { UFO.main(id); clearInterval(_t); } , null); // Gecko, Opera 9+
		}
	},

	main: function(id) {
		var _fo = UFO.foList[id];
		if (_fo.mainCalled) return;
		UFO.foList[id].mainCalled = true;
		document.getElementById(id).style.visibility = "hidden";
		if (UFO.hasRequired(id)) {
			if (UFO.hasFlashVersion(parseInt(_fo.majorversion, 10), parseInt(_fo.build, 10))) {
				if (typeof _fo.setcontainercss != "undefined" && _fo.setcontainercss == "true") UFO.setContainerCSS(id);
				UFO.writeSWF(id);
			}
			else if (_fo.xi == "true" && UFO.hasFlashVersion(6, 65)) {
				UFO.createDialog(id);
			}
		}
		document.getElementById(id).style.visibility = "visible";
	},

	createCSS: function(selector, declaration) {
		var _h = document.getElementsByTagName("head")[0];
		var _s = UFO.createElement("style");
		if (!UFO.uaHas("ieWin")) _s.appendChild(document.createTextNode(selector + " {" + declaration + "}")); // bugs in IE/Win
		_s.setAttribute("type", "text/css");
		_s.setAttribute("media", "screen");
		_h.appendChild(_s);
		if (UFO.uaHas("ieWin") && document.styleSheets && document.styleSheets.length > 0) {
			var _ls = document.styleSheets[document.styleSheets.length - 1];
			if (typeof _ls.addRule == "object") _ls.addRule(selector, declaration);
		}
	},

	setContainerCSS: function(id) {
		var _fo = UFO.foList[id];
		var _w = /%/.test(_fo.width) ? "" : "px";
		var _h = /%/.test(_fo.height) ? "" : "px";
		UFO.createCSS("#" + id, "width:" + _fo.width + _w +"; height:" + _fo.height + _h +";");
		if (_fo.width == "100%") {
			UFO.createCSS("body", "margin-left:0; margin-right:0; padding-left:0; padding-right:0;");
		}
		if (_fo.height == "100%") {
			UFO.createCSS("html", "height:100%; overflow:hidden;");
			UFO.createCSS("body", "margin-top:0; margin-bottom:0; padding-top:0; padding-bottom:0; height:100%;");
		}
	},

	createElement: function(el) {
		return (UFO.uaHas("xml") && typeof document.createElementNS != "undefined") ?  document.createElementNS("http://www.w3.org/1999/xhtml", el) : document.createElement(el);
	},

	createObjParam: function(el, aName, aValue) {
		var _p = UFO.createElement("param");
		_p.setAttribute("name", aName);
		_p.setAttribute("value", aValue);
		el.appendChild(_p);
	},

	uaHas: function(ft) {
		var _u = UFO.ua;
		switch(ft) {
			case "w3cdom":
				return (typeof document.getElementById != "undefined" && typeof document.getElementsByTagName != "undefined" && (typeof document.createElement != "undefined" || typeof document.createElementNS != "undefined"));
			case "xml":
				var _m = document.getElementsByTagName("meta");
				var _l = _m.length;
				for (var i = 0; i < _l; i++) {
					if (/content-type/i.test(_m[i].getAttribute("http-equiv")) && /xml/i.test(_m[i].getAttribute("content"))) return true;
				}
				return false;
			case "ieMac":
				return /msie/.test(_u) && !/opera/.test(_u) && /mac/.test(_u);
			case "ieWin":
				return /msie/.test(_u) && !/opera/.test(_u) && /win/.test(_u);
			case "gecko":
				return /gecko/.test(_u) && !/applewebkit/.test(_u);
			case "opera":
				return /opera/.test(_u);
			case "safari":
				return /applewebkit/.test(_u);
			default:
				return false;
		}
	},

	getFlashVersion: function() {
		if (UFO.fv[0] != 0) return;
		if (navigator.plugins && typeof navigator.plugins["Shockwave Flash"] == "object") {
			UFO.pluginType = "npapi";
			var _d = navigator.plugins["Shockwave Flash"].description;
			if (typeof _d != "undefined") {
				_d = _d.replace(/^.*\s+(\S+\s+\S+$)/, "$1");
				var _m = parseInt(_d.replace(/^(.*)\..*$/, "$1"), 10);
				var _r = /r/.test(_d) ? parseInt(_d.replace(/^.*r(.*)$/, "$1"), 10) : 0;
				UFO.fv = [_m, _r];
			}
		}
		else if (window.ActiveXObject) {
			UFO.pluginType = "ax";
			try { // avoid fp 6 crashes
				var _a = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");
			}
			catch(e) {
				try {
					var _a = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");
					UFO.fv = [6, 0];
					_a.AllowScriptAccess = "always"; // throws if fp < 6.47
				}
				catch(e) {
					if (UFO.fv[0] == 6) return;
				}
				try {
					var _a = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
				}
				catch(e) {}
			}
			if (typeof _a == "object") {
				var _d = _a.GetVariable("$version"); // bugs in fp 6.21/6.23
				if (typeof _d != "undefined") {
					_d = _d.replace(/^\S+\s+(.*)$/, "$1").split(",");
					UFO.fv = [parseInt(_d[0], 10), parseInt(_d[2], 10)];
				}
			}
		}
	},

	hasRequired: function(id) {
		var _l = UFO.req.length;
		for (var i = 0; i < _l; i++) {
			if (typeof UFO.foList[id][UFO.req[i]] == "undefined") return false;
		}
		return true;
	},

	hasFlashVersion: function(major, release) {
		return (UFO.fv[0] > major || (UFO.fv[0] == major && UFO.fv[1] >= release)) ? true : false;
	},

	writeSWF: function(id) {
		var _fo = UFO.foList[id];
		var _e = document.getElementById(id);
		if (UFO.pluginType == "npapi") {
			if (UFO.uaHas("gecko") || UFO.uaHas("xml")) {
				while(_e.hasChildNodes()) {
					_e.removeChild(_e.firstChild);
				}
				var _obj = UFO.createElement("object");
				_obj.setAttribute("type", "application/x-shockwave-flash");
				_obj.setAttribute("data", _fo.movie);
				_obj.setAttribute("width", _fo.width);
				_obj.setAttribute("height", _fo.height);
				var _l = UFO.optAtt.length;
				for (var i = 0; i < _l; i++) {
					if (typeof _fo[UFO.optAtt[i]] != "undefined") _obj.setAttribute(UFO.optAtt[i], _fo[UFO.optAtt[i]]);
				}
				var _o = UFO.opt.concat(UFO.optExc);
				var _l = _o.length;
				for (var i = 0; i < _l; i++) {
					if (typeof _fo[_o[i]] != "undefined") UFO.createObjParam(_obj, _o[i], _fo[_o[i]]);
				}
				_e.appendChild(_obj);
			}
			else {
				var _emb = "";
				var _o = UFO.opt.concat(UFO.optAtt).concat(UFO.optExc);
				var _l = _o.length;
				for (var i = 0; i < _l; i++) {
					if (typeof _fo[_o[i]] != "undefined") _emb += ' ' + _o[i] + '="' + _fo[_o[i]] + '"';
				}
				_e.innerHTML = '<embed type="application/x-shockwave-flash" src="' + _fo.movie + '" width="' + _fo.width + '" height="' + _fo.height + '" pluginspage="http://www.macromedia.com/go/getflashplayer"' + _emb + '></embed>';
			}
		}
		else if (UFO.pluginType == "ax") {
			var _objAtt = "";
			var _l = UFO.optAtt.length;
			for (var i = 0; i < _l; i++) {
				if (typeof _fo[UFO.optAtt[i]] != "undefined") _objAtt += ' ' + UFO.optAtt[i] + '="' + _fo[UFO.optAtt[i]] + '"';
			}
			var _objPar = "";
			var _l = UFO.opt.length;
			for (var i = 0; i < _l; i++) {
				if (typeof _fo[UFO.opt[i]] != "undefined") _objPar += '<param name="' + UFO.opt[i] + '" value="' + _fo[UFO.opt[i]] + '" />';
			}
			var _p = window.location.protocol == "https:" ? "https:" : "http:";
			_e.innerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"' + _objAtt + ' width="' + _fo.width + '" height="' + _fo.height + '" codebase="' + _p + '//download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=' + _fo.majorversion + ',0,' + _fo.build + ',0"><param name="movie" value="' + _fo.movie + '" />' + _objPar + '</object>';
		}
	},

	createDialog: function(id) {
		var _fo = UFO.foList[id];
		UFO.createCSS("html", "height:100%; overflow:hidden;");
		UFO.createCSS("body", "height:100%; overflow:hidden;");
		UFO.createCSS("#xi-con", "position:absolute; left:0; top:0; z-index:1000; width:100%; height:100%; background-color:#fff; filter:alpha(opacity:75); opacity:0.75;");
		UFO.createCSS("#xi-dia", "position:absolute; left:50%; top:50%; margin-left: -" + Math.round(parseInt(_fo.xiwidth, 10) / 2) + "px; margin-top: -" + Math.round(parseInt(_fo.xiheight, 10) / 2) + "px; width:" + _fo.xiwidth + "px; height:" + _fo.xiheight + "px;");
		var _b = document.getElementsByTagName("body")[0];
		var _c = UFO.createElement("div");
		_c.setAttribute("id", "xi-con");
		var _d = UFO.createElement("div");
		_d.setAttribute("id", "xi-dia");
		_c.appendChild(_d);
		_b.appendChild(_c);
		var _mmu = window.location;
		if (UFO.uaHas("xml") && UFO.uaHas("safari")) {
			var _mmd = document.getElementsByTagName("title")[0].firstChild.nodeValue = document.getElementsByTagName("title")[0].firstChild.nodeValue.slice(0, 47) + " - Flash Player Installation";
		}
		else {
			var _mmd = document.title = document.title.slice(0, 47) + " - Flash Player Installation";
		}
		var _mmp = UFO.pluginType == "ax" ? "ActiveX" : "PlugIn";
		var _uc = typeof _fo.xiurlcancel != "undefined" ? "&xiUrlCancel=" + _fo.xiurlcancel : "";
		var _uf = typeof _fo.xiurlfailed != "undefined" ? "&xiUrlFailed=" + _fo.xiurlfailed : "";
		UFO.foList["xi-dia"] = { movie:_fo.ximovie, width:_fo.xiwidth, height:_fo.xiheight, majorversion:"6", build:"65", flashvars:"MMredirectURL=" + _mmu + "&MMplayerType=" + _mmp + "&MMdoctitle=" + _mmd + _uc + _uf };
		UFO.writeSWF("xi-dia");
	},

	expressInstallCallback: function() {
		var _b = document.getElementsByTagName("body")[0];
		var _c = document.getElementById("xi-con");
		_b.removeChild(_c);
		UFO.createCSS("body", "height:auto; overflow:auto;");
		UFO.createCSS("html", "height:auto; overflow:auto;");
	},

	cleanupIELeaks: function() {
		var _o = document.getElementsByTagName("object");
		var _l = _o.length
		for (var i = 0; i < _l; i++) {
			_o[i].style.display = "none";
			for (var x in _o[i]) {
				if (typeof _o[i][x] == "function") {
					_o[i][x] = null;
				}
			}
		}
	}

};

if (typeof window.attachEvent != "undefined" && UFO.uaHas("ieWin")) {
	window.attachEvent("onunload", UFO.cleanupIELeaks);
}

maxImageWidth = 419;
maxImageHeight = 419;

var rml_buttons = Array('bold', 'italic', 'underline', 'strike','hline',
						/*'sup', 'sub','hline',*/
						'align_left', 'align_center', 'align_right','hline',
						'list_bullet', 'list_num','hline',
						'color_bg','color_fg','hline',
						'link', 'image','hline',
						'table', 'hr','hline',
						'maximize', 'documentlibrary');

function rateItem(targets)
{
	addEventToTargets(targets, 'click', _rateItem, 'div.block-type-rating ul a');
}

function _rateItem(e)
{
	var rating = this.href;
	var block = this;

	rating = rating.split('/').reverse();

	if(rating[2])
	{
		var request = 'data[reactid]=' + getCookie('ReactID') + '&data[rate]=' + rating[0] + '&data[id]=' + rating[1] + '&data[type]=' + rating[2];
		httpreq_string(request, null, board_script_url + '/rate', false);

		while(!block.id && block.tagName != 'div' && block.tagName != 'html')
			block = block.parentNode;

		new Ajax.Request(board_script_url + '/get_block/'+block.id.split('-')[1], {
			postBody : 'data[rating_type]=' + rating[2] + '&data[rating_id]=' + rating[1],
			onComplete : function(transport)
			{
				block.innerHTML = transport.responseText.replace(/^<div [^>]+>(.*)<\/div><hr \/>$/, '$1');
				_init(events, block);
			}
		});

		e.preventDefault();
	}
}

function attachBlocks(blockId)
{
	var cleanupAttached = false;
	if(blockId && typeof(blockid) == 'string')
	{
		var blocks = new DOMQuery('div#' + blockId);
	}
	else
	{
		var blocks = new DOMQuery('div.block');
		cleanupAttached = true;
	}

	if(cleanupAttached)
	{
		/*
			If we're doing a global attach-blocks, remove all 'attached' classes first.
			This way it's possible to recall attachBlocks from block-editor without the layout falling apart.

			yes, this requires 2 loops over blocks, but if we do so within one loop, and the block following
			a div.attach-next-block has 'attach-next-block' even though no block follows, it loses
			'attached' which it shouldn't.
		*/

		for(var i = 0, block; (block=blocks.get(i)); i++)
			jscss('remove', block, 'attached');
	}

	for(var i = 0, block; (block=blocks.get(i)); i++)
	{
		if(!jscss('check', block, 'attach-next-block'))
			continue;

		/* Tag first block below this one as attached */
		var offset_left = block.offsetLeft;
		var offset_top = block.offsetTop;
		var attached = false;
		var nextBlock;
		for(var j=1; (nextBlock = blocks.get(i + j)); j++)
		{
			/* only consider 'lower' blocks */
			if(nextBlock.offsetTop < offset_top)
				continue;

			if(nextBlock.offsetLeft == offset_left || nextBlock.offsetLeft == offset_left - 1)
			{
				jscss('add', nextBlock, 'attached');
				attached = true;
				break;
			}
		}

		/* If no blocks are found to attach, remove class to fix layout */
		if(!attached)
		{
			jscss('remove', block, 'attach-next-block');
		}
	}
};

function emulateEllipsis(targets)
{
	if(isIE)
		return;

	if(!targets)
		var targets = 'div.block > h2';

	var headings = new DOMQuery(targets);
	var average_char_width = 8;

	for(var i = 0, heading; (heading = headings.get(i)); i++)
	{
		if(heading.firstChild.length * average_char_width > heading.clientWidth)
			heading.firstChild.nodeValue = 	heading.firstChild.nodeValue.substr(0, (heading.clientWidth / average_char_width)) + '...';
	}
}

function fixBrowserIssuesSite()
{
	if(isIE)
	{
		addClassToTargets('div#action-header ol li:last-child, div#action-footer ol li:last-child, ul#navigation-2 li:last-child, ul#footer li:last-child, ul.archive-navigation li:last-child', 'last-child');

		if(isNotIE7)
		{
			addClassToTargets('div.block:first-child', 'block-first-child');
			addClassToTargets('div#action-header ol li:first-child', 'first-child');
			addClassToTargets('a[rel=more]', 'more');
			addClassToTargets('input[type=radio]', 'radio');
			addClassToTargets('a[rel=edit]', 'editlink');

			/* create combined classnames from multiple classes */
			var classes = [
				'block-type-show-topic.limit-1',
				'block.attached',
				'block.attached.block-type-show-topic.limit-1'
			];

			for(var i=0; i < classes.length;i++)
				addClassToTargets('div.' + classes[i], classes[i].replace(/\./g, '-'));

			var adminLinks = new DOMQuery('ul#admin-links').get(0);
			if(adminLinks)
				adminLinks.parentNode.insertBefore(createDOMNode('div', {'style' : 'clear: both;'}, ''), adminLinks.nextSibling);
		}

		/* todo: conditionally create this div */
		var overlay = createDOMNode('div', {'id' : 'iefix-overlay', 'style' : 'height: ' + document.body.clientHeight, 'title' : 'Klik om terug te gaan'}, '');
		addEvent( overlay, 'click',
			function()
			{
 				if( jscss('check', document.body, 'inline-admin') )
				{
					document.body.removeChild(new DOMQuery('iframe.inline-admin').get(0));
					jscss('remove', document.body, 'inline-admin');
				}
 			});
		document.body.appendChild(overlay);
	}
};

function readonlyKeywords()
{
	if(['list_messages', 'list_message', 'insert_topic'].indexOf(board_action) == -1)
		return;

	var editLink = new DOMQuery('ul#admin-links li.edit-blocks a').get(0);
	if(editLink)
		return;

	var fields = new DOMQuery('input#keywords_content, input#keywords_content, input#keywords');

	for(var i=0, field; (field = fields.get(i)); i++)
	{
		if(isIE)
		{
			/* use createAttribute in IE instead of setAttribute */
			var ro = document.createAttribute('readonly');
			ro.value = 'readonly';
			field.setAttributeNode(ro);
		}
		else
		{
			field.setAttribute('readonly', 'readonly');
		}
	}
}
function fixBrowserIssuesFlair()
{
	if(isIE && !isIE8)
	{
		/* Relocate 'required' stars @ forms */
		var items = new DOMQuery('dt.required span.required');
		
		for(var i = 0, item;(item=items.get(i));i++)
			item.parentNode.insertBefore(item, item.previousSibling);
	}
};

/**
 * Rapapa
 **/
function beautifyBlocks(targets)
{
	if(!isIE || isIE7 || isIE8)
		return;

	if(!targets)
		var borders = new DOMQuery('div.border'); /* look for 'div.border' instead of 'div.block div.border' to prevent scoping problems after xmlhttprequest */
	else
		var borders = targets;

	for(var i = 0, border, block, h2; (border = borders.get(i)); i++)
	{
		block = getSiblingNode(border, 'up', 'div');

		/* Fix border width and height */
		if(jscss('check', border, 'border-left') || jscss('check', border, 'border-right'))
			border.style.height = block.clientHeight + 'px';
		else if(jscss('check', border, 'border-top') || jscss('check', border, 'border-bottom'))
			border.style.width = block.clientWidth + 'px';

		/* If positioned absolute, fix header width */
		if(jscss('check', block, 'absolute-header'))
		{
			h2 = new DOMQuery('h2', block).get(0);

			if(h2)
				h2.style.width = block.clientWidth + 'px';
		}
	}
};

/*
 * Don't annoy users with vertical scrollbar just to show (non functional) bird,
 * show scrollbar only if viewport width < 1015px
 */
function toggleOverflow()
{
	addEvent(window, 'resize', _toggleOverflow);
	addEvent(window, 'load', _toggleOverflow);
};

function _toggleOverflow()
{
	if(document.documentElement.clientWidth < 1015)
		document.documentElement.style.overflowX = 'scroll';
	else
		document.documentElement.style.overflowX = 'hidden';
};

function printPage(targets)
{
	addEventToTargets(targets, 'click', function() { window.print(); }, 'li.message-print span');
};

function makeFlairBlocksEditable()
{
	var editLink = new DOMQuery('ul#admin-links li.edit-blocks a').get(0);

	if(!editLink)
		return;

	addEvent(editLink, 'click', _makeFlairBlocksEditable);

	if(getCookie('edit_blocks') == '1' && editLink)
		_makeFlairBlocksEditable.call();
};

function _makeFlairBlocksEditable(e)
{
	if(e)
		e.preventDefault();

	var blocks = new DOMQuery('div.' + editable_blocktypes.join(', div.'));

	var block, blockId, editLink;
	var editable = true;

	jscss('toggle', new DOMQuery('ul#admin-links li.edit-blocks a').get(0), 'active');

	for(var i = 0, block; (block=blocks.get(i)); i++)
	{
		if(editLink = new DOMQuery('ul.block-actions', block).get(0))
		{
			editLink.parentNode.removeChild(editLink);
			editable = false;
		}
		else
		{
			blockId = block.id.match(/block\-([0-9]+)/i);
			if(!blockId)
				continue;

			blockId = blockId[1];

			blockActions = createDOMNode(
				'ul',
				{ 'class' : 'block-actions' },
				[
					createDOMNode(
						'li',
						{ 'class' : 'editlink' },
						[
							createDOMNode(
								'a',
								{
									'href' : board_adminscript_url + '?action=update_block&data%5Bstep%5D=2&data%5Bblock_id%5D=' + blockId,
									'rel' : 'edit',
									'title' : 'Blok aanpassen'
								},
								['Blok aanpassen']
							)
						]
					),
				]
			);

			block.appendChild(blockActions);
		}
	}

	if(editable)
		setCookie('edit_blocks', '1');
	else
		setCookie('edit_blocks', '0');
};

/*
 * Submenus work with css-only hovers, but we'll ad a nice timeout for javascript-enabled browsers
 */
function subMenus()
{
	addEventToTargets(null, 'mouseover', function()
	{
		var items = new DOMQuery('li.showing-submenu', this.parentNode);

		for(var i = 0, item; (item = items.get(i)); i++)
			jscss('remove', item, 'showing-submenu');		

		clearTimeout(this.getAttribute('__timer'));
		
		jscss('add', this, 'showing-submenu');

		beautifyBlocks(new DOMQuery('div.border', this));

	}, 'ul#navigation-site li.has-submenu');
	
	addEventToTargets(null, 'mouseout', function() 
	{
		var element = this;
		var timer = setTimeout(function() { jscss('remove', element, 'showing-submenu') }, 250);
		element.setAttribute('__timer', timer);
	}, 'ul#navigation-site li.has-submenu');	
};

/*
 * Open links with rel="external" in new window
 */
function popupLinks()
{
	var links = new DOMQuery('a[rel="external"]');
	
	if(!links)
		return;
		
	for(var i = 0, link; (link = links.get(i)); i++)
		link.setAttribute('target', '_new');
};

/*
 * Register clicks from header and footer menu's
 */
function trackMenus()
{
	addEventToTargets(null, 'click', function() { registerHit(this, 'header-menu'); }, 'ul#navigation-site li a');
	addEventToTargets(null, 'click', function() { registerHit(this, 'footer'); }, 'div#page-sitemap ul li a, ul#footer li a');
};

function registerHit(element, type)
{
	if(!element.href || typeof pageTracker != 'object')
		return;

	if(element.hostname != document.location.hostname)
		type = 'external';

	if(type == 'external')
		var path = '/' + element.href;
	else
		var path = element.href.replace(element.protocol + '//' + element.hostname, '');

	/* Find out if link is placed in submenu and if so, which submenu */
	var li = element;
	
	while(li && !jscss('check', li, 'has-submenu'))
		li = getSiblingNode(li, 'up', 'li');
		
	if(li)
		type += '/submenu-' + li.className.match(/nav-([a-z0-9-_]+)/i)[1];

	pageTracker._trackPageview('/' + type + path);
};
var blockGroups = {
	'page-content' : 'content',
	'sidebar' : 'sidebar'
};
var blockGroupsArray = ['page-content', 'sidebar'];

function makeBlocksEditable(targets)
{
	var adminLinks = new DOMQuery('ul#admin-links').get(0);
	var editLink = 'ul#admin-links li.edit-blocks a';

	if(!adminLinks)
		return false;

	layoutChanges = false;
	orderChanges = false;
	blockLayoutsCurrent = new Array();
	blockLayoutsNew = new Array();
	blockLayoutsChanged = new Array();
	saveButton = createDOMNode('li', {'class' : 'save'}, [
				createDOMNode('a', {'title' : 'Save layout options', 'href' : 'javascript:;', 'event' : ['click', savePage]}, ['Save'])
	]);

	adminLinks.insertBefore(saveButton, adminLinks.firstChild);
	addEventToTargets(targets, 'click', _makeBlocksEditable, editLink);
	addEvent(window, 'unload', checkBlockChanges);

	if(getCookie('edit_blocks') == '1' && new DOMQuery(editLink).get(0))
		_makeBlocksEditable();
}


function _makeBlocksEditable(e)
{
	if(e)
		e.preventDefault();

	var blocks = new DOMQuery('div.block[id]');
	var block, blockId, editLink;
	var editable = true;

	jscss('toggle', new DOMQuery('ul#admin-links li.edit-blocks a').get(0), 'active');

	for(var i = 0, block; (block=blocks.get(i)); i++)
	{
		if(editLink = new DOMQuery('ul.block-actions', block).get(0))
		{
			editLink.parentNode.removeChild(editLink);
			editable = false;
		}
		else
		{
			blockId = block.id.match(/block\-([0-9]+)/i);
			if(!blockId)
				continue;

			blockId = blockId[1];

			blockActions = createDOMNode(
				'ul',
				{ 'class' : 'block-actions' },
				[
					createDOMNode(
						'li',
						{ 'class' : 'editlink' },
						[
							createDOMNode(
								'a',
								{
									'href' : board_adminscript_url + '?action=update_block&data%5Bblock_id%5D=' + blockId,
									'rel' : 'edit',
									'title' : 'Blok aanpassen'/*,
									'event': ['click', blockBackend]*/
								},
								['Blok aanpassen']
							)
						]
					),
					createDOMNode(
						'li',
						{ 'class' : 'layout-menu-link' },
						[
							createDOMNode(
								'a',
								{
									'href' : '#',
									'rel' : 'edit',
									'title' : 'Layout aanpassen',
									'event' : ['click', blockLayoutMenu]
								},
								['Layout']
							)
						]
					)
				]
			);

			block.appendChild(blockActions);
		}
	}

	if(editable)
	{
		makeBlocksSortable();
		setCookie('edit_blocks', '1');
	}
	else
	{
		for(i in blockGroups)
		{
			try
			{
				Sortable.destroy(i);
			}
			catch (e)
			{
				;
			}
		}

		setCookie('edit_blocks', '0');
	}
}

function blockBackend(e)
{
	e.preventDefault();

	var element = $(this).up('div.block');
	this.title = 'Annuleren';

	if (jscss('check', document.body, 'inline-admin'))
	{
		document.body.removeChild(new DOMQuery('iframe.inline-admin').get(0));

		if (!isIE)
			do
			{
				jscss('remove', element, 'highlight');
				element = element.parentNode;
			}
			while(element);

		jscss('remove', document.body, 'inline-admin');
		this.title = 'Blok aanpassen';

		return;
	}

	var inlineAdmin = createDOMNode('iframe', { 'src' : this.href, 'class' : 'inline-admin'}, []);

	document.body.appendChild(inlineAdmin);

	if (!isIE)
		do
		{
			jscss('add', element, 'highlight');
			element = element.parentNode;
		}
		while(element);

	jscss('add', document.body, 'inline-admin');

	return;
}

function blocksToString(container, groupName)
{
	var blocks = new DOMQuery(container + ' div.block');
	var waa = new Array();
	var groupName = groupName || 'content';

	if(blocks.length > 0)
		for(var i = 0, block; (block = blocks.get(i)); i++)
			waa[i] = block.id.split('-')[1];

	return groupName + ':' + waa + ';';
}

function makeBlocksSortable()
{
	for(i in blockGroups)
		if(new DOMQuery('#' + i).get(0))
			Sortable.create(i, {ghosting:false, tag:'div', only:'block', constraint:'', hoverclass:'hover', dropOnEmpty:true, containment:blockGroupsArray, onUpdate:sortablesOnUpdate });
}

function updateBlockOrder()
{
	var ps = '';

	for(i in blockGroups)
		ps += blocksToString('div#' + i, blockGroups[i]);

	var req = httpreq_string('action=xml_update_blockorder&data[block_order]=' + ps, null, board_adminscript_url, null, 'POST');

	req.onreadystatechange = function()
	{
		if (req.readyState != 4)
			return;

		jscss('remove', saveButton, 'busy');
		jscss('add', saveButton, 'done');
		orderChanges = false;
	}
}

function blockLayoutMenu(e)
{
	if(!jscss('check', e, 'block'))
	{
		e = e || fixEvent(e);
		e.preventDefault();
		var element = $(this).up('div.block');
	}
	else
		var element = e;

	var menu = new DOMQuery('div.layout-menu', element).get(0);
	var blockID = element.id.match(/block\-([0-9]+)/i)[1];

	if (menu != null)
	{
		if (jscss('check', menu, 'open'))
			Effect.BlindUp(menu, {duration : .5});
		else
			Effect.BlindDown(menu, {duration : .5});

		jscss('toggle', menu, 'open');
		return;
	}

	var menu = createDOMNode('div', { 'class' : 'layout-menu open', 'style' : 'display: none' }, [ createDOMNode('h3', {}, ['Layout opties']) ] );
	element.insertBefore(menu, element.firstChild);

	var req = httpreq_string('action=xml_get_layouts&data[block_id]=' + blockID, null, board_adminscript_url, true, 'GET');

	req.onreadystatechange = function()
	{
		if (req.readyState != 4)
			return;

		if (req.responseText == '')
			return;

		eval('var layoutOptions = ' + req.responseText);

		var currentLayout = element.className.split(' ').slice(2); // skip block & blocktype class

		var optionChecked = false;
		var ul = createDOMNode('ul', '', '');
		var li, input;
		for (var i=0; i < layoutOptions.length; i++)
		{
			optionChecked = false;

			if (typeof blockLayoutsCurrent[blockID] == 'undefined')
				blockLayoutsCurrent[blockID] = new Array();

			if (currentLayout.indexOf(layoutOptions[i]) != -1)
			{
				optionChecked = true;
				blockLayoutsCurrent[blockID].push(layoutOptions[i]);
			}

			input = createDOMNode('input', {'type' : 'checkbox', 'value' : layoutOptions[i], 'event' : ['click',
					function()
					{
						if (this.checked == true)
						{
							jscss('add', element, this.value);

						}
						else
						{
							jscss('remove', element, this.value);
						}

						jscss('remove', saveButton, 'done');

						checkLayoutChanges(blockID);
					}]
				}, ''
			);

			if (optionChecked == true)
				input.defaultChecked = true;

			switch(layoutOptions[i])
			{
				case 'show-topic-image':
					//addEvent(input, 'click', refreshBlock);
				break;
				case 'attach-next-block':
					addEvent(input, 'click', attachBlocks);
				break;
			}


			li = createDOMNode('li', '', [createDOMNode('label', '', [input, layoutOptions[i]]) ]);
			ul.appendChild(li);
		}

		menu.appendChild(ul);
		Effect.BlindDown(menu, {duration : .5});

	}
}

function layoutMenuIE6Fix(element)
{
	// used @ vrouw
	if(isIE && isNotIE7)
	{
		var bottomDiv = new DOMQuery('div.bottom', element).get(0);

		// Recalculate
		alert(bottomDiv);
		bottomDiv.style.display = 'none';
		bottomDiv.style.display = 'block';
	}
}

function updateBlockLayouts()
{
	if (layoutChanges == false)
		return;

	var layouts = '';

	for (var i = 0, len = blockLayoutsChanged.length; i < len; i++)
	{
		var blockID = blockLayoutsChanged[i];
		layouts += blockID + ':' + blockLayoutsNew[blockID].toString() +  ';';
	}

	blockLayoutsRequest = httpreq_string('action=xml_save_layouts&data[layouts]=' + layouts, null, board_adminscript_url, true);
}

function sortablesOnUpdate()
{
	orderChanges = true;
	jscss('remove', saveButton, 'done');

	checkEmptyGroups();
}

function checkEmptyGroups()
{
	var group, blocks;

	for(i in blockGroups)
	{
		if (!(group = new DOMQuery('div#' + i).get(0)))
			continue;

		blocks = new DOMQuery('div.block', group);

		if(blocks.length == 0)
			jscss('add', group, 'empty');
		else
			jscss('remove', group, 'empty');
	}
}

function checkLayoutChanges(blockID)
{
	if (typeof blockID == 'undefined')
		return false;

	if (typeof blockLayoutsChanged != 'undefined')
		blockLayoutsChanged = blockLayoutsChanged.without(blockID);

	layoutChanges = false;
	blockLayoutsNew[blockID] = new Array();
	var layouts = new DOMQuery('div#block-' + blockID + ' input[type=checkbox]');

	for (var i = 0, layout; (layout = layouts.get(i)); i++)
		if (layout.checked)
			blockLayoutsNew[blockID].push(layout.value);

	if (blockLayoutsNew[blockID].length == blockLayoutsNew[blockID].length)
		for (var i = 0; i < layouts.length; i++)
		{
			if (blockLayoutsNew[blockID][i] != blockLayoutsCurrent[blockID][i])
			{
				layoutChanges = true;
				blockLayoutsChanged.push(blockID);
				break;
			}
		}
	else
	{
		layoutChanges = true;
		blockLayoutsChanged.push(blockID);
	}

	if (blockLayoutsChanged.length > 0)
		layoutChanges = true;
	else
		layoutChanges = false;
}

function checkBlockChanges()
{
	if (layoutChanges == false && orderChanges == false)
		return;

	if (confirm('Save changes?'))
		savePage();
}

function savePage(e)
{
	jscss('add', saveButton, 'busy');

	if (orderChanges == true)
		updateBlockOrder();

	if (layoutChanges == true)
	{
		updateBlockLayouts();
		jscss('add', saveButton, 'busy');

		if (typeof e != 'undefined') // if savebutton is used
			blockLayoutsRequest.onreadystatechange = function()
			{
				if( blockLayoutsRequest.readyState != 4 )
					return;

				refreshBlocks();
				jscss('remove', saveButton, 'busy');
				jscss('add', saveButton, 'done');
			}
	}

	layoutChanges = false;
	orderChanges = false;
}

function refreshBlocks()
{
	if (blockLayoutsChanged.length == 0)
		return false;

	var blockID = blockLayoutsChanged.shift();
	var req = httpreq_string('action=xml_get_block&data[block_id]=' + blockID, null, board_adminscript_url, true, 'GET');

	req.onreadystatechange = function()
	{
		if (req.readyState != 4)
			return;

		var block = document.getElementById('block-' + blockID);
		var layoutMenu = new DOMQuery('div.layout-menu', block).get(0);
		var blockActions = new DOMQuery('ul.block-actions', block).get(0);
		var div = document.createElement('div');
		div.innerHTML = req.responseText;
		var updatedBlock = div.getElementsByTagName('div')[0];
		updatedBlock.insertBefore(layoutMenu, updatedBlock.firstChild);
		updatedBlock.appendChild(blockActions);
		block.parentNode.replaceChild(updatedBlock, block);

		if( blockLayoutsChanged.length == 0 )
			makeBlocksSortable();
	}

	refreshBlocks();
};
function _documentSelector(e)
{
	var li = getSiblingNode(this, 'up', 'li');
	var container = getSiblingNode(li, 'up', 'div');
	var input = new DOMQuery('input[type=hidden]', container).get(0);
	var image = new DOMQuery('img', container).get(0);
	var input_do = new DOMQuery('input#' + input.id + '-change').get(0);

	switch(li.className)
	{
		case 'add-document':
			documentWindow = window.open(
				board_script_url + '/insert_document?data[small]=1',
				'DocumentLibrary',
				'width=900, height=500, resizable=yes, scrollbars=yes'
			);
			window.lastUsedDocumentSelectorContainer = container;

			e.preventDefault();
		break;

		case 'select-document':
			documentWindow = window.open(
				board_script_url + '/list_documents?data[small]=1',
				'DocumentLibrary',
				'width=900, height=500, resizable=yes, scrollbars=yes'
			);
			window.lastUsedDocumentSelectorContainer = container;

			e.preventDefault();
		break;

		case 'delete-document':
			input.value = '';
			image.parentNode.removeChild(image);
			documentSelectorActions(container);

			/* Re-attach contentInLayer event after recreating selectorActions */
			contentInLayer(new DOMQuery('li.add-document a', container));

			e.preventDefault();
		break;
	}
	
	if(input_do)
		input_do.setAttribute('checked', 'checked');
};

function documentSelectorActions(container)
{
	var ul = new DOMQuery('ul', container).get(0);
	var input = new DOMQuery('input[type=hidden]', container).get(0);
	var image = new DOMQuery('img', container).get(0);

	if(!ul)
		return;

	while(ul.firstChild)
		ul.removeChild(ul.firstChild);

	if (image && image.getAttribute('src', 2) != '')
	{
		var editLink = createDOMNode(
			'li',
			{ 'class' : 'edit-document' },
			[
				createDOMNode(
					'a',
					{
						'href' : board_script_url + '/edit_document/' + input.value.split('/').shift(),
						'target' : '_blank',
						'event' : [ 'click', _documentSelector ]
					},
					[ getText('publish', 'edit_document') ]
				)
			]
		);

		var deleteLink = createDOMNode(
			'li',
			{ 'class' : 'delete-document' },
			[
				createDOMNode(
					'a',
					{
						'href' : 'javascript:void(0)',
						'class' : 'clickable',
						'event' : [ 'click', _documentSelector ]
					},
					[ getText('publish', 'remove_document') ]
				)
			]
		);

		ul.appendChild(editLink);
		ul.appendChild(deleteLink);
	}
	else
	{
		var addLink = createDOMNode(
			'li',
			{ 'class' : 'add-document' },
			[
				createDOMNode(
					'a',
					{
						'href' : board_script_url + '/insert_document',
						'rel' : 'layer[add-document]',
						'class' : input.name.replace(/[^a-z0-9]+/g, '_'),
						'event' : [ 'click', function() {
							var dsc = getSiblingNode(getSiblingNode(this, 'up', 'li'), 'up', 'div');
							window.lastUsedDocumentSelectorContainer = dsc;
						}]
					},
					[ getText('publish', 'upload_document') ]
				)
			]
		);
		var selectLink = createDOMNode(
			'li',
			{ 'class' : 'select-document' },
			[
				createDOMNode(
					'a',
					{
						'href' : board_script_url + '/list_documents',
						'target' : '_blank',
						'event' : [ 'click', _documentSelector ]
					},
					[ getText('publish', 'add_document') ]
				)
			]
		);

		ul.appendChild(addLink);
		ul.appendChild(selectLink);
	}
};

function selectedDocument(document_id, popup_win)
{
	var document_hash = popup_win.raw_documents[document_id][0].split('/');

	document_hash.pop();
	document_hash = document_hash.pop();

	var container = window.lastUsedDocumentSelectorContainer;
	var ul = new DOMQuery('ul', container).get(0);
	var input = new DOMQuery('input[type=hidden]', container).get(0);
	var image = new DOMQuery('img', container).get(0);
	var input_do = new DOMQuery('input#' + input.id + '-change').get(0);
	
	if(!image)
	{
		image = createDOMNode(
			'img',
			{
				'src' : board_script_url + '/download_document/' + document_id +'/'+ document_hash +'/document'
			},
			[ ]
		);

		ul.parentNode.insertBefore(image, ul);
	}
	else
		image.src = board_script_url + '/download_document/' + document_id +'/'+ document_hash +'/document';

	if(input_do)
		input_do.setAttribute('checked', 'checked');

	input.value = document_id +'/'+ document_hash;
	popup_win.close();

	documentSelectorActions(container);
};

var rml_buttons = [
	'bold', 'italic', 'underline', 'strike','hline',
	/*'sup', 'sub','hline',*/
	'align_left','align_center','align_right','align_justify','hline',
	'list_bullet', 'list_num','hline',
	/*'color_bg', */'color_fg','hline',
	'link', 'image', 'youtube', 'hline',
	'table', /*'hr',*/'hline',
	'maximize', /*'documentlibrary',*/ 'smileys'
];

var maxImageWidth = 500;
var maxImageHeight = 500;

var events = [ ];

var editable_blocktypes = [
	'block-type-poll',
	'block-type-static',
	'block-type-communities-etalage',
	'block-type-iframe',
	'block-type-google-ads',
	'block-type-sub-menu',
	'block-type-show-document',
	'block-type-react-action'
];

events.push(
	fixBrowserIssues,
	fixBrowserIssuesFlair,
	subMenus,
	toggleOverflow,
	quickSearchTargets,
	toggleAuthorLinks,
	popupLinks,
	focusFirstFormField,
	selectTags,
	shoutThruXMLHttp,
	validateForms,
	fieldMaximumCharacters,
	beautifyBlocks,
	defaultFieldValues,
	rewriteQuoteLinks,
	loginForm,
	doclibInteraction,
	documentSelector,
	toggleChangeCheckboxTopicAdmin,
	scaleImages,
	[toggleVisibility, [
		'h3#insert-message-poll + fieldset,' +
		'form#form-frontend-admin h3[id] + fieldset,' +
		'h3[id] + dl.property-list,' +
		'tr[id].category-name td,' +
		'div.extra-actions ul li#forum-tagcloud,' +
		'div.discussion-folders ul.folders li[id]'
	]],
	selectAllRows,
	contentInLayer,
	toggleNotifications,
	openOnloadLightbox,
	trackMenus,
	syncUserIcon,
	autocomplete,
	scrollToAnchor,
	selectSelectedTopicAdmin,
	[transparantPNG, ['img.smiley, div.block-type-community-links h2, div.block.block-with-decoration div.decoration']],
	insertMultipleDocuments,
	findForm,
	printPage,
	[externalLinksInPopup, ['a[href]']],
	makeFlairBlocksEditable,
	handleManageForumUsers
);

if(typeof board_fck_editor_enabled != 'undefined' && board_fck_editor_enabled)
	events.push(fckEditor);
else
{
	events.push([attachRMLToolbar, ['div#page-content-wide textarea#rml_textarea']]);
	events.push(makeSmileysClickable);
}

/* FCK config */
var fck_config = {
	'SmileyColumns' : 13,
	'SmileyWindowWidth' : 500,
	'SmileyWindowHeight' : 100
};

/* FCK config */
var fck_config = {
	'SmileyColumns' : 13,
	'SmileyWindowWidth' : 500,
	'SmileyWindowHeight' : 100,
	'Width' : 410,
	'Height' : 250
};

