Date.prototype.fromString = function(str){
	var tst_str = str.toLowerCase().replace(/(\s)*([\+|-])(\s)*/g, "$2");
	var brs_skip = false;
	if ((tst_str.indexOf("+") != -1) || (tst_str.indexOf("today-") != -1)
			|| (tst_str.indexOf("month-") != -1) || (tst_str.indexOf("year-") != -1))
		brs_skip = true;
	
	if (!brs_skip)
		var prs_dt = Date.parse(str.replace(/[-|\\]/g,"/"));
	else
		var prs_dt = str.toInt();
		
	if (isNaN(prs_dt)){
		var y = this.getFullYear(), m = this.getMonth(), d = this.getDate();
		
		str = str.toLowerCase().replace(/(\s)*([\+|-])(\s)*/g, "$2");
		
		str = str.replace("yesterday", "today-1")
				.replace("tomorrow", "today+1")
				.replace("last month", "month-1")
				.replace("next month", "month+1")
				.replace("last year", "year-1")
				.replace("next year", "year+1");
		
		if(str.indexOf("today+") >= 0)
			d = d+str.replace("today+","").toInt();
		else if(str.indexOf("today-") >= 0)
			d = d-str.replace("today-","").toInt();
		else if(str.indexOf("month+") >= 0){
			m = m+str.replace("month+","").toInt();
			var mx_dys = new Date(y, m, 1).daysInMonth();
			if (d > mx_dys) d = mx_dys;
		}
		else if(str.indexOf("month-") >= 0){
			m = this.getMonth()-str.replace("month-","").toInt();
			var mx_dys = new Date(y, m, 1).daysInMonth();
			if (d > mx_dys) d = mx_dys;
		}
		else if(str.indexOf("year+") >= 0){
			y = y+str.replace("year+","").toInt();
			var mx_dys = new Date(y, m, 1).daysInMonth();
			if (d > mx_dys) d = mx_dys;
		}
		else if(str.indexOf("year-") >= 0){
			y = this.getFullYear()-str.replace("year-","").toInt();
			var mx_dys = new Date(y, m, 1).daysInMonth();
			if (d > mx_dys) d = mx_dys;
		}
		var ndt = new Date(y,m, d, this.getHours(), this.getMinutes(), this.getSeconds(), this.getMilliseconds());
		/*this.setFullYear(y);
		this.setMonth(m);
		this.setDate(d);*/
	}
	else {
		//this.setTime(prs_dt);	
		var ndt = new Date(prs_dt);
	}
	return ndt;
};

function ini_calendars(suffix){
	create_calendars("_a"+suffix);
	create_calendars("_l"+suffix);
}

function create_calendars(suffix){
	$('monthyearsel'+suffix).addEvent("change", function(){
		var valarr = this.value.split("-");
		var dt = new Date(valarr[1], valarr[0], 1);
		set_daydate_dropdown(new Date(dt.getTime()), suffix);
		
		if ($defined(cals_arr['cal'+suffix].options.selectedDate)){
			dt.setDate(cals_arr['cal'+suffix].options.selectedDate.getDate());
		}
		if (suffix.indexOf("_l_") != -1 ) ng_close_travel_cal = false;
		if (dt.getTime() < cals_arr['cal'+suffix].options.startDate.getTime())
			dt.setTime(cals_arr['cal'+suffix].options.startDate.getTime());
		cals_arr['cal'+suffix].selectDate(dt);
		cals_arr['cal'+suffix].updateCalendar(dt);
	});
	
	$('daydatesel'+suffix).addEvent("change", function(){
		var valarr = $('monthyearsel'+suffix).value.split("-");
		var dt = new Date(valarr[1], valarr[0], this.value);
		if (suffix.indexOf("_l_") != -1 ) ng_close_travel_cal = false;
		cals_arr['cal'+suffix].selectDate(dt);
	});
	
	ng_all_travel_cals.push(suffix.replace("_a_", "_").replace("_l_", "_"));
	$('cal_icon'+suffix).addEvent("click", function(){
		var suf = suffix.replace("_a_", "_").replace("_l_", "_");
		var dv = $('cals_div'+suf);
		if (dv.getStyle('display') == 'none'){
			close_all_ng_travle_cals(suf);
			dv.setStyle('display', '');
		}
		else {
			dv.setStyle('display', 'none');
		}
	});
	
	if (suffix.indexOf('_a_') != -1){
		var st_dt = new Date();
		var sel_func = function(){
			var cal = cals_arr['cal'+suffix];
			var sec_cal = cals_arr['cal'+(suffix.replace('_a_', '_l_'))];
			
			sec_cal.options.startDate = cal.date.fromString("today+1");
			
			if ($defined(sec_cal.options.selectedDate)){
				if (cal.date.getTime() >=  sec_cal.options.selectedDate.getTime()){
					ng_close_travel_cal = false;
					var dt = cal.date.fromString('today+1');
					sec_cal.selectDate(dt);
					sec_cal.updateCalendar(dt);
				}
				else {
					sec_cal.updateCalendar(sec_cal.date);
				}
			}
			else {
				ng_close_travel_cal = false;
				var dt = cal.date.fromString('today+1');
				sec_cal.selectDate(dt);
				sec_cal.updateCalendar(dt);
			}
			
			$('day_field'+suffix).value = cal.date.getDate();
			$('month_field'+suffix).value = cal.date.getMonth() + 1;
			$('year_field'+suffix).value = cal.date.getFullYear();
			
			select_dropdown_by_val('daydatesel'+suffix, cal.date.getDate());
			set_monthyear_dropdown(suffix.replace('_a_', '_l_'));
		};
		
		var unsel_func = function(){
			$('day_field'+suffix).value = "";
			$('month_field'+suffix).value = "";
			$('year_field'+suffix).value = "";
			
			var cal = cals_arr['cal'+suffix];
			var sec_cal = cals_arr['cal'+(suffix.replace('_a_', '_l_'))];
			
			set_monthyear_dropdown(suffix.replace('_a_', '_l_'));
			(function(){
					  	if (!$defined(cal.options.selectedDate)){
							var dt = cal.options.startDate.fromString('today+1');
							sec_cal.options.startDate = dt;
							sec_cal.updateCalendar(sec_cal.date);
						}
					  }.delay(100));
		};
	}
	else{
		var st_dt = new Date();
		st_dt.setDate(st_dt.getDate() + 1);
		var sel_func = function(){
			var cal = cals_arr['cal'+suffix];
			$('day_field'+suffix).value = cal.date.getDate();
			$('month_field'+suffix).value = cal.date.getMonth() + 1;
			$('year_field'+suffix).value = cal.date.getFullYear();
			
			select_dropdown_by_val('daydatesel'+suffix, cal.date.getDate());
			
			(function (){
			   if (!ng_close_travel_cal){
					ng_close_travel_cal = true;
					return;
				}
				var suf = suffix.replace("_a_", "_").replace("_l_", "_");
				$('cals_div'+suf).setStyle('display', 'none');
			}.delay(200));
		};
		
		var unsel_func = function(){
			$('day_field'+suffix).value = "";
			$('month_field'+suffix).value = "";
			$('year_field'+suffix).value = "";
		};
	}
	
	var end_dt = new Date();
	end_dt.setFullYear(end_dt.getFullYear() + 1);
	cals_arr['cal'+suffix] = new Calendar('cal_td'+suffix, null, {idPrefix: 'cal'+suffix,
											inputType:'none',
											visible: true,
											startDay:1,
											startDate:st_dt,
											endDate: end_dt,
											onSelect: sel_func,
											onUnSelect: unsel_func,
											allowWeekendSelection:true,
											
											// localization object
											language: cal_language,
											onCalendarLoad: function(){
												var updt_drop = true;
												if ($('monthyearsel'+suffix).value != ""){
													var arr = $('monthyearsel'+suffix).value.split("-");
													if ((arr[0] == this.date.getMonth()) && (arr[1] == this.date.getFullYear())){
														updt_drop = false;
													}
												}
												if (updt_drop)
													select_dropdown_by_val('monthyearsel'+suffix, this.date.getMonth()+'-'+this.date.getFullYear());
												var valarr = $('monthyearsel'+suffix).value.split("-");
												var dt = new Date(valarr[1], valarr[0], 1);
												set_daydate_dropdown(new Date(dt.getTime()), suffix);
												
												if (($defined(cals_arr['cal'+suffix]))
													&& ($defined(cals_arr['cal'+suffix].options.selectedDate))){
													select_dropdown_by_val('daydatesel'+suffix, this.options.selectedDate.getDate());
												}
											}});
											
	// creating the two drop down menus
	set_daydate_dropdown(new Date(), suffix);
	set_monthyear_dropdown(suffix);
	
	if (suffix.indexOf('_l_') != -1){
		if ($('day_field'+suffix).value == ""){
			cals_arr['cal'+suffix].selectDate(cals_arr['cal'+suffix.replace('_l_', '_a_')].options.startDate.fromString('today+1'));
		}
		else {
			var dt = new Date($('year_field'+suffix).value,
						$('month_field'+suffix).value.toInt() - 1,
						$('day_field'+suffix).value);
			cals_arr['cal'+suffix].updateCalendar(dt);
			cals_arr['cal'+suffix].selectDate(dt);
		}
		
		if ($('day_field'+suffix.replace('_l_', '_a_')).value == ""){
			cals_arr['cal'+suffix.replace('_l_', '_a_')].selectDate('today');
		}
		else {
			var dt = new Date($('year_field'+suffix.replace('_l_', '_a_')).value,
						$('month_field'+suffix.replace('_l_', '_a_')).value.toInt() - 1,
						$('day_field'+suffix.replace('_l_', '_a_')).value);
			cals_arr['cal'+suffix.replace('_l_', '_a_')].updateCalendar(dt);
			cals_arr['cal'+suffix.replace('_l_', '_a_')].selectDate(dt);
			
		}
	}
	
}

// setting variables for general text us
var dateday_format = "D j";
var monthyear_format = "M 'y";
var cals_arr = {};
	
// date and day drop down
function set_daydate_dropdown(dt, suffix){
	if (!$defined(cals_arr['cal'+suffix])) return;
	dt.setDate(1);
	var mn = dt.getMonth();
	dt.setHours(0); dt.setMinutes(0); dt.setSeconds(0); dt.setMilliseconds(0);
	var endtm = cals_arr['cal'+suffix].options.endDate.getTime();
	
	if (dt.getTime() < cals_arr['cal'+suffix].options.startDate.getTime()){
		dt.setTime(cals_arr['cal'+suffix].options.startDate.getTime());
	}
	
	var opt;
	var daydate = $('daydatesel'+suffix);
	daydate.set("html", "");
	while (dt.getMonth() == mn){
		opt = document.createElement("option");
		opt.innerHTML = dt.print(dateday_format, cal_language);
		opt.value = dt.getDate();
		daydate.appendChild(opt);
		dt.setDate(dt.getDate() + 1);
		if (dt.getTime() > endtm){
			break;
		}
	}
};

function set_monthyear_dropdown(suffix){
	if (!$defined(cals_arr['cal'+suffix])) return;
	// month and year drop down
	var dt = new Date(cals_arr['cal'+suffix].options.startDate.getTime());
	dt.setDate(1);
	dt.setHours(0); dt.setMinutes(0); dt.setSeconds(0); dt.setMilliseconds(0);
	var endtm = cals_arr['cal'+suffix].options.endDate.getTime();
	
	var mnyr = $('monthyearsel'+suffix);
	mnyr.set("html", "");
	var opt;
	for (var i=0; i<13; i++){
		opt = document.createElement("option");
		opt.value = dt.getMonth()+"-"+dt.getFullYear();
		if ($defined(cals_arr['cal'+suffix].options.selectedDate)){
			if (opt.value == cals_arr['cal'+suffix].options.selectedDate.getMonth()+"-"+cals_arr['cal'+suffix].options.selectedDate.getFullYear())
				opt.selected = "selected";
		}
		opt.innerHTML = dt.print(monthyear_format, cal_language);
		mnyr.appendChild(opt);
		dt.setMonth(dt.getMonth()+1);
		if (dt.getTime() > endtm)
			break;
	}
};

var ng_close_travel_cal = true;
// function to help selecting a drop down value
function select_dropdown_by_val (id, val){
	var opts = $(id).getElementsByTagName('option');
	for (var i=0; i<opts.length; i++){
		if (opts[i].value == val){
			$(id).selectedIndex = i;
			break;
		}
	}
};

var ng_all_travel_cals = [];

function close_all_ng_travle_cals(ex){
	for (var i=0; i<ng_all_travel_cals.length; i++){
		if (ng_all_travel_cals[i] != ex){
			$('cals_div'+ng_all_travel_cals[i]).setStyle('display', 'none');
		}
	}
};
