function DoubleCalendar(id,df,dt,lockDays) {
	
	var obj;
	var left;
	var right;
	var paneWidth;
	var dayWidth;
	var month;
	var year;
	var mode;
	var dateFrom;
	var dateTo;
	var scroll;
	var scrollInner;
	var monthDivs;
	var baseMonth;
	var baseYear;
	var id;
	var fromInput;
	var toInput;
	var dayHv;
	var lockDays;
	
	this.init(id,df,dt,lockDays);
	
}

DoubleCalendar.prototype.init = function(id,df,dt,lockDays) {
	
	this.lockDays = lockDays;
	
	this.id = id;
	var fromDiv = $(this.id+'date_from_div');
	var toDiv = $(this.id+'date_to_div');
	
	this.fromInput = document.createElement('input');
	this.fromInput.id = this.id+'date_from';
	this.fromInput.name = this.fromInput.id;
	this.fromInput.type = 'text';
	$(this.fromInput).addClassName('gray');
	this.fromInput.obj = this;
	this.fromInput.readOnly = true;
	this.fromInput.onfocus = function() { this.blur(); }
	
	this.fromInput.onmouseover = function() { this.addClassName('hover'); }
	this.fromInput.onmouseout = function() { this.removeClassName('hover'); }
	
	this.toInput = document.createElement('input');
	this.toInput.id = this.id+'date_to';
	this.toInput.name = this.toInput.id;
	this.toInput.type = 'text';
	$(this.toInput).addClassName('gray');
	this.toInput.obj = this;
	this.toInput.readOnly = true;
	this.toInput.onfocus = function() { this.blur(); }
	
	if (!this.lockDays) {
		this.toInput.onmouseover = function(){
			this.addClassName('hover');
		}
		this.toInput.onmouseout = function(){
			this.removeClassName('hover');
		}
		
		this.toInput.onclick = function() { this.obj.open(2); }
	} else {
		$(this.toInput).addClassName('static');
	}
	
	fromDiv.appendChild(this.fromInput);
	toDiv.appendChild(this.toInput);
	
	this.fromInput.onclick = function() { this.obj.open(1); }	
	
	var combo = $$('.date_combo')[0];
	combo.obj = this;
	//combo.onclick = function() { this.obj.open(); }
	
	this.fromInput.value = df;
	this.toInput.value = dt;
	this.dayHv = false;
	
	this.dateFrom = df;
	this.dateTo = dt;
					
}

DoubleCalendar.prototype.open = function(mode) {
			
	if(!this.obj) {
		this.draw();		
	}
					
	if(mode == 1) {
		this.attach(this.id+'date_from_div');
		this.setStatus(Lang.get('dataPrzyjazdu'));
		this.resetDays();
	}
	if(mode == 2) {
		this.attach(this.id+'date_to_div');
		this.setStatus(Lang.get('dataWyjazdu'));
	}
	
	this.mode = mode;
	
	this.obj.show();
	$$('.date_combo')[0].addClassName('from');
	
	var ref = this;
		document.onclick = function(e) {			
			if (e) {
				var p = checkParent(e.target, ref.obj);
				var dates = $$('.column_dates')[0];
				var p2 = checkParent(e.target, dates);
				if (p && p2) {
					ref.close();
					delete document.onclick;
				}
			}
		}
		
	var fromObj = CalTools.getDate(this.dateFrom);
	var fromM = fromObj.getMonth();
	if(fromM > this.baseMonth) {
		var diff = fromM - this.baseMonth;
		for(var i = 0; i < diff; i++) {
			this.appendMonth(this.baseMonth+i,this.baseYear);
		}
		this.showMonth(fromM,this.baseYear,true);
	}
	
	this.getDayObj(CalTools.getDate(this.dateFrom)).addClassName('act');
	
}

DoubleCalendar.prototype.draw = function() {
	
	this.monthDivs = new Array;
	
	this.obj = this.createDiv(false,'DoubleCalendar');
	this.obj = $(this.obj);
	this.obj.style.position = 'absolute';
	this.obj.obj = this;
	
	this.obj.onclick = function() {
		if ((!this.obj.dayHv)&&(this.obj.mode == 2)) {
			//this.obj.cancelSelect();
		}
	}
	
	document.body.appendChild(this.obj);
	
	this.calculateSize();	
	this.drawNavi();
	
	this.scroll = this.createDiv(false,'CalScroll');
	this.scrollInner = this.createDiv(false,'CalScrollInner');
	this.scroll.style.position = 'relative';
	this.scrollInner.style.position = 'absolute';
	
	this.scroll.appendChild(this.scrollInner);
		
	this.obj.appendChild(this.scroll);
	
	var d = new Date();
	
	this.baseMonth = d.getMonth();
	this.baseYear = d.getFullYear();
	
	this.showMonth(this.baseMonth,this.baseYear,true);	
	//this.mode = 1;
	
}

DoubleCalendar.prototype.submit = function() {
	
	if (this.dateFrom && this.dateTo) {
		this.fromInput.value = this.dateFrom;
		this.toInput.value = this.dateTo;
		Reservation.updateRes();
	}
	this.close();
	
}

DoubleCalendar.prototype.close = function() {
	//$$('.date_combo')[0].removeClassName('from');
	//$$('.date_combo')[0].removeClassName('to');
	this.obj.hide();
}

DoubleCalendar.prototype.cancelSelect = function() {
	
	this.resetDays();
	this.mode = 1;
	
}

DoubleCalendar.prototype.calculateSize = function() {
	
	var w = this.obj.getWidth();	
	this.paneWidth = Math.floor(w/2);
	this.dayWidth = Math.floor(this.paneWidth/7);
	
}

DoubleCalendar.prototype.appendMonth = function(m,y) {
			
	var monthDiv = this.drawMonth(m,y);
	this.monthDivs[m] = monthDiv;	
			
}

DoubleCalendar.prototype.showMonth = function(m,y,quick) {
	if(!this.monthDivs[m]) { this.appendMonth(m,y); }
	if (!this.monthDivs[m + 1]) {
		this.appendMonth(m + 1, y);
	}
	var left = this.monthDivs[m].positionedOffset();
	
	this.month = m;
	this.year = y;
	
	var left = 0-left[0];
	var last = this.scrollInner.positionedOffset();
	if(left < last[0]) { var s = -20; } else { var s = 20; }
	
	if (!quick) {
		var p = {
			type: 'left',
			to: left,
			step: s,
			delay: 20
		}
		$fx(this.scrollInner).fxAdd(p).fxRun();
	} else {
				
		this.scrollInner.style.left = left+'px';
		
	}
	if(m == this.baseMonth) {
		this.obj.down('.CalBtnPrev').hide();
		this.obj.down('.CalPrevInfo').hide();
	} else {
		this.obj.down('.CalBtnPrev').show();
		this.obj.down('.CalPrevInfo').show();
	}
}

DoubleCalendar.prototype.nextMonth = function() {
	var y = this.year;
	var nm = this.month+1;
	if(nm > 11) {
		nm = 0; y++;
	}
	this.showMonth(nm,y);
}

DoubleCalendar.prototype.prevMonth = function() {
	var y = this.year;
	var nm = this.month-1;
	if(nm < 0) {
		nm = 11; y--;
	}
	this.showMonth(nm,y);
}

DoubleCalendar.prototype.drawNavi = function() {
	
	var btnPrev = this.createDiv(false,'CalBtnPrev');
	$(btnPrev).addClassName('CalBtn');
	
	var btnNext = this.createDiv(false,'CalBtnNext');
	$(btnNext).addClassName('CalBtn');
	
	btnPrev.obj = this;
	btnNext.obj = this;
	
	btnPrev.onclick = function() { this.obj.prevMonth(); }
	btnNext.onclick = function() { this.obj.nextMonth(); }
	
	btnPrev.onmouseover = function() { this.addClassName('hv'); }
	btnPrev.onmouseout = function() { this.removeClassName('hv'); }
	
	btnNext.onmouseover = function() { this.addClassName('hv'); }
	btnNext.onmouseout = function() { this.removeClassName('hv'); }
	
	this.obj.appendChild(btnNext);
	this.obj.appendChild(btnPrev);
	
	var nextInfo = this.createDiv(false,'CalNextInfo');
	nextInfo.addClassName('cinfo');
	nextInfo.innerHTML = Calendar._TT["NEXT_MONTH"];
	var prevInfo = this.createDiv(false,'CalPrevInfo');
	prevInfo.addClassName('cinfo');
	prevInfo.innerHTML = Calendar._TT["PREV_MONTH"];
	
	this.obj.appendChild(nextInfo);
	this.obj.appendChild(prevInfo);
	
	prevInfo.obj = this;
	nextInfo.obj = this;
	
	prevInfo.onmouseover = function() { this.addClassName('hv'); }
	prevInfo.onmouseout = function() { this.removeClassName('hv'); }
	
	nextInfo.onmouseover = function() { this.addClassName('hv'); }
	nextInfo.onmouseout = function() { this.removeClassName('hv'); }
	
	prevInfo.onclick = function() { this.obj.prevMonth(); }
	nextInfo.onclick = function() { this.obj.nextMonth(); }
	
	//this.status = this.createDiv(false,'CalStatus');
	var statusDate = this.createDiv(false,'CalStatusDate');
	var statusInfo = this.createDiv(false,'CalStatusInfo');
	
	var navi = this.createDiv(false,'CalNavi');
	
	/*var okBtn = this.createDiv(false,'CalNaviBtn');
	okBtn.innerHTML = 'Zatwierdź';
	$(okBtn).addClassName('CalNaviBtnSubmit');
	okBtn.obj = this;
	okBtn.onclick = function() { this.obj.submit(); }
	okBtn.onmouseover = function() { this.addClassName('hv'); }
	okBtn.onmouseout = function() { this.removeClassName('hv'); }*/
	
	var closeBtn = this.createDiv(false,'CalNaviBtn');
	closeBtn.innerHTML =  Calendar._TT["CLOSE"];
	$(closeBtn).addClassName('CalNaviBtnClose');
	closeBtn.obj = this;
	closeBtn.onclick = function() { this.obj.close(); }
	closeBtn.onmouseover = function() { this.addClassName('hv'); }
	closeBtn.onmouseout = function() { this.removeClassName('hv'); }
	
	navi.appendChild(closeBtn);
	//navi.appendChild(okBtn);
	
	this.obj.appendChild(navi);
	
	this.obj.appendChild(statusInfo);
	this.obj.appendChild(statusDate);
	
}

DoubleCalendar.prototype.drawMonthNavi = function(p) {
	
	var pMonthNavi = this.createDiv(false,'CalMonthNavi');
	var pMonthName = this.createDiv(false,'CalMonthName');
	var pDaysNames = this.createDiv(false,'CalDaysNames');
	var pDays = this.createDiv(false,'CalDays');
	
	var daysOfWeek = Calendar._SDN; //CalTools.dayNames;
	
	for(var i = 1; i < daysOfWeek.length; i++) {
		var d = this.createDiv(false,'CalDayName');		
		d.addClassName('CalDayBox');
		d.innerHTML = daysOfWeek[i];
		pDaysNames.appendChild(d);
	}
	
	pMonthNavi.appendChild(pMonthName);
	p.appendChild(pMonthNavi);
	
	p.appendChild(pDaysNames);
	p.appendChild(pDays);
	
}

DoubleCalendar.prototype.drawMonth = function(m,y) {
	
	var monthDiv = this.createDiv(false,'CalPane');
	if(m > this.baseMonth) { monthDiv.addClassName('CalPaneMargin'); }
	this.drawMonthNavi(monthDiv);
			
	var name = Calendar._MN[m];
	monthDiv.down('.CalMonthName').innerHTML = name+' '+y;
	
	var div = monthDiv.down('.CalDays');
	div.innerHTML = "";
	var days = CalTools.getDaysInMonth(m,y);
	var lastMonthDays = CalTools.getDaysInMonth(m-1,y);
	
	var firstDay = new Date(y,m,0);
	var firstDayOfWeek = firstDay.getDay();
			
	var daysToFill = firstDayOfWeek;
	var daysToFillStart = lastMonthDays-(daysToFill-1);
	var daysLeft = 42-(days+daysToFill);
		
	for(var i = 0; i < daysToFill; i++) {
		var d = this.createDay(daysToFillStart,'CalDayDisabled');
		daysToFillStart++;
		div.appendChild(d);
	}
	
	var now = new Date();	
	now.setHours(0,0,0,0);
	var ntime = now.getTime();
	var nowStr = now.getFullYear()+'-'+(now.getMonth()+1)+'-'+now.getDate();
	
	for(var i = 0; i < days; i++) {			
		var dat = y+'-'+(m+1)+'-'+(i+1);		
		if (nowStr == dat) { var today = true;	} else {var today = false;	}
		var datObj = CalTools.getDate(dat);
		var dayOfWeek = datObj.getDay();
		var c = false;		
		if((dayOfWeek == 6) || (dayOfWeek == 0)) { var c = 'CalDayWeekend'; }
		
		var dtime = datObj.getTime();		
		if(datObj < now) {			
			var c = 'CalDayDisabled'; var dat = false;			
		}
		if(today) {	var c = 'CalDayToday'; }
		var d = this.createDay((i+1),c,dat);
		div.appendChild(d);
	}
	
	var m = m+2;
	if(m > 12) { var m = 1; y++; }
	
	for(var i = 0; i < daysLeft; i++) {		
		var dat = y+'-'+(m)+'-'+(i+1);	
		var d = this.createDay((i+1),'CalDayGray',dat);
		div.appendChild(d);
	}
	
	this.scrollInner.appendChild(monthDiv);
	return monthDiv;
	
}

DoubleCalendar.prototype.createDay = function(n,cl,dat) {
	var d = this.createDiv(false,'CalDay');	
	d.obj = this;
	d.addClassName('CalDayBox');
	if(cl) { d.addClassName(cl); }
	if(dat) { d.addClassName('day-'+dat); }
	d.innerHTML = n;
	if(dat) { 
		d.onmouseover = function() { this.obj.dayHover(this,dat); } 
		d.onmouseout = function() { this.obj.dayOut(this,dat); }
		d.onclick = function() { this.obj.dayClick(this,dat); }
	} else {
		d.style.cursor = 'auto';
	}
	return d;
}

DoubleCalendar.prototype.dayHover = function(ref,dat) {
	
	this.dayHv = true;
	
	if (ref.obj.mode == 2) {
		var datObj = CalTools.getDate(dat);
		var from = CalTools.getDate(this.dateFrom);
		if (!(datObj > from)) {
				
		} else {
			ref.addClassName('hv');
			ref.addClassName('tohv');
			ref.obj.highlightRange(dat);
		}
	} else {
		if (ref.obj.lockDays) {
			var hl = CalTools.addDays(dat, ref.obj.lockDays + 1);
			ref.obj.highlightRange(hl, dat);
			ref.addClassName('tohv');
		}
		else {
			ref.addClassName('hv');
		}
	}
	
}

DoubleCalendar.prototype.dayOut = function(ref,dat) {
	
	this.dayHv = false;
	
	ref.removeClassName('hv');
	ref.removeClassName('tohv');
	ref.removeClassName('lock');
	
	if(ref.obj.mode == 2) {
		ref.removeClassName('tohv');
	}
}

DoubleCalendar.prototype.dayClick = function(ref,d) {
				
	if(ref.obj.mode == 1) {
		ref.obj.resetDays();
		ref.obj.selectDateFrom(d);		
	} else if(ref.obj.mode == 2) {
		var datObj = CalTools.getDate(d);
		var from = CalTools.getDate(this.dateFrom);		
		if (datObj > from) {
			ref.obj.selectDateTo(d);
		}		
	}
	
}

DoubleCalendar.prototype.resetDays = function() {
	$$('.CalDay.act').each(function(e){	e.removeClassName('act'); });
	$$('.CalDay.rhv').each(function(e) { e.removeClassName('rhv'); });
	$$('.CalDay.ract').each(function(e) { e.removeClassName('ract'); });
	$$('.CalDay.tohv').each(function(e) { e.removeClassName('tohv'); });
}

DoubleCalendar.prototype.highlightRange = function(to,from) {
	
	if (!from) {
		var from = this.dateFrom;
	}
		
	var days = CalTools.dateDiff('d',to,from);
	var days = (0-days)-1;
	
	var dFrom = CalTools.getDate(from);
	
	$$('.CalDay.rhv').each(function(e) {
		e.removeClassName('rhv');
	});
	
	var nextDay = dFrom;
	
	for(var i = 0; i < days; i++) {
		var nd = CalTools.nextDay(nextDay);		
		var day = this.getDayClass(nd);
		$$('.'+day).each(function(e) {
			e.addClassName('rhv');
		});
	}
	
}

DoubleCalendar.prototype.selectDateFrom = function(d) {	
	var obj = this.getDayObj(CalTools.getDate(d));
	obj.addClassName('act');
	/*this.mode = 2;
	this.dateFrom = d;
	if (this.lockDays) {
		var dateTo = CalTools.addDays(this.dateFrom,this.lockDays);
		this.selectDateTo(dateTo);
	}
	else {
		$$('.date_combo')[0].removeClassName('from');
		$$('.date_combo')[0].addClassName('to');
	}*/
	$('reservations__date_from').value = d;
	this.close();
	Reservation.updateRes();
}

DoubleCalendar.prototype.selectDateTo = function(d) {
	var obj = this.getDayObj(CalTools.getDate(d));
	$('reservations__date_to').value = d;
	this.close();
	Reservation.updateRes();
}

DoubleCalendar.prototype.getDayObj = function(d) {
	var dObj = d;
	var c = 'day-'+dObj.getFullYear()+'-'+(dObj.getMonth()+1)+'-'+(dObj.getDate());	
	var obj = this.obj.down('.'+c);
	return obj;
}

DoubleCalendar.prototype.getDayClass = function(d) {
	var dObj = d;
	var c = 'day-'+dObj.getFullYear()+'-'+(dObj.getMonth()+1)+'-'+(dObj.getDate());	
	var str = c;
	return str;
}

DoubleCalendar.prototype.setStatus = function(dateStr) {
		
	this.obj.down('.CalStatusInfo').innerHTML = dateStr;
	
}

DoubleCalendar.prototype.attach = function(obj) {
	
	var pos = $(obj).cumulativeOffset();
	this.obj.style.top = pos[1]+21+'px';
	this.obj.style.left = pos[0]+'px';
		
}

DoubleCalendar.prototype.createDiv = function(id,cl) {
	
	var div = document.createElement('div');
	if(id) { div.id = id; }
	if(cl) { $(div).className = cl; }
	return div;
	
}

