/* 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';
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)
{
	var advancedOptions = getTargets(targets, 'dt.advanced-option');

	if(forms_show_advanced_options)
	{
		jscss('add', document.body, 'show-advanced-options', '');
	}
	else if(advancedOptions.length > 0)
	{
		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 > 0)
				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(/#(.+)$/, '');
			}
			else
			{
				item.setAttribute('action', item.getAttribute('action').replace(/#(.+)$/, '') );
			}

			if(i > 0)
				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 validateMaxLength()
{
	// Sjon: uitgeschakelt na overleg met Michiel; dit voldoet niet voldoende
	return false;

	if(this.tagName.toLowerCase() == 'input' && typeof this.maxLength != 'undefined' && this.maxLength > 0)
	{
		if(this.value.length == this.maxLength)
		{
			alertUser(this, getText('forms', 'max_chars', this.maxLength));
		}
		else
		{
			unAlertUser(this);
		}
	}
};

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');

		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');

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

			fields.get(0).focus();
		}
	}

	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':
			empty = !field.checked;
			break;
		default:
			empty = (field.value == '' ? true : false);
			break;
	}

	if(!empty)
	{
		switch(board_action)
		{
			case 'create_user':
			case 'edit_user':
				switch(field.id)
				{
					case 'pwd2':
						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', ''))
				{
					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;
					}
				}

				switch(field.id)
				{
					case 'keywords':
						/*reg = /[^\w0-9_\-.]/;*/
						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 = reg.test(value);
							if(res)
							{
								alertUser(field, getText('forms', 'keywords_illegal_character', value));
								return true;
							}*/
						}
					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(field.parentNode, '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]).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)
	{
		alertUser(field, getText('forms', 'required_field'));
	}
	else if (empty && !isRequired)
	{
		return false;
	}

	if (ret)
		return empty;
};

function alertUser(inputfield, str)
{
	var ddInputField = inputfield.parentNode;
	var ddErrorMsg   = getSiblingNode(inputfield.parentNode, 'next', 'dd');
	var dtFieldName  = getSiblingNode(inputfield.parentNode, '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(isIE && isNotIE7 && (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 = inputfield.parentNode;
	var ddErrorMsg   = getSiblingNode(inputfield.parentNode, 'next', 'dd');
	var dtFieldName  = getSiblingNode(inputfield.parentNode, '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').get(0);

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


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'), item;

	for(var i = 0, item; (item=calendarSelectors.get(i));i++)
	{
		if(item.id != '')
		{
			Calendar.setup({
				inputField			:		item.id,
				ifFormat			:		"%d-%m-%Y",
				showsTime			:		false,
				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);
												}
											}
			});
		}
	}
};

function selectAllRows(targets)
{
	var checkboxes = getTargets(targets, 'div#content form table input[TYPE="checkbox"]');

	if(checkboxes.length == 0)
		return;

	var tablefooter = new DOMQuery("div#content form tfoot").get(0);

	var tr = createDOMNode('tr', {"class" :'footer-form'},
	[
		createDOMNode('td', {"class" :'select'},
		[
			createDOMNode('input', {"type" :'checkbox', "id" :'selectAllRows', "name" :'selectAllRows', "event" : (isIE ? ['click', _selectAllRows] : ['change', _selectAllRows]) }, [])
		]),
		createDOMNode('td', {"colSpan" :5},
		[
			createDOMNode('label', {'for' : 'selectAllRows'}, [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()
{
	var topicAdmin = new DOMQuery("div#topic-admin").get(0);

	if(!topicAdmin)
		return;

	var selects = new DOMQuery('select[selected]', topicAdmin);

	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;

	var items = new DOMQuery('input[type="text"], textarea, select', topicAdmin);

	for(var i = 0, item; (item=items.get(i));i++)
	{
		addEvent(item, 'change', _toggleChangeCheckboxTopicAdmin);
	}

	var input = new DOMQuery("input#delmessages").get(0);
	if(input)
	{
		addEvent(input, 'change', selectMessagesForDeletion);
	}

	input = new DOMQuery("input#splitmessages").get(0);
	if(input)
	{
		addEvent(input, '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'));
};
