function addEvent( obj, type, fn ) { 
  if ( obj.attachEvent ) { 
    obj['e'+type+fn] = fn; 
    obj[type+fn] = function(){obj['e'+type+fn]( window.event );} 
    obj.attachEvent( 'on'+type, obj[type+fn] ); 
  } else {
    obj.addEventListener( type, fn, false ); 
  }
}



var CURRENT_DATE = new Date();
var START_DATE = new Date();
var FUTURE_DATE = new Date();
FUTURE_DATE.setDate(CURRENT_DATE.getFullYear()+2,1,1);

StopTravelPeriod = false;
function getHiddenEndId()
{	return 'hiddenEnd';}
function getHiddenStartId()
{	return 'hiddenStart';}
function getSelectEndId()
{	return 'selectEnd';}  
function getSelectStartId()
{	return 'selectStart';}
var Start_BLOCKED_OUT_DAYS = new Array(-1,-1,-1,-1,-1,-1,-1);
var End_BLOCKED_OUT_DAYS = new Array(-1,-1,-1,-1,-1,-1,-1);
var Minimumdays = 1;
var Maximumdays = 0;




var BLOCKED_OUT_DAYS = new Array(-1,-1,-1,-1,-1,-1,-1);




var s = new Date();
var DISABLED_DAYS_OF_WEEK = [ ];
var calendarStart = null;
var calendarEnd = null;
var hiddentext;



function writeOptions() {
  for(i=0;i<12;i++) {
    then = new Date();
    then.setMonth(then.getMonth()+i);
    selectMonth = ((then.getMonth()+1)<10?'0':'') + (then.getMonth()+1)
    thenString = then.getFullYear() + '-' + selectMonth + '-01';
    thenDesc = Calendar._MN[then.getMonth()] + ' ' + then.getFullYear();
    selectedMonth = (i==0?' selected="selected"':'')
    document.write('<option value="' + thenString + '"'+ selectedMonth +'>' + thenDesc + '</option>');
  }
}

//when a day is clicked in the calendar
function Calendar_DateChanged(calendar) {
	if( calendar.dateClicked && calendar.calId == 'start' && calendarEnd != null) {
		refreshEndCalendar();
	}
}
function dateStatusHandler(date, y,	m, d) {
	return (dateIsDisabled(date, y,	m, d));
}
function dateStatusHandlerEnd(date, y, m, d) {
	return (dateIsDisabledEnd(date, y, m, d));
}
function dateIsDisabled(date, y, m,	d) {
	return (dateIsInThePast(date, y, m,	d) || dayIsInTheFutureStart(date, y, m, d)); 
}
function dateIsDisabledEnd(date,	y, m, d) {
	return (dateForEnd(date,	y, m, d) || dayIsInTheFuture(date, y, m, d));
}


//checks so the calendar only shows dates from today and foreward
function dateIsInThePast(date, y, m, d) {
	var	currentShortDate  =	new	Date(START_DATE.getFullYear(), START_DATE.getMonth(), START_DATE.getDate());
	var	calendarShortDate =	new	Date(date.getFullYear(), date.getMonth(), date.getDate());
	return (calendarShortDate <	currentShortDate);
}

function dateForEnd(date, y,m, d) {
	var	strHiddenValue = document.getElementById(getHiddenStartId()).value;
	var	currentShortDate;
	if (strHiddenValue.length >	0) {
		currentShortDate  =	new	Date(strHiddenValue.substring(0,4),	(strHiddenValue.substring(5,7) - 1), strHiddenValue.substring(8,10) );
		
    currentShortDate.setDate(currentShortDate.getDate()+ Minimumdays);		
	} else {
		currentShortDate  =	new	Date(CURRENT_DATE.getFullYear(), CURRENT_DATE.getMonth(), CURRENT_DATE.getDate());
	}
	var calendarShortDate =	new	Date(date.getFullYear(), date.getMonth(), date.getDate());
	
	return (calendarShortDate <	currentShortDate);
}

//checks so the calendar only shows 361, the variable FUTURE_DATE
function dayIsInTheFuture(date, y, m, d) {
	
	var	strHiddenValue = document.getElementById(getHiddenStartId()).value;
	var	currentShortDate;
	var Maxdays;
	
	if( strHiddenValue.length >	0 && StopTravelPeriod!=false && Maximumdays > 0 ) {
		Maxdays = new Date(strHiddenValue.substring(0,4),	(strHiddenValue.substring(5,7) - 1), strHiddenValue.substring(8,10) );
		Maxdays.setDate(Maxdays.getDate()+ Maximumdays);
		 
		var StopTravelDate = new	Date(FUTURE_DATE.getFullYear(), FUTURE_DATE.getMonth(), FUTURE_DATE.getDate());
		if ( StopTravelDate>Maxdays ) {
		  currentShortDate =new Date(Maxdays.getFullYear(),Maxdays.getMonth(),Maxdays.getDate());
		} else {
		  currentShortDate  =	new	Date(FUTURE_DATE.getFullYear(), FUTURE_DATE.getMonth(), FUTURE_DATE.getDate());
    }
	} else if( strHiddenValue.length >0 && StopTravelPeriod == false && Maximumdays > 0 ) {
	  Maxdays = new Date(strHiddenValue.substring(0,4),	(strHiddenValue.substring(5,7) - 1), strHiddenValue.substring(8,10) );
		Maxdays.setDate(Maxdays.getDate()+ Maximumdays); 
		currentShortDate =new Date(Maxdays.getFullYear(),Maxdays.getMonth(),Maxdays.getDate());
	} else {
		currentShortDate  =	new	Date(FUTURE_DATE.getFullYear(), FUTURE_DATE.getMonth(), FUTURE_DATE.getDate());
	}
	var stopShortDate=new Date(date.getFullYear(),date.getMonth(),date.getDate());
	
	return (stopShortDate >	currentShortDate);
}

function dayIsInTheFutureStart(date, y, m, d) {
	var currentShortDate =new	Date(FUTURE_DATE.getFullYear(), FUTURE_DATE.getMonth(), FUTURE_DATE.getDate());
	var stopShortDate=new Date(date.getFullYear(),date.getMonth(),date.getDate());

	return (stopShortDate >	currentShortDate);
}

function stringToDate(dateString) {
	var	y	 = dateString.substr(0,	4);
	var	m	 = dateString.substr(5,	2);
	var	d	 = dateString.substr(8,	2);
	var	date = new Date(y, (m -	1),	d);
	
  return date;
}

function dateToString(date) {
	var	y	 = date.getFullYear();
	var	m	 = date.getMonth();
	var	d	 = date.getDate();
	if (m == 0)	
		m =	12;	
	else if	(m < 10) m = "0"+ m;
	if (d <	10)	d =	"0"+ d;
	var	date = y +"-"+ m +"-"+ d;
	
  return date;
}

//helper function, ends a string representing the date, month is endet as the actual number not the index ie. january == 1 not 0
function getRealDateToString(date) {
	var	y	 = date.getFullYear();
	var	m	 = date.getMonth() + 1;
	var	d	 = date.getDate();
	if (m == 0)	
		m =	12;	
	else if	(m < 10) m = "0"+ m;
	if (d <	10)	d =	"0"+ d;
	var	date = y +"-"+ m +"-"+ d;
	
  return date;
}

//function is called from calendar dropdowns switches month in calendar
//if start calendar is changed, so is end calendar
function setCalendarDate(calendar, dateString, select) {
	var	currentDate		= stringToDate(dateString);
	var	strDateString =	dateString.substr(0,7)
	var	strHiddenValue = document.getElementById(calendar.txtHidden).value.substr(0,7)
	if ( strDateString == strHiddenValue ) {
		calendar.setSelected = true;
		calendar.setDate(stringToDate(document.getElementById(calendar.txtHidden).value));
	} else {
		calendar.setSelected = false;
		calendar.setDate(currentDate);
	}
	if( calendar.calId == 'start' ) {
		if ( calendarEnd != null ) {
			if ( document.getElementById(calendarEnd.txtHidden).value.length > 0 )
				return;
			calendarEnd.setSelected = false;
			if( document.getElementById(calendarStart.txtHidden).value.length > 0 ) {
				if( stringToDate( document.getElementById(calendarStart.txtHidden).value)  >= calendarStart.date ){
				setDropDown(document.getElementById(getSelectEndId()), document.getElementById(calendarStart.txtHidden).value);
				calendarEnd.setDate(stringToDate( document.getElementById(calendarStart.txtHidden).value));
				return;
				}
			}
				setDropDown(document.getElementById(getSelectEndId()), getRealDateToString(calendarStart.date));
				calendarEnd.setDate(calendarStart.date);
		}
	}
}

//initialize start calendar
function initStartCalendar() {
	calendarStart.flatCallback =	Calendar_DateChanged;
	calendarStart.weekNumbers = true;
	calendarStart.setDateStatusHandler(dateStatusHandler);
	calendarStart.txtHidden = getHiddenStartId();
	calendarStart.calId = 'start';
	//calendarStart.disableDayArr = BLOCKED_OUT_DAYS;
	calendarStart.disableDayArr = Start_BLOCKED_OUT_DAYS;
	calendarStart.create(document.getElementById('calendarStart'));
	if( document.getElementById(calendarStart.txtHidden).value.length > 0 ){
		calendarStart.setSelected = true;
		calendarStart.setDate(stringToDate(document.getElementById(calendarStart.txtHidden).value));
		setDropDown( document.getElementById(getSelectStartId()),document.getElementById(calendarStart.txtHidden).value);
	}
}


//initialize end calendar
function initEndCalendar() { 		
	calendarEnd.flatCallback	= Calendar_DateChanged;
	calendarEnd.weekNumbers = true;
	calendarEnd.setDateStatusHandler(dateStatusHandlerEnd);
	calendarEnd.txtHidden = getHiddenEndId();
	calendarEnd.calId = 'end';
	//calendarEnd.disableDayArr = BLOCKED_OUT_DAYS;
	calendarEnd.disableDayArr = End_BLOCKED_OUT_DAYS;
	calendarEnd.create(document.getElementById('calendarEnd'));
	if( document.getElementById(calendarEnd.txtHidden).value.length > 0 ){
		calendarEnd.setSelected = true;
		calendarEnd.setDate(stringToDate(document.getElementById(calendarEnd.txtHidden).value));
		setDropDown( document.getElementById(getSelectEndId()),document.getElementById(calendarEnd.txtHidden).value);
	} else {
		calendarEnd.setSelected = false;
		var obj = document.getElementById(getSelectStartId()).options
		calendarEnd.setDate(stringToDate(obj[obj.selectedIndex].value));
		setDropDown( document.getElementById(getSelectEndId()),obj[obj.selectedIndex].value);	
	}
}

//refreshes the endcalendar this is to disable dates when startcalendar is clicked
function refreshEndCalendar() {

	var tmpEndDate;
	if (document.getElementById(calendarEnd.txtHidden).value.length > 0) {
	
		tmpEndDate = stringToDate(document.getElementById(calendarEnd.txtHidden).value);
		var tmpStartDate = new Date( calendarStart.date.getFullYear(), calendarStart.date.getMonth(),calendarStart.date.getDate());
			
			if (tmpEndDate >= tmpStartDate){
				var	strHiddenRetValue = document.getElementById(calendarEnd.txtHidden).value.substr(0,7);
				var strRetdate = getRealDateToString(calendarEnd.date).substr(0,7);
				if (strRetdate == strHiddenRetValue){
					calendarEnd.setSelected = true;
					//calendarEnd.refresh();
					var retyearval=document.getElementById(calendarEnd.txtHidden).value.substr(0,4);
					var retmonthval=document.getElementById(calendarEnd.txtHidden).value.substr(5,2);
					var dateval=document.getElementById(calendarEnd.txtHidden).value.substr(8,2);
					if(dateIsDisabledEnd(tmpEndDate,retyearval,retmonthval,dateval)) {
					  calendarEnd.setSelected= false;
					  document.getElementById(calendarEnd.txtHidden).value = '';
					  if (document.getElementById(calendarStart.txtHidden).value.length > 0) {
              if (stringToDate( document.getElementById(calendarStart.txtHidden).value) >= calendarStart.date) {
                setDropDown(document.getElementById(getSelectEndId()), document.getElementById(calendarStart.txtHidden).value);
                calendarEnd.setDate(stringToDate( document.getElementById(calendarStart.txtHidden).value));
                return;
              }
					  }
					} else {
					  calendarEnd.setSelected = true;
            calendarEnd.setDate(stringToDate(document.getElementById(calendarEnd.txtHidden).value));
					}
					calendarEnd.refresh();
				}
			} else {
				calendarEnd.setSelected = false;
				document.getElementById(calendarEnd.txtHidden).value = '';
				calendarEnd.setDate( new Date( calendarStart.date.getFullYear(), calendarStart.date.getMonth(),01));
				setDropDown(document.getElementById(getSelectEndId()), getRealDateToString( calendarStart.date))	
				calendarEnd.refresh();
			}
	} else {
		if( new Date( calendarStart.date.getFullYear(), calendarStart.date.getMonth(),01) > new Date( calendarEnd.date.getFullYear(), calendarEnd.date.getMonth(),01) ) {
  		calendarEnd.setDate( new Date( calendarStart.date.getFullYear(), calendarStart.date.getMonth(),01));
  		setDropDown(document.getElementById(getSelectEndId()), getRealDateToString( calendarStart.date))
		}
		tmpEndDate = null; 
		
		calendarEnd.refresh();
		return;
	}
}

//sets the correct month for the calendar dropdowns
function setDropDown(obj, dateString){
	var tmpSet = dateString.substring(0,7)+ '-01'
	var selid = obj.selectedIndex;
	for(var i = 0;obj.options.length > i; i++ ){
		obj.options[i].disabled = false;
		if (obj.options[i].value == tmpSet){
			selid = i;
		}
	}
	obj.options[obj.selectedIndex].selected = false;
	obj.options[selid].selected = true;
}



function setupCalendar() {
  calendarStart = new Calendar(1, null, Calendar_DateChanged, null)
  initStartCalendar()
  calendarEnd = new Calendar(1, null, Calendar_DateChanged, null)
  initEndCalendar()
}
