//
// Author:	Martijn Polak <martijn.polak@amgate.com>
// Description: Date formatting and popup functions for the dte control
//

// -- Init -------------------------------------------------------------------------------------------------------------------------------------

var currentDateFormat;

// -- Date formatting --------------------------------------------------------------------------------------------------------------------------

// Automatically formats a date. elementId is the input object id that corresponds to the id of the hidden field that should receive the data.
function autoFormatDate(elementId, dateFormat) {

	var writeInto = document.getElementById(elementId);
	var writeInto_Display = document.getElementById(elementId + '_DISPLAY');

	if (writeInto) {
		var tmpValue = (writeInto_Display ? writeInto_Display.value : writeInto.value);
		var tmpDate = new createCompatibleDate(tmpValue, dateFormat);
		writeInto.value = getDateString(tmpDate);
		if (writeInto_Display) writeInto_Display.value = writeInto.value;
	}

}

// Separate function to format a year
function formatYear(srcString, fullYear) {

	if (srcString.length <= 2 && fullYear) {

		srcString = strPad("0", 2 - srcString.length) + srcString;

		if (Number(srcString) > 30) {
			srcString = "19" + srcString;
		} else {
			srcString = "20" + srcString;
		}

	} else {

		var pOffset = (fullYear ? 4 : 2);

		if (srcString.length >= pOffset) {
			srcString = srcString.substr(srcString.length - pOffset, srcString.length);
		} else {
			srcString += strPad("0", pOffset - srcString.length);
		}

		if (srcString.substr(0,1) == '0') srcString = formatYear('2000', fullYear);

	}

	return srcString;

}

// Creates a compatible date object
// inDate can be a string or a Date() object
function createCompatibleDate(inDate, fmtString, sepChar) {

	var indexDay = 0;
	var indexMonth = 1;
	var indexYear = 2;
	var useFullYear = false;
	var sepPos;
	var retVal = new Array();
	var strDate = String(inDate);

	// Convert oracle months
	strDate = strDate.replace(/JAN/ig,"1");
	strDate = strDate.replace(/FEB/ig,"2");
	strDate = strDate.replace(/MAR/ig,"3");
	strDate = strDate.replace(/APR/ig,"4");
	strDate = strDate.replace(/MAY/ig,"5");
	strDate = strDate.replace(/JUN/ig,"6");
	strDate = strDate.replace(/JUL/ig,"7");
	strDate = strDate.replace(/AUG/ig,"8");
	strDate = strDate.replace(/SEP/ig,"9");
	strDate = strDate.replace(/OCT/ig,"10");
	strDate = strDate.replace(/NOV/ig,"11");
	strDate = strDate.replace(/DEC/ig,"12");

	fmtString = String(fmtString);

	// Automatically search for a seperation character if none is given
	if (!sepChar) {

		sepPos = (fmtString.search(/[-\/\\\.\|_#',]/));
		//'

		if (sepPos > -1) {
			sepChar = fmtString.substr(sepPos,1);
			strDate = strDate.replace(/\D/ig, sepChar);
		} else {
			sepChar = "-";
		}

	}

	// Get the date format
	var dateFormat = fmtString.split(sepChar);
	if (dateFormat[1] == 'd') indexDay = 1;
	if (dateFormat[2] == 'd') indexDay = 2;
	if (dateFormat[0] == 'm') indexMonth = 0;
	if (dateFormat[2] == 'm') indexMonth = 2;
	if (dateFormat[0] == 'y' || dateFormat[0] == 'Y') indexYear = 0;
	if (dateFormat[1] == 'y' || dateFormat[1] == 'Y') indexYear = 1;
	useFullYear = (dateFormat[0] == 'Y' || dateFormat[1] == 'Y' || dateFormat[2] == 'Y');

	// Get the values
	if (typeof(inDate) == "object" && (isDefined(inDate.getDate()) && isDefined(inDate.getMonth()) && isDefined(inDate.getFullYear()))) {
		retVal[indexDay] = String(inDate.getDate());
		retVal[indexMonth] = String(inDate.getMonth() + 1);
		retVal[indexYear] = String(inDate.getFullYear());
	} else {
		retVal = strDate.split(sepChar);
	}

	// Remove all non-numeric characters
	if (retVal[indexYear]) retVal[indexYear] = retVal[indexYear].replace(/\D/ig,"");
	if (retVal[indexMonth]) retVal[indexMonth] = retVal[indexMonth].replace(/\D/ig,"");
	if (retVal[indexDay]) retVal[indexDay] = retVal[indexDay].replace(/\D/ig,"");

	// Make sure to get a full date
	if (retVal[indexYear] || retVal[indexMonth] || retVal[indexDay]) {
		if (!retVal[indexYear]) retVal[indexYear] = "00";
		if (!retVal[indexMonth]) retVal[indexMonth] = "1";
		if (!retVal[indexDay]) retVal[indexDay] = "1";
	}

	// year
	if (retVal[indexYear]) {

		retVal[indexYear] = formatYear(retVal[indexYear], useFullYear);

	}

	// month
	if (retVal[indexMonth]) {

		if (Number(retVal[indexMonth]) > 12) retVal[indexMonth] = "12";
		if (Number(retVal[indexMonth]) < 1) retVal[indexMonth] = "1";
		retVal[indexMonth] = strPad("0",2 - retVal[indexMonth].length) + retVal[indexMonth];

	}

	// day
	if (retVal[indexDay]) {

		var leapYear;
		var mDays;

		if (retVal[indexYear]) leapYear = ((retVal[indexYear] % 4 == 0) || (retVal[indexYear] % 100 == 0) || (retVal[indexYear] % 400 == 0));
		if (Number(retVal[indexMonth]) == 2) {

			if (leapYear) {
				mDays = 29;
			} else {
				mDays = 28;
			}

		} else {

			mDays = ((retVal[indexMonth] - (retVal[indexMonth] < 8 ? 1 : 0)) % 2 == 0 ? 31 : 30);

		}

		if (Number(retVal[indexDay]) > mDays) retVal[indexDay] = String(mDays);
		if (Number(retVal[indexDay]) < 1) retVal[indexDay] = "1";
		retVal[indexDay] = strPad("0",2 - retVal[indexDay].length) + retVal[indexDay];
	}

	// Set the object properties
	if (!retVal[indexYear]) this.year = "";
	else this.year = retVal[indexYear];
	if (!retVal[indexMonth]) this.month = "";
	else this.month = retVal[indexMonth];
	if (!retVal[indexDay]) this.day = "";
	else this.day = retVal[indexDay];
	this.indexDay = indexDay;
	this.indexMonth = indexMonth;
	this.indexYear = indexYear;
	this.dateformat = fmtString;
	this.sepchar = sepChar;
	this.dateString = new getDateString(this);

}

// Returns a date string formatted according to the dateObject's dateformat setting
function getDateString(dateObject) {

	if (dateObject.day || dateObject.month || dateObject.year) {
		var retVal = dateObject.dateformat;
		retVal = retVal.replace(/d/ig, dateObject.day);
		retVal = retVal.replace(/m/ig, dateObject.month);
		retVal = retVal.replace(/y/ig, dateObject.year);
	} else {
		retVal = "";
	}

	return retVal;

}

// Compares two CompatibleDate objects
function compareDates(dateA, dateB) {

	if (dateA.year < dateB.year || (dateA.year == dateB.year && (dateA.month < dateB.month || (dateA.month == dateB.month && dateA.day < dateB.day)))) {
		return -1;
	} else if (dateA.year > dateB.year || (dateA.year == dateB.year && (dateA.month > dateB.month || (dateA.month == dateB.month && dateA.day > dateB.day)))) {
		return 1;
	} else {
		return 0;
	}

}

// -- Date popup window ------------------------------------------------------------------------------------------------------------------------

// Opens the date window and preselects a date when available
function openDate(parentElementId, dateFormat, sessid, lngcode) {

	dateClosed();

	var pElement = document.getElementById(parentElementId);
	if (pElement) {

		var pval = pElement.value;
		var pcnt = document.getElementById(parentElementId + '_LISTCONTAINER');
		var offset = new totalElementOffset(pElement.parentNode);
		var winCaption = getFieldLabel(pElement);
		var iframe = document.createElement('IFRAME');
		currentDateFormat = dateFormat;
		//pElement.parentNode.appendChild(iframe);
		pcnt.appendChild(iframe);

		iframe.id = 'ctrl_dte_popup';
		iframe.className = 'ctrl_dte_popup';
		//iframe.style.left = offset.x + 'px';
		//iframe.style.top = (offset.y + pElement.parentNode.offsetHeight - 2) + 'px';

		if (pval.length > 0) {
			var selDate = new createCompatibleDate(pval, dateFormat);
			iframe.src = "/htmlcontrols/calendar/calendar.php?target_id=" + parentElementId + "&day=" + selDate.day + "&month=" + selDate.month + "&year=" + formatYear(selDate.year, true) + "&windowTitle=" + winCaption + "&PHPSESSID=" + sessid + "&lngcode=" + lngcode;
		} else {
			iframe.src = "/htmlcontrols/calendar/calendar.php?target_id=" + parentElementId  + "&windowTitle=" + winCaption + "&PHPSESSID=" + sessid + "&lngcode=" + lngcode;
		}

	} else {

		alert("No valid parent element");

	}

}

// Called by calendar.php when the user selects a date in the date window
function dateSelected(forElementId, dateValue) {

	if (forElementId) {

		var tmpDate = new createCompatibleDate(dateValue, currentDateFormat);
		var tmpDateString = getDateString(tmpDate);
		var elm = document.getElementById(forElementId);

		if (elm) {
			document.getElementById(forElementId).value  = tmpDateString;
			if (elm.onchange) elm.onchange();
		}

		if (document.getElementById(forElementId + '_DISPLAY')) document.getElementById(forElementId + '_DISPLAY').value = tmpDateString;


	}

	dateClosed();

}

function dateClosed() {

	var pPopup = document.getElementById('ctrl_dte_popup');
	if (pPopup) pPopup.parentNode.removeChild(pPopup);

}

function isDefined(inVal) {
	return (!isNaN(parseInt(inVal)));
}
