// save as Unicode with Signature

// version 0.2.11

// DO NOT CHANGE THIS FILE IN OTHER DIRECTORIES THAN Projekte\Samples
// DO NOT CHANGE THIS FILE IN OTHER DIRECTORIES THAN Projekte\Samples
// DO NOT CHANGE THIS FILE IN OTHER DIRECTORIES THAN Projekte\Samples
// DO NOT CHANGE THIS FILE IN OTHER DIRECTORIES THAN Projekte\Samples
// DO NOT CHANGE THIS FILE IN OTHER DIRECTORIES THAN Projekte\Samples
// DO NOT CHANGE THIS FILE IN OTHER DIRECTORIES THAN Projekte\Samples
// DO NOT CHANGE THIS FILE IN OTHER DIRECTORIES THAN Projekte\Samples
// DO NOT CHANGE THIS FILE IN OTHER DIRECTORIES THAN Projekte\Samples
// DO NOT CHANGE THIS FILE IN OTHER DIRECTORIES THAN Projekte\Samples
// DO NOT CHANGE THIS FILE IN OTHER DIRECTORIES THAN Projekte\Samples
// DO NOT CHANGE THIS FILE IN OTHER DIRECTORIES THAN Projekte\Samples
// DO NOT CHANGE THIS FILE IN OTHER DIRECTORIES THAN Projekte\Samples
// DO NOT CHANGE THIS FILE IN OTHER DIRECTORIES THAN Projekte\Samples
// DO NOT CHANGE THIS FILE IN OTHER DIRECTORIES THAN Projekte\Samples
// DO NOT CHANGE THIS FILE IN OTHER DIRECTORIES THAN Projekte\Samples
// DO NOT CHANGE THIS FILE IN OTHER DIRECTORIES THAN Projekte\Samples
// DO NOT CHANGE THIS FILE IN OTHER DIRECTORIES THAN Projekte\Samples
// DO NOT CHANGE THIS FILE IN OTHER DIRECTORIES THAN Projekte\Samples
// DO NOT CHANGE THIS FILE IN OTHER DIRECTORIES THAN Projekte\Samples
// DO NOT CHANGE THIS FILE IN OTHER DIRECTORIES THAN Projekte\Samples
// DO NOT CHANGE THIS FILE IN OTHER DIRECTORIES THAN Projekte\Samples
// DO NOT CHANGE THIS FILE IN OTHER DIRECTORIES THAN Projekte\Samples
// DO NOT CHANGE THIS FILE IN OTHER DIRECTORIES THAN Projekte\Samples
// DO NOT CHANGE THIS FILE IN OTHER DIRECTORIES THAN Projekte\Samples
// DO NOT CHANGE THIS FILE IN OTHER DIRECTORIES THAN Projekte\Samples
// DO NOT CHANGE THIS FILE IN OTHER DIRECTORIES THAN Projekte\Samples
// DO NOT CHANGE THIS FILE IN OTHER DIRECTORIES THAN Projekte\Samples
// DO NOT CHANGE THIS FILE IN OTHER DIRECTORIES THAN Projekte\Samples
// DO NOT CHANGE THIS FILE IN OTHER DIRECTORIES THAN Projekte\Samples
// DO NOT CHANGE THIS FILE IN OTHER DIRECTORIES THAN Projekte\Samples
// DO NOT CHANGE THIS FILE IN OTHER DIRECTORIES THAN Projekte\Samples

/*
Version 0.2.11 (2008-02-14)
– improved "alreadyChecked" to reset this status when first called

Version 0.2.10 (2007-12-03)
– liberalize fonfax regex

Version 0.2.9 (2007-11-08)
– attribute "alreadyChecked" added to avaoid mutible checkings of elements

Version 0.2.8 (2007-08-11)
– clearFormElementValue added

Version 0.2.7 (2007-06-16)
– clearFormElementValue added
– trimFormElementValue added
– validtype "fonfax" added
– validtype "vatid" added
– validtype "vatid-de" added

Version 0.2.6 (2007-01-12)
– money regex changed

Version 0.2.5 (2006-11-21)
– added tax regex

Version 0.2.4 (2006-09-29)
– change money regex to allow numbers without comma

Version 0.2.3 (2006-05-16)
– deleted slice[3] of element's name in setCombinedFormElements 
– looking for existing value in checkFormElementsChecked
– looking for existing value in getNumberOfFormElementsChecked

Version 0.2.2 (2006-05-12)
– function searchOptionInFormElement enhanced with regex option

Version 0.2.1 (2005-11-25)
– autoComplete function

Version 0.2 (2005-10-20)
– dict
– defaultValue

Version 0.1.9 (2005-10-02)
– obligatory ignores case now (ex.: true, True)

Version 0.1.8 (2005-09-24)
– changed "element.name.slice(3)" to "element.name" in line 43
– validtype "simpleDate" added
– validtype "money" added
– validtype "datetime" added

Version 0.1.6 (2005-02-09)
– 'obligatory' support for password

Version 0.1.5 (2005-01-09)
– 'obligatory' support for select

Version 0.1.4 (2004-12-13)
– disableCompetingFormElements changed
– mail to lowercase

Version 0.1.3 (2004-08-24)
– testig for option validtype="mail" added
– function isMail added
– error calculating date corrected

Version 0.1.2 (2004-08-24)
– function searchOptionInFormElement added
*/

if (!dict) var dict = new Array();
if(!dict['DemandChooseOption']) dict['DemandChooseOption'] = 'Bitte wählen Sie eine Option in folgendem Feld aus:';
if(!dict['DemandFillField']) dict['DemandFillField'] = 'Bitte ergänzen Sie die fehlenden Angaben in folgendem Feld:';
if(!dict['DemandsCorrectDataInField']) dict['DemandsCorrectDataInField'] = 'Bitte korrigieren Sie die Angaben im Feld:';
if(!dict['DemandsPayAttention']) dict['DemandsPayAttention'] = 'Beachten Sie bitte folgendes Formatbeispiel:';
if(!dict['DemandsChoosenOptions']) dict['DemandsChoosenOptions'] = 'Gewählte Optionen im Feld';
if(!dict['DemandsAreYouSure']) dict['DemandsAreYouSure'] = 'Sind Sie sicher?';


var mailRegex = /^[a-z0-9-_.]{1,63}@([a-z0-9-]{1,63}\.){0,15}[a-z0-9-]{2,63}\.[a-z]{2,6}$/;
var dateRegex = /^\d{4}\-\d{2}\-\d{2}$/;
var dateTimeRegex = /^\d{4}\-\d{2}\-\d{2}( \d{2}:\d{2}(:\d{2})?)?$/;
var simpleDateRegex = /^\d{1,2}\.\d{1,2}\.\d{4}$/;
var moneyRegex = /^\-?\d{0,9}(\,\d{1,2})?$/;
var taxRegex = /^\d{0,3}$/;
var fonFaxRegex = /^\+\d{1,6} \d{1,8} \d{1,12}(\-\d{1,8})?$/;
var vatIdRegex = /^((BE\d{9})|(DK\d{8})|(DE\d{9})|(EE\d{9})|(FI\d{8})|(FR[A-Z0-9]{2}\d{9})|(EL\d{9})|(IE\d[A-Z0-9]\d{5}[A-Z])|(IT\d{11})|(LV\d{11})|(LT\d{9})|(LT\d{12})|(LU\d{8})|(MT\d{8})|(NL[A-Z0-9]{9}B[A-Z0-9]{2})|(ATU[A-Z0-9]{8})|(PL\d{10})|(PT\d{9})|(SE\d{10}01)|(SK\d{10})|(SI\d{8})|(ES[A-Z0-9]\d{7}[A-Z0-9])|(CZ\d{8,10})|(HU\d{8})|(GB\d{9})|(GB\d{12})|(CY[A-Z0-9]{8}[A-Z]))$/;
var vatIdDeRegex = /^\d{2,3}\/\d{3}\/\d{3,8}$/;

function checkFormElementValues(form, index)
{
	if (!form) return false;
	if (isNaN(index)) index = 0;
	if (form.elements.length) // falls mehrere Elemente (d. h. ein Array) zu checken ist
	{
		if (form.elements.length <= Number(index))
			return true;
			
		if (index == 0)
			for (var i = 0; i < form.elements.length; ++i)
				form.elements[i].alreadyChecked = false;
			
		return checkFormElementValue(form.elements[Number(index)]) && checkFormElementValues(form, Number(index) + 1);
	}
	else // nur ein Element ist zu checken
	{
		element.alreadyChecked = false
		return checkFormElementValue(form.elements);
	}
}

function checkFormElementValue(element)
{
	if (!element) return false;
	
	if (element.style && element.style.backgroundColor) element.style.backgroundColor = '';
	
	if (element.type == "hidden")
		return true;
	
	if (element.alreadyChecked && element.alreadyChecked == true)
		return true;
	
	if (element.type == "radio" && element.getAttribute('obligatory') && element.getAttribute('obligatory').toLowerCase() == 'true')
		if (!checkFormElementsChecked(element.form.elements[element.name])) {alert(dict['DemandChooseOption'] + ' ' + element.title); element.focus(); return false;} else return true;
	if (element.type == "checkbox" && element.getAttribute('obligatory') && element.getAttribute('obligatory').toLowerCase() == 'true') 
	if (!checkFormElementsChecked(element.form.elements[element.name])) {alert(dict['DemandChooseOption'] + ' ' + element.title); element.focus(); return false;}
	if ((element.type == "text" || element.type == "textarea" || element.type =="password") && element.getAttribute('obligatory') && element.getAttribute('obligatory').toLowerCase() == 'true' && !element.value) {alert(dict['DemandFillField'] + ' ' + element.title); element.style.backgroundColor = '#fcc'; element.focus(); return false;}
	if ((element.type == "text" || element.type == "textarea") && element.getAttribute('valid') && element.getAttribute('addition') && element.value && element.value != element.defaultValue && element.value.search(element.getAttribute('valid')) < 0) {alert(dict['DemandsCorrectDataInField'] + ' ' + element.title + "\n" + element.getAttribute('addition')); element.style.backgroundColor = '#fcc'; element.focus(); return false;}
	if ((element.type == "text" || element.type == "textarea") && element.getAttribute('valid') && element.value && element.value != element.defaultValue && element.value.search(element.getAttribute('valid')) < 0) {alert(dict['DemandsCorrectDataInField'] + ' ' + element.title); element.style.backgroundColor = '#fcc'; element.focus(); return false;}
	if ((element.type == "text" || element.type == "textarea") && element.getAttribute('validtype') && element.getAttribute('validtype') == 'date' && element.value && element.value != element.defaultValue && !isDate(element.value)) {alert(dict['DemandsCorrectDataInField'] + ' ' + element.title); element.style.backgroundColor = '#fcc'; element.focus(); return false;}
	if ((element.type == "text" || element.type == "textarea") && element.getAttribute('validtype') && element.getAttribute('validtype') == 'datetime' && element.value && element.value != element.defaultValue  && !isDateTime(element.value)) {alert(dict['DemandsCorrectDataInField'] + ' ' + element.title); element.style.backgroundColor = '#fcc'; element.focus(); return false;}
	if ((element.type == "text" || element.type == "textarea") && element.getAttribute('validtype') && element.getAttribute('validtype') == 'simpleDate' && element.value && element.value != element.defaultValue  && !isSimpleDate(element.value)) {alert(dict['DemandsCorrectDataInField'] + ' ' + element.title); element.style.backgroundColor = '#fcc'; element.focus(); return false;}
	if ((element.type == "text" || element.type == "textarea") && element.getAttribute('validtype') && element.getAttribute('validtype') == 'mail' && element.value && element.value != element.defaultValue  && !isMail(element.value)) {alert(dict['DemandsCorrectDataInField'] + ' ' + element.title); element.style.backgroundColor = '#fcc'; element.focus(); return false;}
	if ((element.type == "text" || element.type == "textarea") && element.getAttribute('validtype') && element.getAttribute('validtype') == 'money' && element.value && element.value != element.defaultValue  && !isMoney(element.value)) {alert(dict['DemandsCorrectDataInField'] + ' ' + element.title + '\n' + dict['DemandsPayAttention'] + ' 1234,00'); element.style.backgroundColor = '#fcc'; element.focus(); return false;}
	if ((element.type == "text" || element.type == "textarea") && element.getAttribute('validtype') && element.getAttribute('validtype') == 'tax' && element.value && element.value != element.defaultValue  && !isTax(element.value)) {alert(dict['DemandsCorrectDataInField'] + ' ' + element.title + '\n' + dict['DemandsPayAttention'] + ' 19'); element.style.backgroundColor = '#fcc'; element.focus(); return false;}
	if ((element.type == "text" || element.type == "textarea") && element.getAttribute('validtype') && element.getAttribute('validtype') == 'fonfax' && element.value && element.value != element.defaultValue  && !isFonFax(element.value)) {alert(dict['DemandsCorrectDataInField'] + ' ' + element.title  + '\n' + dict['DemandsPayAttention'] + ' +49 30 2211938'); element.style.backgroundColor = '#fcc'; element.focus(); return false;}
	if ((element.type == "text" || element.type == "textarea") && element.getAttribute('validtype') && element.getAttribute('validtype') == 'vatid' && element.value && element.value != element.defaultValue  && !isVatId(element.value)) {alert(dict['DemandsCorrectDataInField'] + ' ' + element.title); element.style.backgroundColor = '#fcc'; element.focus(); return false;}
	if ((element.type == "text" || element.type == "textarea") && element.getAttribute('validtype') && element.getAttribute('validtype') == 'vatid-de' && element.value && element.value != element.defaultValue  && !isVatIdDe(element.value)) {alert(dict['DemandsCorrectDataInField'] + ' ' + element.title); element.style.backgroundColor = '#fcc'; element.focus(); return false;}
	if (element.type == "checkbox" && element.getAttribute('confirm') && element.getAttribute('confirm').toLowerCase() == 'true') if (checkFormElementsChecked(element.form.elements[element.name])) return confirm(dict['DemandsChoosenOptions'] + ' ' + element.title + ': ' + getNumberOfFormElementsChecked(element.form.elements[element.name])  + '. ' + dict['DemandsAreYouSure']);
	if (element.type == "select-one" && element.getAttribute('obligatory') && element.getAttribute('obligatory').toLowerCase() == 'true') if (!element.options[element.selectedIndex].value) {alert(dict['DemandChooseOption'] + ' ' + element.title); element.focus(); return false;}
	
	return true;
}

function checkFormElementsChecked(elements, index)
{
	if (!elements) return false;
	if (isNaN(index)) index = 0;

	if (elements.length)
	{
		if (elements.length <= Number(index))
			return false
		else
		{
			elements[index].alreadyChecked = true;

			return elements[index].value && elements[index].checked || checkFormElementsChecked(elements, Number(index) + 1);
		}
	}
	else
	{		
		elements.alreadyChecked = true;
		return elements.value && elements.checked;
	}
}

function getNumberOfFormElementsChecked(elements, index)
{
	if (!elements) return false;
	if (isNaN(index)) index = 0;
	if (elements.length)
		return elements.length <= Number(index) ? 0 : (elements[index].value && elements[index].checked ? 1 : 0) + getNumberOfFormElementsChecked(elements, Number(index) + 1);
	else
		return elements.value && elements.checked ? 1 : 0;
}

function setCombinedFormElements(element)
{
	if (!element) return false;

	var elements = element.form.elements[element.name];
	
	if (elements.length)
		for (var index = 0; index < elements.length; index++)
		{
			if (element != elements[index] && element.type == elements[index].type) elements[index].checked = element.checked;
		}
	else if (elements.type && element != elements && element.type == elements.type) elements.checked = element.checked;
}

function replaceFormElementValue(element)
{
	if (!element) return false;
	if (element.getAttribute('lower') && element.getAttribute('lower') == 'true') element.value = element.value.toLowerCase();
	if (element.getAttribute('validtype') == 'date') element.value = parseDate(element.value);
	var replaceRegex = element.getAttribute('replace');
	if (replaceRegex)
	{
		var expressions = element.getAttribute('replace').split("``");
		for (var index = 0; index < expressions.length; index++)
		{
			var expression = expressions[index].split("^^");
			if (expression.length == 2) while (element.value.search(expression[0]) >= 0) element.value = element.value.replace(element.value.match(expression[0]), expression[1]);
		}
	}
}

function cleanFormElementValue(element, removeRegex)
{
	if (!element) return false;
	// non-regex replaces: <, «, », >, ', ´, `
	// regex replaces: ", whitespaces
	element.value = element.value.replace('<', '‹').replace('«', '‹').replace('>', '›').replace('»', '›').replace("'", "‘").replace("`", "‘").replace("´", "‘").replace(/"([^"]*)"/g, "›$1‹").replace(/"/g, "").replace(/^\s+/, "").replace(/\s+$/, "").replace(/(\s)+/g, "$1");
	if (removeRegex != null) element.value = element.value.replace(removeRegex, "");
}

function trimFormElementValue(element, maxlength)
{
	if (!element) return false;
	if (maxlength == null || isNaN(maxlength)) maxlength = Number(element.getAttribute('maxlength'));
	if (maxlength > 0 && element.value.length > maxlength) element.value = element.value.substr(0, maxlength);
}

function disableFormElements(form, type)
{
	if (!form) return false;
	for (var index = 0; index < form.elements.length; index++) if (!type || form.elements[index].type == type) form.elements[index].disabled = true;
}

function disableCompetingFormElements(element)
{
	if (!element) return false;
	var form = element.form;
	for (var index = 0; index < form.elements.length; index++) if (form.elements[index] != element && form.elements[index].type == element.type) form.elements[index].disabled = true;
	element.style.cursor = 'wait';
}

function disableCompetingFormElementsByTagName(element)
{
	if (!element) return false;
	var form = element.form;
	
	var elements = form.getElementsByTagName(element.nodeName.toLowerCase());
	
	if (!elements || !elements.length)
		return false;
	
	for (var index = 0; index < elements.length; index++)
		if (elements[index].type == element.type)
			elements[index].disabled = true;
		
	element.style.cursor = 'wait';
	
	return true;
}

function isMail(string)
{
	return string.search(mailRegex) == 0;
}

function isDate(string)
{
	return string.search(dateRegex) < 0 ? false : new Date(Number(string.substr(0, 4)), Number(string.substr(5, 2)) - 1, Number(string.substr(8, 2)));
}

function isDateTime(string)
{
	return string.search(dateTimeRegex) >= 0;// ? false : new Date(Number(string.substr(0, 4)), Number(string.substr(5, 2)) - 1, Number(string.substr(8, 2)));
}

function isSimpleDate(string)
{
	if (string.search(simpleDateRegex) < 0) return false;
	var year = string.substr(string.lastIndexOf('.')+1, 4);
	var month = string.substr(string.indexOf('.')+1, string.lastIndexOf('.') - (string.indexOf('.')+1));
	var day = string.substr(0,string.indexOf('.'));
	return Number(year) >= 1800 && Number(year) <= 2100 && Number(month) >= 1 && Number(month) < 13 && Number(day) >= 1 && Number(day) < 32;
}

function isMoney(string)
{
	return string.search(moneyRegex) == 0;
}

function isTax(string)
{
	return string.search(taxRegex) == 0;
}

function isFonFax(string)
{
	return string.search(fonFaxRegex) == 0;
}

function isVatId(string)
{
	return string.search(vatIdRegex) == 0;
}

function isVatIdDe(string)
{
	return string.search(vatIdDeRegex) == 0;
}

function parseDate(string)
{
	var digits = string.match(/\d/g);
	var date;
	if (digits)
	{
		var now = new Date();
		var year = now.getYear();
		if (year < 1900) year += 1900;
		var month = now.getMonth() + 1;
		var day = now.getDate();
		switch (digits.length)
		{
			case 2: date = new Date(year, month - 1, Number(digits[0] + digits[1])); break;
			case 4: date = new Date(year, Number(digits[0] + digits[1]) - 1, Number(digits[2] + digits[3])); break;
			case 5: date = new Date(year - year % 10 + Number(digits[0]), Number(digits[1] + digits[2]) - 1, Number(digits[3] + digits[4])); break;
			case 6: date = new Date(year - year % 100 + Number(digits[0] + digits[1]), Number(digits[2] + digits[3]) - 1, Number(digits[4] + digits[5])); break;
			case 8: date = new Date(Number(digits[0] + digits[1] + digits[2] + digits[3]), Number(digits[4] + digits[5]) - 1, Number(digits[6] + digits[7]));
		}
	}
	return date ? formatDate(date) : string;
}

function formatDate(date)
{
	if (!date) return false;
	var year = date.getYear();
	if (year < 1900) year += 1900;
	var month = date.getMonth() + 1;
	var day = date.getDate();
	return year + (month < 10 ? '-0' : '-') + month + (day < 10 ? '-0' : '-') + day;
}

function searchOptionInFormElement(element, search, start, searchStringIsRegex)
{
	if (element && element.options && search)
	{
		if (!start) start = element.selectedIndex + 1;

    if (searchStringIsRegex)
    {
		  var arr;
		  var found;
		  var regex = new RegExp(search);
		  var finalPos;

		  for (var index = start; index < element.options.length; index++)
			  if ((arr = regex.exec(element.options[index].text.toLowerCase())))
				  for (var pos = 0; pos < arr.length; ++pos)
				    if (! found || arr[pos].length < found.length)
				    {
				      found = arr[pos];
					    finalPos = index;
				    }
  				  
		  if (finalPos)
		    element.selectedIndex = finalPos;
		}
    else
  		for (var index = start; index < element.options.length; index++)
			if (element.options[index].text.toLowerCase().indexOf(search.toLowerCase()) >= 0)
				{
					element.selectedIndex = index;
					break;
				}
	}
}

function lowerCase(element)
{
	if (!element) {alert("lowerCase function parameter missing"); return;}
	var selectionStart = element.selectionStart ? element.selectionStart : -1;
	var selectionEnd = element.selectionEnd ? element.selectionEnd : -1;
	if (element.value != element.value.toLowerCase()) element.value = element.value.toLowerCase();
	if (selectionStart >= 0) element.selectionStart = selectionStart;
	if (selectionEnd >= 0) element.selectionEnd = selectionEnd;
}

function autoComplete(element, array, isCaseSensitive)
{
	if (!element || !element.type == 'text') return;
	if (!array || !array.length) return;

	var value = element.value;
	var previousValue = element.previousValue;
	
	if (previousValue && value.length <= previousValue.length)
	{
		element.previousValue = value;
		return;
	}

	for (var index = 0; index < array.length; index++)
	{
		var probe = array[index];
		if (value.length > 0 && value.length < probe.length && (probe.indexOf(value) == 0 || !isCaseSensitive && probe.toLowerCase().indexOf(value.toLowerCase()) == 0))
		{
			element.previousValue = value;
			element.value = probe;
			
			if (element.selectionStart && element.selectionEnd)
			{
				element.selectionStart = value.length;
				element.selectionEnd = probe.length;
			}
			else if (element.createTextRange)
			{
				var range = element.createTextRange();
				range.moveStart('character', value.length);
				range.moveEnd('character', probe.length);
				range.select();
			}
			break;
		}
	}
}
