﻿// save as Unicode with Signature

// version 0.2.1

// 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.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+\,\d{2}$/;

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
		return form.elements.length <= Number(index) ? true : checkFormElementValue(form.elements[Number(index)]) && checkFormElementValues(form, Number(index) + 1);
	else // nur ein Element ist zu checken
		return checkFormElementValue(form.elements);
}

function checkFormElementValue(element)
{
	if (!element) return false;
	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;}
	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.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 == "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;}
	element.style.backgroundColor = '';
	return true;
}

function checkFormElementsChecked(elements, index)
{
	if (!elements) return false;
	if (isNaN(index)) index = 0;
	if (elements.length)
		return elements.length <= Number(index) ? false : elements[index].checked || checkFormElementsChecked(elements, Number(index) + 1);
	else
		return elements.checked ? 1 : 0;
}

function getNumberOfFormElementsChecked(elements, index)
{
	if (!elements) return false;
	if (isNaN(index)) index = 0;
	if (elements.length)
		return elements.length <= Number(index) ? 0 : (elements[index].checked ? 1 : 0) + getNumberOfFormElementsChecked(elements, Number(index) + 1);
	else
		return elements.checked ? 1 : 0;
}

function setCombinedFormElements(element)
{
	if (!element) return false;
	if (element.name.indexOf("all") != 0) return;
	var elements = element.form.elements[element.name.slice(3)];
	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 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 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 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)
{
	if (element && element.options && search)
	{
		if (!start) start = element.selectedIndex + 1;
		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;
		}
	}
}