﻿
// localized texts goes here
var dpTodayText = parent.TextDpToday;
var dpNeverText = parent.TextDpNever;
var dpSelectDateText = parent.TextDpHeader;
var dpDays = new Array(parent.TextDayName0, parent.TextDayName1, parent.TextDayName2, parent.TextDayName3, 
						parent.TextDayName4, parent.TextDayName5, parent.TextDayName6);
var dpMonths = new Array(parent.TextMonthName0, parent.TextMonthName1, parent.TextMonthName2, parent.TextMonthName3, 
							parent.TextMonthName4, parent.TextMonthName5, parent.TextMonthName6, parent.TextMonthName7, 
							parent.TextMonthName8, parent.TextMonthName9, parent.TextMonthName10, parent.TextMonthName11);

// date format
var dpDateFormat = parent.TextDateFormat;
// "today" (as seen by the server)
var dpNowDateDay = parseInt(parent.TextTodayDay);
var dpNowDateMonth = parseInt(parent.TextTodayMonth);
var dpNowDateYear = parseInt(parent.TextTodayYear);
// the date separator (e.g. "/" in "01/01/2006")
var dpDateSeparator = parent.TextDpDateSeparator;

// day correction 
// - setting offset = 1 makes monday the first row in the datepicker
// - setting offset = 0 makes sunday the first row in the datepicker
var dayOffset = 1;

// misc. prefix values
var dpIdPrefix = "swdp_";
var dpFrameIdPrefix = "swdpf_";
var dpDayFieldPrefix = "swday";
var dpMonthFieldPrefix = "swmonth";
var dpYearFieldPrefix = "swyear";

// currently visible (last shown) date picker
var dpCurrent = null;

// init datepicker
function dpInit(dpId) {
	var newId = dpIdPrefix + dpId;
	var newFrameId = dpFrameIdPrefix + dpId;
	var dp = document.getElementById(newId);
	var bInsideRowBuilder = false;	// CORE-5135
	
	if(dp==null) {
		var targetNode = document.getElementById("FormContainer");
		
		// create iframe to put behind datepicker
		var dpFrame = document.createElement("IFRAME");
		dpFrame.style.cssText = "position:absolute;visibility:visible;";
		dpFrame.frameBorder = 0;
		dpFrame.id = newFrameId;
		targetNode.appendChild(dpFrame)
		// create datepicker container
		var dp = new Element("div");
		dp.className = "dpContainer";
		dp.id = newId;
		// store frame id on div
		dp.frameId = dpFrame.id;
		targetNode.appendChild(dp)
		var dpInput = $(dpId);	// like document.getElementById(), but returns extended element (Prototype)

		// Position by cloning the position of the input field, adding offsets defined in Constants.js
		dp.clonePosition(dpInput, {
			setWidth: false,
			setHeight: false,
			offsetLeft: DateSelectorOffsetLeft,
			offsetTop: DateSelectorOffsetTop
		});
	} else {
		document.getElementById(newFrameId).style.visibility = "visible";
		document.getElementById(newId).style.visibility = "visible";
	}
	
	if(dpCurrent!=null && dpCurrent.id!=dp.id) {
		dpHide(dpCurrent.id);
	}
	dpCurrent = dp;
	
	var currentDate = dpGetCurrentlySelectedDate(dpId);	
	
	dpShow(currentDate, dp, currentDate);
}

// retrieves the currently selected date (if any)
function dpGetCurrentlySelectedDate(dpId) {
	if(dpId.indexOf(dpIdPrefix)>=0) {
		dpId = dpId.substr(dpIdPrefix.length);
	}

	var day = document.getElementById(dpDayFieldPrefix + dpId).value;
	var month = document.getElementById(dpMonthFieldPrefix + dpId).value;
	var year = document.getElementById(dpYearFieldPrefix + dpId).value;
	
	var currentDate = "";	
	if(day!="" && day!="-1" && 
		month!="" && month!="-1" && 
		year!="" && year!="-1") {
		currentDate = new Date();
		currentDate.setDate(day);
		currentDate.setMonth(month);
		currentDate.setYear(year);
	}

	return currentDate;
}

// wether or not to use the "never" option
function dpUseNever(dpId) {
	if(dpId.indexOf(dpIdPrefix)>=0) {
		dpId = dpId.substr(dpIdPrefix.length);
	}
	return (document.getElementById(dpId).useNever.toLowerCase()=="true");
}


// set date and hide datepicker
function dpSetDate(dateString, dpId) {
	var dpInputId = dpId.substr(dpIdPrefix.length);
	var dpInput = document.getElementById(dpInputId);

	if(dateString=="never") {
		// set "never" values
		dpInput.value = dpNeverText;
		dpSetHiddenFields(dpInputId, -1, -1, -1);
	}
	else {
		// set selected date values
		var newDate = new Date(dateString);
		dpInput.value = dpFormatDate(newDate);
		dpSetHiddenFields(dpInputId, newDate.getDate(), newDate.getMonth(), newDate.getFullYear());
	}
	
	// hide datepicker
	dpHide(dpId);
}

function dpFormatDate(newDate) {
	var day = String(newDate.getDate());	
	var month = String(newDate.getMonth()+1);
	var year = String(newDate.getFullYear());
	var dateString = "";
	// format date string according to current date format
	switch(dpDateFormat) {
		case "MMDDYY":
			dateString = dpAddPrefixZero(month) + dpDateSeparator + dpAddPrefixZero(day) + dpDateSeparator + dpGetShortYear(year);
			break;
		case "DDMMYY":
			dateString = dpAddPrefixZero(day) + dpDateSeparator + dpAddPrefixZero(month) + dpDateSeparator + dpGetShortYear(year);
			break;
		case "MMDDYYYY":
			dateString = dpAddPrefixZero(month) + dpDateSeparator + dpAddPrefixZero(day) + dpDateSeparator + year;
			break;
		case "DDMMYYYY":
		default:
			dateString = dpAddPrefixZero(day) + dpDateSeparator + dpAddPrefixZero(month) + dpDateSeparator + year;
			break;
	}
	return dateString;	
}
function dpAddPrefixZero(s) {
	if(s.length<2) {
		return ("0"+s);
	}
	return s;
}
function dpGetShortYear(year) {
	if(year.length>2) {
		return year.substr(2);
	}
	return year;
}

// set "never" date
function dpSetNeverDate(dpId) {
	dpSetDate("never", dpId);
}

// update datepicker hidden fields
function dpSetHiddenFields(dpInputId, dayValue, monthValue, yearValue) {
	document.getElementById(dpDayFieldPrefix + dpInputId).value = dayValue;
	document.getElementById(dpMonthFieldPrefix + dpInputId).value = monthValue;
	document.getElementById(dpYearFieldPrefix + dpInputId).value = yearValue;
}

// hide datepicker 
function dpHide(dpId) {
	// hide datepicker and it's frame
	var dp = document.getElementById(dpId);
	document.getElementById(dp.frameId).style.visibility = "hidden";
	dp.style.visibility = "hidden";
}

// update datepicker (when changing month/year)
function dpUpdate(dateString, dpId) {
	var dp = document.getElementById(dpId);
	var curDate = dpGetCurrentlySelectedDate(dpId);
	dpShow(dateString, dp, curDate);
}

// show the datepicker
function dpShow(dateString, dp, currentSelectedDate) {
	dp.innerHTML = "";
	var curDate;
	// date to display
	if(dateString==null || dateString=="") {
		curDate = new Date();
	}
	else {
		curDate = new Date(dateString);		
	}
	// currently selected date
	if(currentSelectedDate==null || currentSelectedDate=="") {
		currentSelectedDate = new Date();
	}

	// current day in month
	var curDay = curDate.getDate();

	// date of first day in month (relative to current date)
	var startDate = new Date(curDate);
	startDate.setDate(1);
	// first day in month
	var startDay = startDate.getDay();
	startDay -= dayOffset;
	if(startDay<0) {
		startDay = 7 + startDay;
	}
	
	// create topbar (close button)
	dp.appendChild(dpCreateTopbar(dp.id));
	dp.appendChild(dpCreateClear());
	
	// create header (timenav etc)
	dp.appendChild(dpCreateHeader(dp.id, startDate));
	dp.appendChild(dpCreateClear());

	// append days header
	for(var i=dayOffset; i<7; i++) {
		dp.appendChild(dpCreateDayHeader(dpDays[i]));
	}
	for(var i=0; i<dayOffset; i++) {
		dp.appendChild(dpCreateDayHeader(dpDays[i]));
	}
	dp.appendChild(dpCreateClear());


	var counter = 0;

	// append "empty" days (from previous month)
	for(var i=0; i<startDay; i++) {
		counter++;
		dp.appendChild(dpCreateEmptyDay());
	}
	
	// append days in month
	var workingDate = new Date(startDate);
	var currentMonth = startDate.getMonth();
	while(workingDate.getMonth()==currentMonth) {
		if(counter==7) {
			// clear for every 7 days added
			counter = 0;
			dp.appendChild(dpCreateClear());
		}
		counter++;
		var highlight = ((currentSelectedDate.getYear()==workingDate.getYear()) && 
					(currentSelectedDate.getMonth()==workingDate.getMonth()) &&
					(currentSelectedDate.getDate()==workingDate.getDate())
				);
	
		dp.appendChild(dpCreateDay(workingDate, highlight, dp.id));
		workingDate.setDate(workingDate.getDate()+1);
	}

	// append "empty" days (from next month)
	for(var i=counter; i<7; i++) {
		dp.appendChild(dpCreateEmptyDay());
	}
	dp.appendChild(dpCreateClear());

	// append footer
	dp.appendChild(dpCreateFooter(dp.id));
	dp.appendChild(dpCreateClear());	

	// move iframe below datepicker	
	var dpFrame = document.getElementById(dp.frameId);
	dpFrame.style.left = dp.offsetLeft + "px";
	dpFrame.style.top = dp.offsetTop + "px";
	dpFrame.style.width = dp.offsetWidth + "px";
	dpFrame.style.height = dp.offsetHeight + "px";
	
//	document.getElementById("output").value = dp.outerHTML;
}

// create the topbar div
function dpCreateTopbar(dpId) {
	var div = document.createElement("DIV");
	div.className = "dpTopbar";
	
	var textField = document.createElement("DIV");
	textField.className = "dpTopbarText";
	textField.innerText = dpSelectDateText;
	div.appendChild(textField);

	var closeBtn = document.createElement("A");
	closeBtn.className = "dpTopbarClose";
	closeBtn.href="javascript:void(0);";
	closeBtn.onclick = new Function("dpHide('"+dpId+"');");
	div.appendChild(closeBtn);
	
	
	return div;
}

// create the header div
function dpCreateHeader(dpId, currentDate) {
	var div = document.createElement("DIV");
	div.className = "dpHeader";
	
	var textField = document.createElement("DIV");
	textField.className = "dpHeaderText";
	textField.innerText = dpMonths[currentDate.getMonth()] + " " + currentDate.getFullYear();
	
	var prevMonth = document.createElement("A");
	prevMonth.className = "dpTimeNav dpPrevMonth";
	var nextMonth = document.createElement("A");
	nextMonth.className = "dpTimeNav dpNextMonth";
	var prevYear = document.createElement("A");
	prevYear.className = "dpTimeNav dpPrevYear";
	var nextYear = document.createElement("A");
	nextYear.className = "dpTimeNav dpNextYear";
	
	div.appendChild(prevYear);
	div.appendChild(prevMonth);
	div.appendChild(textField);
	div.appendChild(nextYear);
	div.appendChild(nextMonth);
		
	var prevMonthDate = new Date(currentDate);
	prevMonthDate.setMonth(currentDate.getMonth()-1);
	prevMonth.onclick = new Function("dpUpdate("+prevMonthDate.getTime()+",'"+dpId+"');");

	var prevYearDate = new Date(currentDate);
	prevYearDate.setFullYear(currentDate.getFullYear()-1);
	prevYear.onclick = new Function("dpUpdate("+prevYearDate.getTime()+",'"+dpId+"');");

	var nextMonthDate = new Date(currentDate);
	nextMonthDate.setMonth(currentDate.getMonth()+1);
	nextMonth.onclick = new Function("dpUpdate("+nextMonthDate.getTime()+",'"+dpId+"');");

	var nextYearDate = new Date(currentDate);
	nextYearDate.setFullYear(currentDate.getFullYear()+1);
	nextYear.onclick = new Function("dpUpdate("+nextYearDate.getTime()+",'"+dpId+"');");

	return div;
}

// create a day header div
function dpCreateDayHeader(dayName) {
	var div = document.createElement("DIV");
	div.className = "dpDay dpDayHeader";
	div.innerText = dayName;
	return div;
}

// create an "empty" day item div
function dpCreateEmptyDay() {
	return dpCreateDay(null, false, '');
}

// create a day item div
function dpCreateDay(date, selectedDay, dpId) {
	var div = document.createElement("DIV");
	div.className = "dpDay";
	if(date==null) {
		div.className += " dpEmptyDay";
		return div;
	}

	if(selectedDay==true) {
		div.className += " dpSelectedDay";
	}
	var a = document.createElement("A");
	a.innerText = date.getDate();
	a.href = "javascript:void(0);";
	a.onclick = new Function("dpSetDate(" + date.getTime() + ", '" + dpId + "');");
	div.appendChild(a);
	return div;
}

// create the footer div
function dpCreateFooter(dpId) {
	var div = document.createElement("DIV");
	div.className = "dpFooter";
	
	// add "today" link
	var nowBtn = document.createElement("A");
	nowBtn.className = "dpFooterItem";
	nowBtn.href="javascript:void(0);";
	nowBtn.innerText = dpTodayText;
	// create date.Now from local datetime variables
	var nowDate = new Date();
	nowDate.setDate(dpNowDateDay);
	nowDate.setMonth(dpNowDateMonth-1);
	nowDate.setYear(dpNowDateYear);
	nowBtn.onclick = new Function("dpSetDate(" + nowDate.getTime() + ", '"+dpId+"');");
	div.appendChild(nowBtn);

	// show "never" link?
	if(dpUseNever(dpId)==true) {
		var spacing = document.createElement("DIV");
		spacing.className = "dpFooterItemSpacing";
		div.appendChild(spacing);
	
		var neverBtn = document.createElement("A");
		neverBtn.className = "dpFooterItem";
		neverBtn.href="javascript:void(0);";
		neverBtn.innerText = dpNeverText;
		neverBtn.onclick = new Function("dpSetNeverDate('"+dpId+"');");
		div.appendChild(neverBtn);
	}
	
	return div;
}


// create a "clear" div
function dpCreateClear() {
	var div = document.createElement("DIV");
	div.className = "dpclear";
	return div;
}

