

 var hasOutBeenPrevSet = false;
 var hasInBeenPrevSet = false;
 var OUT = "out";
 var IN = "in";
 var MAXCITYPAIRS = 6;
 var FUTUREDAYS = 7;
 var reCP = /\{FIELDINDEX\}/g;
 var activatedCalendar = null;
 
function Calendar(dayFieldBase, monthFieldBase, dayOfWeekFieldBase, dateFieldIndexes) {
	this.DAYFIELDBASE = dayFieldBase;
	this.DATEFIELDINDEXES = dateFieldIndexes;
	this.MONTHFIELDBASE = monthFieldBase;
	this.DAYOFWEEKFIELDBASE = dayOfWeekFieldBase;
}
Calendar.prototype.getDayField = function(index) {
	return getObj(this.DAYFIELDBASE.replace(reCP, this.DATEFIELDINDEXES[index]));
}
Calendar.prototype.getMonthField = function(index) {
	return getObj(this.MONTHFIELDBASE.replace(reCP, this.DATEFIELDINDEXES[index]));
}
Calendar.prototype.getDayOfWeekField = function(index) {
	return getObj(this.DAYOFWEEKFIELDBASE.replace(reCP, this.DATEFIELDINDEXES[index]));
}
Calendar.prototype.doUpdateDayOfWeek=function(index) {
	var d = this.getDayField(index).value;
	var aMY = this.getMonthField(index).value.split("/");
	if( isNaN( parseInt(aMY[0]))) {
		aMY = this.getMonthField(index).value.split(" ");
		aMY[0] = convertMonth(aMY[0]);
		aMY = aMY[0] + "/" + aMY[1];
		aMY = aMY.split("/");
	
	}
	var date = new Date(aMY[1],aMY[0]-1,d);

	
	if(this.getDayOfWeekField(index) != null)
		this.getDayOfWeekField(index).value = DAYS_OF_WEEK[date.getDay()];
}
Calendar.prototype.doUpdateDateFields = function(index, updateDayOfWeek, useFutureDays)
{
	var dayField = this.getDayField(index);
	var monthField = this.getMonthField(index);

	if(dayField == null || monthField == null) return;
	
	
	var day = dayField.value;
	var aMY = monthField.value.split("/");
	if( isNaN( parseInt(aMY[0]))) {
		aMY = monthField.value.split(" ");
		aMY[0] = convertMonth(aMY[0]);
		aMY = aMY[0] + "/" + aMY[1];
		aMY = aMY.split("/");
	
	}
	var date = new Date(aMY[1],aMY[0]-1,day);
	this.updateDateFields(date, dayField, monthField);
	if(updateDayOfWeek) this.doUpdateDayOfWeek(index);
		
	
	var nextDayField = this.getDayField(index+1);
	var nextMonthField = this.getMonthField(index+1);
	if( nextDayField != null && nextMonthField != null) {
		var nextDay = nextDayField.value;
		var aNextMY = nextMonthField.value.split("/");
		if( isNaN( parseInt(aNextMY[0]))) {
			aNextMY = nextMonthField.value.split(" ");
			aNextMY[0] = convertMonth(aNextMY[0]);
			aNextMY = aNextMY[0] + "/" + aNextMY[1];
			aNextMY = aNextMY.split("/");

		}
		var nextDate = new Date(aNextMY[1],aNextMY[0]-1,nextDay);
	
		if(date > nextDate)
		{
			nextDate = date;
	
			if(useFutureDays) nextDate.setDate(nextDate.getDate() + FUTUREDAYS);
			this.updateDateFields(nextDate, nextDayField, nextMonthField);
		}
		if(updateDayOfWeek)	this.doUpdateDayOfWeek(index+1);
		this.doUpdateDateFields(index+1, updateDayOfWeek, useFutureDays);
	}
}
Calendar.prototype.updateDateFields = function(date, dayField, monthField)
{
	
	var sValue = "";
	if(date.getMonth()+1<10)
		sValue = "0" + (date.getMonth()+1) + "/" + date.getFullYear();
	else
		sValue = date.getMonth()+1  + "/" + date.getFullYear();
	var aMY = monthField.value.split("/");
	if( isNaN( parseInt(aMY[0]))) {
		aMY = monthField.value.split(" ");
		var strMonth= convertBackMonth(date.getMonth()+1);
		monthField.value = strMonth +" "+date.getFullYear() ;
	}
	else
	monthField.value = sValue;
	
	if(date.getDate()<10)
		dayField.value = "0" + date.getDate();
	else
		dayField.value = date.getDate();
}
Calendar.prototype.getDateFromField = function(index) {
	var date = new Date();
	field = this.getDayField(index);
	date.setDate(field.value);
	
	field = this.getMonthField(index);
	var aMY = field.value.split("/");
	if( isNaN( parseInt(aMY[0]))) {
		aMY = this.getMonthField(index).value.split(" ");
		aMY[0] = convertMonth(aMY[0]);
				
	}
	date.setMonth(aMY[0]-1);
	date.setFullYear(aMY[1]);
	return date;
}
Calendar.prototype.showPopupCalendar = function(event, fieldIndex, url)
{	document.getElementById("popupDiv").style.display="block";
	this.updateDateField = fieldIndex;
	var date = this.getDateFromField(fieldIndex);
	if(url.indexOf("?") > -1) url+="&";
	else url+="?";
	url += "displayDate=" + date.getDate() + "." + (date.getMonth()+1) + "." + date.getFullYear();
	if(csLog.isDebugEnabled()) csLog.debug(url);

	
	activatedCalendar = this;
	doPopup(event,url, 258,210);

}
Calendar.prototype.updateDateFromCalendar = function(value)
{
	var field;
	var aValues = value.split(".");
	var date = new Date(aValues[2],aValues[1]-1,aValues[0]);
	var currentDate = new Date();
	if(date < currentDate)
	{
		alert(ERROR_BEFORE_CURRENT);
		return;
	}
	field = this.getDayField(this.updateDateField);
	field.value = date.getDate() < 10 ? "0" + date.getDate() : date.getDate();
	field = this.getMonthField(this.updateDateField);
	var aMY = field.value.split("/");
	if( isNaN( parseInt(aMY[0]))) {
		aMY = field.value.split(" ");
		var strMonth= convertBackMonth(date.getMonth()+1);
		field.value = strMonth +" "+date.getFullYear() ;
	}
	else
	field.value = date.getMonth() < 9 ? "0" + (date.getMonth()+1) + "/" + date.getFullYear() : (date.getMonth()+1) + "/" + date.getFullYear();
	this.doUpdateDateFields(this.updateDateField, true,false);
	activatedCalendar = null;
}
Calendar.prototype.updateReturnDate = function(fieldValue)
{
	var returnDateDiv = getObj('returnDateDiv');
	if(returnDateDiv == null)
		return;

	if(fieldValue == "R")
		returnDateDiv.style.display = "";
	else
		returnDateDiv.style.display = "none";
}
Calendar.prototype.doInitCalFields = function(index, updateDayOfWeek, useFutureDays) {

	var dayField = this.getDayField(index);;
	var monthField = this.getMonthField(index);
	if(dayField == null || monthField == null) {  return; }
	
	
	var day = dayField.value;
	var aMY = monthField.value.split("/");

	var setDate = new Date(aMY[1],aMY[0]-1,day);
	
	var date = new Date();
	if(setDate <= date) {
		if(useFutureDays) date.setDate(date.getDate()+FUTUREDAYS);
		this.updateDateFields(date, dayField, monthField);
	}
	this.doUpdateDateFields(index, updateDayOfWeek, useFutureDays);
	hasOutBeenPrevSet = false;
	hasInBeenPrevSet = false;
}
function updateDateFromCalendar(value)
{
	activatedCalendar.updateDateFromCalendar(value);
	activatedCalendar = null;
}
function convertMonth(value)
{
	var month1;
	switch(value){
	case "Jan": month1=1;break;
	case "Feb": month1=2;break;
	case "Mar": month1=3;break;
	case "Apr": month1=4;break;
	case "May": month1=5;break;
	case "Jun": month1=6;break;
	case "Jul": month1=7;break;
	case "Aug": month1=8;break;
	case "Sep": month1=9;break;
	case "Oct": month1=10;break;
	case "Nov": month1=11;break;
	case "Dec": month1=12;break;
	}
	return month1;
}
function convertBackMonth(value)
{
	var month1;
	switch(value){
	case 1: month1="Jan";break;
	case 2: month1="Feb";break;
	case 3: month1="Mar";break;
	case 4: month1="Apr";break;
	case 5: month1="May";break;
	case 6: month1="Jun";break;
	case 7: month1="Jul";break;
	case 8: month1="Aug";break;
	case 9: month1="Sep";break;
	case 10: month1="Oct";break;
	case 11: month1="Nov";break;
	case 12: month1="Dec";break;
	}
	return month1;
}
