var datetimeRegExp_g = /^ *([0-9]{1,2})\.([0-9]{1,2})\.(([0-9]{2}){1,2})?(([0-9]{1,2}):([0-9]{1,2})(:([0-9]{1,2})){0,1}){0,1} *$/;
var datetimeRegExp_i = /^ *(([0-9]{2}){1,2})?-([0-9]{1,2})-([0-9]{1,2})?(([0-9]{1,2}):([0-9]{1,2})(:([0-9]{1,2})){0,1}){0,1} *$/;

var emailRegExp = /^([a-z0-9][\._a-z0-9-]*)@(([a-z0-9]+[\.-])*([a-z0-9]+[\.])[a-z]{2}([zmuvtg]|fo|me)?)$/;
                    

var emptyRegExp = /^ *$/;

function translateMessage(f,msg,s) {
	msg="'" + msg.replace(/\{([^\:}]+)(:([^\}]+))?\}/g,"' + getControlValue(f,'$1',s,'$3') + '") + "'";
	msg = eval(msg);

	return msg;
}

function isInteger(i) {
	return i==Math.floor(i);
}

function stringToNumber(s,c) {
	if (typeof fieldThousandSeps != 'undefined' && fieldThousandSeps[c]) {
		var r1=new RegExp('[' + fieldThousandSeps[c].replace(/\./g,'\\\.') + ' ]([0-9]{3})','g');
		s=s.replace(r1,'$1');
	}
	if(typeof fieldDecimalPoints != 'undefined' && fieldDecimalPoints[c]) {
		var r2=new RegExp('([0-9])' + fieldDecimalPoints[c].replace(/\./g,'\\\.') + '([0-9])','g');
		s=s.replace(r2,'$1.$2');
	}
	s=s.replace(/ /g,'');
	return Number(s);
}

function twoDigitYearToFourDigitYear(y) {
	var now=new Date();
	if (y=='') {
		return now.getFullYear();
	}
	if (typeof(y)!='string' || y.length!=4) {
		y=parseInt(y);
		var iClipCentury=30;
		if (y < 100) {
			y += (Math.floor(now.getFullYear()/100))*100;
			iYearsFromThisYears=y-now.getFullYear();
			if (iYearsFromThisYears > iClipCentury) {
				y -= 100;
			} else if (iYearsFromThisYears < iClipCentury-100) {
				y += 100;
			}
		}
	}
	return y;
}

function stringToDate(v,f) {
	var y; var m; var d;
	
	if (datetimeRegExp_g.exec(v)) {
		y = twoDigitYearToFourDigitYear(RegExp.$3);
		m = (RegExp.$2.length==1 ? '0' + RegExp.$2 : RegExp.$2);
		d = (RegExp.$1.length==1 ? '0' + RegExp.$1 : RegExp.$1);
	} else if (datetimeRegExp_i.exec(v)) {
		y = twoDigitYearToFourDigitYear(RegExp.$1);
		m = (RegExp.$3.length==1 ? '0' + RegExp.$3 : RegExp.$3);
		d = (RegExp.$4.length==1 ? '0' + RegExp.$4 : RegExp.$4);
	} else {
		return v;
	}

	if (typeof f!='undefined' && f=='german')
		return d + '.' + m + '.' + y;
	else
		return y + '-' + m + '-' + d;
}

function formatValue(c,v,ct,f) {
	if (ct=='datetime' || (typeof f != 'undefined' && f=='german')) {
		return stringToDate(v,f);
	} else if (ct=='float' || ct=='integer' || ct=='currency' || ct=='percentage') {
		return stringToNumber(v,c);
	} else if (isAutoTrimControl(c)) {
		return textTrim(v);
	} else {
		return v;
	}
}

function getControlValue(f,c,s,format) {
	o=document.forms[f].elements[c];
	var ct=getControlType(c);
	if (! o) {
		if (typeof s == 'undefined') {
			return '';
		} else {     
			for (i=0; i<fields.length; i++) {
				if (fields[i]==s) {
					for (j=0;j<fieldParamNames[i].length;j++) {
						if (fieldParamNames[i][j]==c) {
							var v = eval(fieldParamValues[i][j].replace(/\{([^\:}]+)(:([^\}]+))?\}/g,"getControlValue(f,'$1',s,'$3')"));
							return formatValue(c,v,'',format);
						}
					}
				}
			}
			return '';
		}
	} else if (typeof o == 'object') {
		//if (o.type=='text' || o.type=='hidden' || o.type=='datetime' || o.type=='currency' || o.type=='percentage' || o.type=='integer' || o.type=='float') {
		if (o.type=='text' || o.type=='hidden') {
			return formatValue(c,o.value,ct,format);
		} else if (o.type=='checkbox' && ct=='boolean') {
			return o.checked;
		} else if (o.type=='radio' && ct=='list') {
			return o.selected ? o.value : '';
		} else if (o.type=='select-one' && ct=='list') {
			return o.value;
		} else if (ct=='list' && isArray(o)) {
			for (i=0; i<o.length; i++) {
				if (o[i].checked) return o[i].value;
			}
		} else {
			return '';
		}
	} else {
		return '';
	}
}

/**
 * Entfernt führende und schließende Leerzeichen aus dem übergebenen Text
 * und gibt den veränderten Text zurück.
 */
function textTrim(Text) 
{
	while ((Text.substring(0,1) == ' ') || (Text.substring(0,1) == '\n') || (Text.substring(0,1) == '\r'))
	{
		Text = Text.substring(1,Text.length);
	}
	
	while ((Text.substring(Text.length-1,Text.length) == ' ') || (Text.substring(Text.length-1,Text.length) == '\n') || (Text.substring(Text.length-1,Text.length) == '\r'))
	{
		Text = Text.substring(0,Text.length-1);
	}
	return Text;
}

function __jsdateToDate(JSDate)
{
	return JSDate.getFullYear() +
		"-" + (JSDate.getMonth() < 9 ? "0" + (JSDate.getMonth()+1) : JSDate.getMonth()+1) + "-" +
		(JSDate.getDate() < 9 ? "0" + JSDate.getDate() : JSDate.getDate());
}

/**
 * Gibt die Länge des übergebenen Textes in Zeichen zurück.
 */
function textLen(Text)
{
	return Text.length;
}

/**
 * Fügt einen Text zu einem anderen Text hinzu.
 */
function textAdd(Text1,Text2)
{
	return Text1 + Text2;
}

/**
 * Ermittelt das aktuelle Datum, und gibt dieses zurück.
 */
function dateNow()
{
	return __jsdateToDate(new Date());
}

/**
 * Addiert Months Monate auf das Datum Date und gibt dieses zurück.
 */
function dateAddMonths(Now,Months)
{
	if (datetimeRegExp_i.exec(Now))
	{
		var NowDate = new Date(Number(RegExp.$1),Number(RegExp.$3)-1+Months,Number(RegExp.$4));
		return __jsdateToDate(NowDate);
	} else {
		return "";
	}
}

/**
 * Addiert Years Jahre auf das Datum Date und gibt dieses zurück.
 */
function dateAddYears(Now,Years)
{
	if (datetimeRegExp_i.exec(Now))
	{
		var NowDate = new Date(Number(RegExp.$1)+Years,Number(RegExp.$3)-1,Number(RegExp.$4));
		return __jsdateToDate(NowDate);
	} else {
		return "";
	}
}

/**
 * Berechnet das Datum des ersten Tages des gegenwärtigen Monats oder
 * (sofern angegeben) des angegebenen Datums und gibt dieses zurück.
 */
function dateGetFirstOfMonth(Now)
{
	if (typeof Now == 'undefined')
	{
		var NowDate = new Date();
	} else {
		if (datetimeRegExp_i.exec(Now))
		{
			var NowDate = new Date(Number(RegExp.$1),Number(RegExp.$3)-1,Number(RegExp.$4));
		} else {
			var NowDate = new Date();
		}
	}
	NowDate.setDate(1);
	return __jsdateToDate(NowDate);
}

/**
 * Berechnet das Datum des letzten Tages des gegenwärtigen Monats.
 */
function dateGetLastOfMonth()
{
	var NowDate = new Date();
	NowDate.setMonth(NowDate.getMonth()+1);
	NowDate.setDate(0);
	return __jsdateToDate(NowDate);
}

/**
 * Berechnet die Differenz in Tagen zwischen den durch Start und End
 * spezifizierten Daten, und vergleicht diese mit Days. Es wird
 * <code>true</code> zurückgegeben, wenn die Differenz größer als Days
 * ist, und <code>false</code> anderenfalls.
 */
function dateEnsureDaysBetween(Start,End,Days)
{
	return dateGetDaysBetween(Start,End) >= Days;
}

/**
 * Berechnet die Differenz in Tagen zwischen den durch Start und End
 * spezifizierten Daten, und gibt diese zurück.
 */
function dateGetDaysBetween(Start,End)
{
	if (datetimeRegExp_i.exec(Start))
	{
		StartDate = new Date(Number(RegExp.$1),Number(RegExp.$3)-1,Number(RegExp.$4));
		if (datetimeRegExp_i.exec(End))
		{
			EndDate = new Date(Number(RegExp.$1),Number(RegExp.$3)-1,Number(RegExp.$4));
			Diff = EndDate.getTime() - StartDate.getTime();
			return Math.floor(Diff / (1000 * 60 * 60 * 24));
		}
	} else {
		return;
	}
}

/**
 * Berechnet die Differenz in Jahres zwischen den durch Start und End
 * spezifizierten Daten, und gibt diese zurück.
 */
function dateGetYearsBetween(Start,End)
{
	days=dateGetDaysBetween(Start,End);
	if (typeof days != 'undefined') {
		return Math.floor(days / 365);
	} else {
		return;
	}
}

function mathIsMultipleOf(Value,Factor)
{
	return Value % Factor == 0;
}


/**
 * This function check if user give us password which is combined from numbers and chars
 *
 * @param string $sPass password
 * @param int $iNum minimal count of numbers
 * @param int $iLen minimal length of password
 */
function checkPassword(pass , num , len) 
{
	if (pass.length < len) return false;
	
	var c = 0;

	for (i = 0 ; i < pass.length ; i++)	
		if (pass.charCodeAt(i) >= 48 && pass.charCodeAt(i) < 58) c++;	
	
	if (c >= num)
		return true;
	else return false;	
}
