﻿/* charset-encoding="UTF-8" */

/**
 * [01.12.2010] lo: Namespace-Deklaration für persis.require() ergänzt (persis.old_scripts.date_js).
 * [20.07.2011] sts: getDayMonth zur Ermittlung der Monate aufgrund einer Anzahl von Tagen ergänzt
 * [19.11.2015] slo: getDaysInMonths erstellt und einige jshint-Issues gefixt.
 */

/**
 * Namespace-Deklaration für persis.require()
 */
if(typeof persis != 'undefined') {
	persis.old_scripts = persis.old_scripts || {};
	persis.old_scripts.date_js = true;
}

/*
' Diese Funktion liefert das Datum, des Montags in der 1. Kalenderwoche
' im angegebenen Jahr (vierstellig!).
' Rückgabe: Das entsprechende Datum
' Beispiel:
*/
function getFirstDayOfYear(nYear) {
	var dYearBeg = new Date(nYear, 0, 1);

	switch(dYearBeg.getDay()) {
	case 5 : // Freitag
		dYearBeg = new Date(nYear, 0, 4);
		break;

	case 6 : // Samstag
		dYearBeg = new Date(nYear, 0, 3);
		break;

	case 0 : // Sonntag
		dYearBeg = new Date(nYear, 0, 2);
		break;

	case 2 : // Dienstag
		dYearBeg = new Date(nYear - 1, 11, 31);
		break;

	case 3 : // Mittwoch
		dYearBeg = new Date(nYear - 1, 11, 30);
		break;

	case 4 : // Donnerstag
		dYearBeg = new Date(nYear - 1, 11, 29);
		break;
	}

	return dYearBeg;
}

/*
' Diese Funktion liefert das Datum, des Montags in der angegebenen Kalenderwoche
' im angegebenen Jahr (vierstellig!).
' Rückgabe: Das entsprechende Datum
' Beispiel:
*/
function getFirstDayOfWeek(nYear, nWeek) {
	var dDate = getFirstDayOfYear(nYear);
	dDate.setDate(dDate.getDate() + ((nWeek - 1) * 7));
	return dDate;
}

/*
' Funktion, die zu einem gegebenen Datum die dazugehörende Kalenderwoche liefert.
' KW1 ist per Definition die Woche, in die der 1. Januar fällt.
' Rückgabe: die entsprechende Kalenderwoche
' Beispiel:
*/
function getWeekNo(dDate) {
	var nYear = getYear(dDate);
	var nWeek = 1;

	var dWeek = getFirstDayOfYear(nYear);
	while(dWeek <= dDate) {
		nWeek++;
		dWeek = getFirstDayOfWeek(nYear, nWeek);
	}

	return ((nWeek - 1) % 52);
}

/*
' Diese Funktion prüft, ob das angegebene Jahr ein Schaltjahr ist.
' Rückgabe: [true], wenn nYear ein Schaltjahr ist
' Beispiel: leap = isLeapYear(2000);	// liefert true
*/
function isLeapYear(nYear) {
	if((nYear % 4) == 0 && ((nYear % 100) != 0 || (nYear % 400) == 0)) {
		return true;
	}
	else {
		return false;
	}
}

/*
' Diese Funktion liefert die Anzahl Tage eines angegebenen Monats zurück.
' Zur Unterscheidung von Schaltjahren (für Februar) wird zusätzlich das
' Jahr benötigt.
' Rückgabe: Die Anzahl der Tage
' Beispiel: nAnz = getDayCount(2, 2000);	// liefert 29
*/
function getDayCount(month, year) {
	return new Date(year, month, 0).getDate();
}

/*
' Berechnet die Tage in einer Zeitspanne, die in Monaten angegeben wird.
' Als Paramter wird eine Anzahl von Monaten benötigt, danach entweder eine Monats- und Jahreszahl oder ein Date-Objekt.
' Rückgabe: Die Anzahl der Tage
' Beispiel 1: nAnz = getDaysInMonths(24, new Date(convertDate("27.11.2015")));	// liefert 731
' Beispiel 2: nAnz = getDaysInMonths(24, 11, 2015);	// liefert 731
*/
function getDaysInMonths(monthCount, monthOrDate, year) {
	var myMonth = monthOrDate;
	var myYear = year;

	if(monthOrDate instanceof Date && typeof year == 'undefined' ) {
		myMonth = monthOrDate.getMonth();
		myYear = monthOrDate.getFullYear();
	}

	var days = 0;
	for (i = 0; i < monthCount; i++) {
			if(myMonth < 12) {
				myMonth++;
			} else {
				myMonth = 1;
				myYear++;
			}
    	days += getDayCount(myMonth, myYear);
	}
	return days;
}

/*
' Diese Funktion wandelt das angegebene Datum in einen String im entsprechenden
' Format um.
' Der Format-Parameter (fmt) wird verwendet, um das Datum entsprechend zu
' parsen: d = Tag, M = Monat, y = Jahr ; mögliche Angaben sind z.B.
' "dd.MM.yyyy", oder "MM/dd/yyyy". Ist kein Format angegeben, wird versucht
' mit getDateFormat das aktuelle iPERSIS-Format zu ermitteln. Funktioniert
' auch das nicht, wird "dd.MM.yyyy" angenommen.
' Rückgabe: das Datum als String
' Beispiel:
*/
function dateToStr(dDate, fmt) {
	var nYear = getYear(dDate);
	var nMonth = getMonth(dDate);
	var nDay = getDay(dDate);

	var str = "";
/*	if(nDay < 10)
		str += "0";
	str += nDay + ".";
	if(nMonth < 10)
		str += "0";
	str += nMonth + ".";
	str += nYear;*/

	// Format ermitteln
	if(fmt == null) {
		if(typeof getDateFormat != "undefined") {
			fmt = getDateFormat();
		}
		if(fmt == null || fmt.length <= 0)
			fmt = "dd.MM.yyyy";
	}
	var fmtLen = fmt.length;
	var fmtPos = consumeWs(fmt, 0);

	// Formatstring untersuchen
	while(fmtPos < fmtLen) {
		var elem = fmt.charAt(fmtPos);

		//alert( /* persis-id="9123" */ "fmtPos="+fmtPos+"; elem="+elem);
		var count = 0;
		if(elem == 'd') {
			// Kennung für Tag
			// Anzahl der Zeichen ermitteln.
			while(fmt.charAt(fmtPos) == elem) {
				fmtPos ++;
				count ++;
			}

			// Tag ausgeben
			str += intToStr(nDay, count);
		} else if(elem == 'M') {
			// Kennung für Monat
			// Anzahl der Zeichen ermitteln.
			while(fmt.charAt(fmtPos) == elem) {
				fmtPos ++;
				count ++;
			}

			// Monat ausgeben
			str += intToStr(nMonth, count);
		} else if(elem == 'y') {
			// Kennung für Jahr
			// Anzahl der Zeichen ermitteln.
			while(fmt.charAt(fmtPos) == elem) {
				fmtPos ++;
				count ++;
			}

			// Jahr ausgeben
			str += intToStr(nYear, count);
		} else {
			// Trennzeichen
			fmtPos ++;

			// ausgeben
			str += elem;
		}

		// Leerzeichen überspringen
		fmtPos = consumeWs(fmt, fmtPos);
	}

	return str;
}

/*
' Liefert die Jahreszahl des angegebenen Datums zurück.
' Rückgabe: Jahreszahl
' Beispiel:
*/
function getYear(dDate) {
	var year = dDate.getYear();
	if(year < 1000) {
		year += 1900;
	}
	return year;
}

/*
' Liefert die Monatsnummer des angegebenen Datums zurück.
' Rückgabe: Monatsnummer
' Beispiel:
*/
function getMonth(dDate) {
	var mon = dDate.getMonth();
	mon += 1;
	return mon;
}

/*
' Liefert die Tageszahl des angegebenen Datums zurück.
' Rückgabe: Tageszahl
' Beispiel:
*/
function getDay(dDate) {
	return dDate.getDate();
}

/*
	Ermittelt die Differenz zwischen 2 Datumswerten
	Paramter:
		dDate1 - Erstes Datum
		dDate2 - Zweites Datum

		Erstes Datum sollte das kleinere von beiden sein!
*/
function getDateDiff(dDate1, dDate2)
{
	var iDate1 = dateToInt(dDate1);
	var iDate2 = dateToInt(dDate2);

	var iDiff = iDate2 - iDate1;

	return iDiff;
}
/*
' Liefert den deutschen Monatsnamen zu dem angegebenen Monat zurück. Monat 1
' liefert "Januar", 2 "Februar", etc.
' Rückgabe: Monatsname als String
' Beispiel:
*/
function getMonthName(nMonth) {
	var monthNames = new Array(String(/* persis-id="10590" */ "Januar"), String(/* persis-id="10591" */ "Februar"),
								String(/* persis-id="10592" */ "März"), String(/* persis-id="10593" */ "April"),
								String(/* persis-id="10594" */ "Mai"), String(/* persis-id="10595" */ "Juni"),
								String(/* persis-id="10596" */ "Juli"), String(/* persis-id="10597" */ "August"),
								String(/* persis-id="10598" */ "September"), String(/* persis-id="10599" */ "Oktober"),
								String(/* persis-id="10600" */ "November"), String(/* persis-id="10601" */ "Dezember"));
	return monthNames[nMonth - 1];
}

/*
' Liefert die kurze Version des deutschen Monatsnamen zu dem angegebenen Monat zurück.
' Monat 1 liefert "Jan", 2 "Feb", etc.
' Rückgabe: Monatsname als String
' Beispiel:
*/
function getShortMonthName(nMonth) {
	var name = getMonthName(nMonth);
	return name.substring(0, 3);
}

/*
' Liefert den deutschen Tagesnamen zu dem angegebenen Tag zurück. Tag 1
' liefert "Montag", 2 "Dienstag", etc.
' Rückgabe: Tagesname als String
' Beispiel:
*/
function getDayName(nDay) {
	var dayNames = new Array(String(/* persis-id="10602" */ "Sonntag"), String(/* persis-id="10603" */ "Montag"),
							String(/* persis-id="10604" */ "Dienstag"), String(/* persis-id="10605" */ "Mittwoch"),
							String(/* persis-id="10606" */ "Donnerstag"), String(/* persis-id="10607" */ "Freitag"),
							String(/* persis-id="10608" */ "Samstag"));
	return dayNames[nDay % 7];
}

/*
' Liefert die kurze Version des deutschen Tagesnamen zu dem angegebenen Tag zurück.
' Tag 1 liefert "Mo", 2 "Di", etc.
' Rückgabe: Tagesname als String
' Beispiel:
*/
function getShortDayName(nDay) {
	var name = getDayName(nDay);
	return name.substring(0, 2);
}

/*
' Diese Funktion vergleicht zwei Daten, und liefert folgendes zurück:
' -1, wenn dDate1 < dDate2
' 0, wenn dDate1 = dDate2
' 1, wenn dDate1 > dDate2
' Der Uhrzeitanteil wird ignoriert!
' Beispiel:
*/
function compareDates(dDate1, dDate2) {
	var nDate1 = getYear(dDate1) * 10000 + getMonth(dDate1) * 100 + getDay(dDate1);
	var nDate2 = getYear(dDate2) * 10000 + getMonth(dDate2) * 100 + getDay(dDate2);
	if(nDate1 < nDate2)
		return -1;
	else if(nDate1 > nDate2)
		return 1;
	else
		return 0;
}

/*
' Diese Funktion rechnet das Alter einer Person anhand des Geburtsdatums aus.
' Geburtstag MUSS als Datum vorliegen (Typ Date())! Ggf. vorher mit convertDate()
' (parser.js) umwandeln (vgl. Beispiel).
' Beispiel:
'  age = getAge(convertDate("08.03.1973"));
*/
function getAge(dDayOfBirth) {
	var dToday = new Date();
	var year = getYear(dToday);
	var age = year - getYear(dDayOfBirth);

	// Geburtstag im aktuellen Jahr
	var dBirthday = dDayOfBirth;
	dDayOfBirth.setFullYear(year);

	if(compareDates(dBirthday, dToday) > 0) {
		// Geburtstag war dieses Jahr noch nicht
		age = age - 1;
	}

	return age;
}

/*
 ' Liefert das Datum als Anzahl Tage seit 1900 (31.12.1899) zurück.
 */
function dateToInt(dDate) {
	var year = getYear(dDate);
	var month = getMonth(dDate);
	var day = getDay(dDate);

	var days = day;
	var i;
	for(i = month - 1; i > 0; i--) {
		days += getDayCount(i, year);
	}
	for(i = year - 1; i >= 1900; i--) {
		days += 365;
		if(isLeapYear(i)) {
			days ++;
		}
	}
	return days;
}

/*
 ' Generiert aus der angegebenen Anzahl Tage seit 1900 (31.12.1899) ein Date()-Objekt.
 */
function intToDate(daysSince1900) {
	var year = 1900;
	var month = 1;
	var day = 0;

	var days = daysSince1900;

	while((!isLeapYear(year) && days > 365) || (isLeapYear(year) && days > 366)) {
		days -= 365;
		if(isLeapYear(year))
			days--;
		year++;
	}
	while(days > getDayCount(month, year)) {
		days -= getDayCount(month, year);
		month++;
	}
	day = days;

	return new Date(year, month - 1, day);
}

/*Wandelt eine Uhrzeit in einen Integer um*/
function timeToInt(time) {
	if(typeof time == "undefined")
		return false;

	if(!checkTime(time))
	{
		return false;
	}

	var	myTime = time.split(":");

	var integer = convertInteger(myTime[0]) * 60 + convertInteger(myTime[1]);

	return parseInt(integer);
}

/*Wandelt einen Integer in eine Uhrzeit um*/
function intToTime(integer) {
	if(typeof integer == "undefined")
		return false;

	var stunden = intToStr(parseInt(integer) / 60);
	var minuten = intToStr(parseInt(integer) % 60);

	if(minuten.length == '1')
		minuten = "0" + minuten;

	var time = stunden + ":" + minuten;

	return time;
}

/*
 ' Generiert aus einem Datum seit 1900 (31.12.1899) die Kalenderwoche.
 ' Beispiel:
		 dDate=convertDate(document.form.FELDNAME.value);		=kovertiert den Feldinhalt in ein gültiges Datumsformat
		 m=getMonth(dDate);							=extrahiert den Monat
		 j=getYear(dDate);							=extrahiert den Jahr
		 t=getDay(dDate);								=extrahiert den Tag
		 document.form.FELDNAME.value=kw(j,m,t);			=gibt die aktuelle KW aus
* Erstellt: 27.06.07 - AKO
 */

function kw(j,m,t)
{
	var Datum = new Date();

	if (!t)
	{
		j = Datum.getYear(); if (1900 > j) j +=1900;
		m = Datum.getMonth(); t = Datum.getDate();
	}
	else m--;

	Datum = new Date(j,m,t,0,0,1);

	var tag = Datum.getDay(); if (tag == 0) tag = 7;
	var d = new Date(2004,0,1).getTimezoneOffset();
	var Sommerzeit = (Date.UTC(j,m,t,0,d,1) - Number(Datum)) /3600000;

	Datum.setTime(Number(Datum) + Sommerzeit*3600000 - (tag-1)*86400000);

	var Jahr = Datum.getYear(); if (1900 > Jahr) Jahr +=1900;
	var myKw = 1;

	if (new Date(Jahr,11,29) > Datum)
	{
		var Start = new Date(Jahr,0,1);
		Start = new Date(Number(Start) + 86400000*(8-Start.getDay()));
		if(Start.getDate() > 4) Start.setTime(Number(Start) - 604800000);
		myKw = Math.ceil((Datum.getTime() - Start) /604800000);
	}

	return myKw;
}


/*
	' Berechnet die Differenz in Wochen ausgehend von 2 Datumwerten
	' Aufruf Bsp: setWeekNumber("form", "BEGINN", "BEGINN_KW")
*/

function setWeekNumber(formName, field1Name, target1Name)
{
	var form = getFormObject(formName);
	var elem1 = getElementObject(form, field1Name);
	var target1 = getElementObject(form, target1Name);

	var datum = convertDate(elem1.value);
	var j = getYear(datum);
	var m = getMonth(datum);
	var d = getDay(datum);
	target1.value = kw(j,m,d);
}


/*
	' Berechnet die Differenz in Tage ausgehend von 2 Datumwerten
	' Aufruf Bsp: setDiffDays("form", "BEGINN", "ENDE", "DAUER", "DAUER_WO", 5)
*/
function setDiffDays(formName, field1Name, field2Name, target1Name, target2Name, daysPerWeek)
{
	var form = getFormObject(formName);
	var elem1 = getElementObject(form, field1Name);
	var elem2 = getElementObject(form, field2Name);

	var target1 = getElementObject(form, target1Name);
	var target2 = getElementObject(form, target2Name);

	var workDaysPerWeek = daysPerWeek;

	var y = convertDate(elem1.value);
	var x = convertDate(elem2.value);

	inty=dateToInt(y);
	intx=dateToInt(x);

	weekday = new Array("Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag");

	var ANZ = 0;

	while(inty <= intx)
	{
		tag1=intToDate(inty);
		tag=tag1.getDay();

		if(weekday[tag]=='Sonntag' || weekday[tag]=='Samstag')
		{ANZ=ANZ-1;}
		ANZ++;
		inty++;
	}

	anztage = ANZ;

	if(anztage != '')
	{
		var calc = anztage / workDaysPerWeek;
		var anzwochen = Math.round(calc);

		target1.value=anztage;
		target2.value=anzwochen;
	}
}

/*
	' Berechnet die Anzahl Monate aufgrund Anzahl übergebener Tage
	 ' Beispiel:
		 format: 1 = Monat als Integer
	' Aufruf Bsp: getDayMonth("146", "1")
*/

function getDayMonth(days, format)
{
	var month = days / 30;

	if(format == '1')
	{
		month = parseInt(month);
	}

	return month;
}
