// JavaScript Document

function formChecker(forms)
{
	if( typeof(forms) != 'undefined' )
	{
		forms = forms.split(',');
		for (i=0;i<forms.length;i++)
		{
			forms[i] = document.forms[ forms[i] ];
		}
	}
	else
	{
		forms = document.forms;
	}
	
	var i = 0;
	for(i=0;i<forms.length;i++)
	{
		attachCheckerToForm(forms[i]);
		checkForm(forms[i]);
	}
}

function attachCheckerToForm(form)
{
	var el = null;
	var tag = '';
	var type = '';
	if (form.getAttribute('mwnocheck')=='true') return;
	form.onsubmit = mw_formsubmit;
	for (var i = 0;i<form.elements.length;i++)
	{
		el = form.elements[ i ];
		if (el.getAttribute('mwnocheck')!='true' && el.getAttribute('mwformat'))
		{
		// attach dynamic value checking
			el.mw_check = mw_check;
			el.mw_notok = mw_notok;
			el.mw_req = mw_req;
			el.mw_ok = mw_ok;
			el.mw_louderror = mw_louderror;
			tag = el.tagName;
			if (tag == 'INPUT')
				type = el.getAttribute('type');
			else
				type = tag;
			type = type.toLowerCase();
			if (!type||type=='radio'||type=='hidden'||type=='button'||type=='submit'||type=='reset')
				continue;
			if (type=='text'||type=='textbox'||type=='textarea'||type=='select'||type=='password')
				el.onkeyup = el.mw_check;
			if (type=='select')
				el.onchange = el.mw_check;
		}
		else
			el.setAttribute('mwnocheck','true');
	}
}

function mw_formsubmit(event)
{
	//__debugObj(event);
	errormode = 'loud';
	var ret = checkForm(this);
	errormode = 'silent';
	return ret;
}

function checkForm(form)
{
	var ok = true;
	var el = null;
	if (form.getAttribute('mwnocheck')!='true')
	{
		for (var i=0;i<form.elements.length;i++)
		{
			el = form.elements[i];
			if (el.getAttribute('mwformat') && el.getAttribute('mwnocheck')!='true')
			{
				if (!el.mw_check())
				{
					if (errormode!='silent')
					// only alert once in loud mode!
					{
						el.focus();
						return false;
					}
					ok = false;
				}
			}
		}
	}
	return ok;
}

function mw_check()
{
	var element = this;
	var format = element.getAttribute('mwformat');
	var val = element.value;
	var req = element.getAttribute('mwreq');
	
	if (req=='true' && (val.length==0 || (element.type=='checkbox' && !element.checked)) )
	{
		element.mw_req();
		return false;
	}
	
	if (val.length>0 && !(ok = checkValue(val,format)) ) {
		element.mw_notok();
	}
	else
	{
		element.mw_ok();
		return true;
	}
}

function mw_req()
{
	if (this.type != 'checkbox')
		this.className = mwfc_styles['req'];
	this.mw_louderror( mwfc_err['required'] );
}

function mw_louderror(msg)
{
	var format = this.getAttribute('mwformat');
	var myar = format.split('~');
	format = myar[0];
	if (!msg)
		msg = mwfc_err[ format ];
	
	var label = this.getAttribute('mwlabel');
	
	if (errormode != 'silent')
	{
		if (msg)
		{
			msg = msg.replace('%mwlabel%',label);
			for (var i=1;i<myar.length;i++)
			{
				msg = msg.replace('%param'+i+'%',myar[i]);
			}
			alert(msg);
		}
	}
}

function checkValue(val,format)
{
	if (!format) return true;
	var myar = format.split('~');
	var rx = '';
	var matches = null;
	var ok = null;
	format = myar[0]; // first element is format type
	rx = mwfc_formats[ format ];
	if (!rx)
	{
		alert("Unknown format: "+format);
		return false;
	}
	for (i=1;i<myar.length;i++) // following elements are params...
	{
		rx = rx.replace('%param'+i+'%',myar[i]);
	}
	matches = val.match(rx);
	var ok = matches && (matches[0] == val);
	return ok;
}

function mw_ok()
{
	if (this.type != 'checkbox')
		this.className = mwfc_styles['ok'];
}

function mw_notok()
{
	if (this.type != 'checkbox')
		this.className = mwfc_styles['notok'];
	this.mw_louderror();
}

function __debugObj(obj)
{
	if (obj)
	{
		for (var i in obj)
		{
			alert('obj->'+i+'='+obj[i]);
		}
	}
	else
		alert('false / null / undefined');
}

var errormode = 'silent';

var mwfc_formats = new Array();
mwfc_formats['email'] = '([\\w\\.-]+@([\\w-]+\\.)+\\w{2,4})'; // email address. valid: studer@meisterwerk.net, studer@mail.meisterwerk.net
mwfc_formats['url'] = '(http://|https://)([\\w-]+\\.)+\\w{2,4}(/(.)*)?';
mwfc_formats['string'] = '.+';
mwfc_formats['stringexact'] = '.{%param1%}';
mwfc_formats['stringmin'] = '.{%param1%,}';
mwfc_formats['stringrange'] = '.{%param1%,%param2%}';
mwfc_formats['custom'] = '%param1%';
mwfc_formats['date2'] = '\\d\\d\.\\d\\d\\.\\d\\d';
mwfc_formats['date4'] = '\\d\\d\.\\d\\d\\.\\d\\d\\d\\d';
mwfc_formats['number'] = '\\d+';
mwfc_formats['float'] = '(\\d+([,\\.]+\\d+)?)';
mwfc_formats['ipv4'] = '(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})';


var mwfc_err = new Array();
mwfc_err['required'] = "Beim Feld '%mwlabel%' handelt es sich um ein Pflichtfeld.";
mwfc_err['stringmin'] = "Ihre Eingabe im Feld '%mwlabel%' muss mindestens %param1% Zeichen enthalten.";
mwfc_err['stringexact'] = "Ihre Eingabe im Feld '%mwlabel%' muss genau %param1% Zeichen enthalten.";
mwfc_err['stringrange'] = "Ihre Eingabe im Feld '%mwlabel%' muss zwischen %param1% und %param2% Zeichen enthalten.";
mwfc_err['number'] = "Bitte geben Sie eine ganze Zahl für das Feld '%mwlabel%' ein.";
mwfc_err['float'] = "Bitte geben Sie eine Zahl für das Feld '%mwlabel%' ein.";
mwfc_err['date4'] = "Bitte geben Sie ein gültiges Datum für das Feld '%mwlabel%' ein (Format: TT.MM.JJJJ)";
mwfc_err['email'] = "Bitte geben Sie eine gültige E-Mail-Adresse für das Feld '%mwlabel%' ein (Format: ihrname@domain.ch)";
mwfc_err['url'] = "Bitte geben Sie eine gültige Internetadresse für das Feld '%mwlabel%' ein (Format: http://www.domain.com/pfad/...)";

var mwfc_styles = new Array();
mwfc_styles['ok'] = 'mwfc-ok';
mwfc_styles['notok'] = 'mwfc-notok';
mwfc_styles['req'] = 'mwfc-req';