function Calendar(referenceName, beginMonth, daysMonths, hiddenFieldsType, hiddenFieldsValue, typeDays, beginPeriod, endPeriod){

	var mn = ['January','February','March','April','May','June','July','August','September','October','November','December'];
	var dim = [31,0,31,30,31,30,31,31,30,31,30,31];
	
	var calendarDayBeforeToday = "calendarDayBeforeToday";
	var calendarDayEmpty = "calendarDayEmpty"; 
	var calendarDaySelect = "calendarDaySelect";
	var calendarDayBooked = "calendarDayBooked";    // type = 1
	var calendarDayBlocked = "calendarDayBlocked";  // type = 2
	
	if(typeDays == 1) calendarDayEmpty = "calendarDayAvailable";

	var referenceName = referenceName;
	var searchType = null;
	
	var hiddenFieldsType = hiddenFieldsType;
	var hiddenFieldsValue = hiddenFieldsValue;
	
	var typeSelect = null;
	
	var yearBegin = null;
	var monthBegin = null;
	var dayBegin = null;
	
	var yearEnd = null;
	var monthEnd = null;
	var dayEnd = null;
	
	var todaydate=new Date();
	var curmonth=todaydate.getMonth()+1;
	
	var daysMonth1 = null;
	var daysMonth2 = null;
	var daysMonth3 = null;
	
	var daysMonthTemp1 = new Array();
	var daysMonthTemp2 = new Array();
	var daysMonthTemp3 = new Array();
	
	var outputValue = null;
	
	this.setDays = setDays;
	this.changeStyle = changeStyle;
	this.resetCalendarItems = resetCalendarItems;
	this.setSearchType = setSearchType;
	this.getSearchType = getSearchType;
	
	this.setOutputValue = setOutputValue;
	
	this.setTypeSelect = setTypeSelect;
	this.setTypeSelectValue = setTypeSelectValue;
	
	this.setYearBegin = setYearBegin;
	this.setMonthBegin = setMonthBegin;
	this.setDayBegin = setDayBegin;
	
	this.setYearEnd = setYearEnd;
	this.setMonthEnd = setMonthEnd;
	this.setDayEnd = setDayEnd;

	this.setMonthBeginSource = setMonthBeginSource;
	this.setDayBeginSource = setDayBeginSource;
	
	this.setMonthEndSource = setMonthEndSource;
	this.setDayEndSource = setDayEndSource;
	
	this.checkDays = checkDays;
	
	this.setSinglePeriod = setSinglePeriod;

	this.setNights = setNights;
	this.calcNights = calcNights;
	this.fromNights = fromNights;
	
	function setMonthBeginSource(){
		if(searchType == "single"){
			monthBegin.options[0].selected = true;
			monthBegin.disabled = false;
			dayBegin.options[0].selected = true;
			dayBegin.disabled = true;
			checkYearsBegin();
		}
		else{
			yearBegin.options[0].selected = true;
			alert("Select, please, type \"Search for single data range\"");
		}
	}
	
	function setDayBeginSource(){
		if(monthBegin.value == "") {
			dayBegin.options[0].selected = true;
			dayBegin.disabled = true;
		}
		else{
			//alert(monthBegin.value);	
			dayBegin.length = 0;
			var year = yearBegin.value;
			var month = parseInt(monthBegin.value) - 1;
			var oD = new Date(year, month, 1);
			oD.od=oD.getDay()+1;
			dim[1]=(((oD.getFullYear()%100!=0)&&(oD.getFullYear()%4==0))||(oD.getFullYear()%400==0))?29:28;
			var days = dim[parseInt(monthBegin.value) - 1];
			dayBegin.options[0] = new Option("Day", "", false, false);
			for(var i = 1; i < days + 1; i++){
				dayBegin.options[i] = new Option(i, i, false, false);
			}
			dayBegin.disabled = false;
		}
		checkMonthsBegin();
	}
	
	function setMonthEndSource(){
		if(searchType == "single"){
			monthEnd.options[0].selected = true;
			monthEnd.disabled = false;
			dayEnd.options[0].selected = true;
			dayEnd.disabled = true;
			checkYearsEnd();
		}
		else {
			yearEnd.options[0].selected = true;
			alert("Select, please, type \"Search for single data range\"");
		}
	}
	
	function setDayEndSource(){
		if(monthEnd.value == "") {
			dayEnd.options[0].selected = true;
			dayEnd.disabled = true;
		}
		else{
			dayEnd.length = 0;
			var year = yearEnd.value;
			var month = parseInt(monthEnd.value) - 1;
			var oD = new Date(year, month, 1);
			oD.od=oD.getDay()+1;
			dim[1]=(((oD.getFullYear()%100!=0)&&(oD.getFullYear()%4==0))||(oD.getFullYear()%400==0))?29:28;
			var days = dim[parseInt(monthEnd.value) - 1];
			dayEnd.options[0] = new Option("Day", "", false, false);
			for(var i = 1; i < days + 1; i++){
				dayEnd.options[i] = new Option(i, i, false, false);
			}
			dayEnd.disabled = false;
		}
		checkMonthsEnd();
	}
	
	function checkYearsBegin(){
		if((yearBegin.value != "") && (yearEnd.value != "") && (parseInt(yearBegin.value) > parseInt(yearEnd.value))){
			yearBegin.options[0].selected = true;
			monthBegin.options[0].selected = true;
			monthBegin.disabled = true;
		}
		calcNights();
	}
	
	function checkYearsEnd(){
		if((yearBegin.value != "") && (yearEnd.value != "") && (parseInt(yearBegin.value) > parseInt(yearEnd.value))){
			yearEnd.options[0].selected = true;
			monthEnd.options[0].selected = true;
			monthEnd.disabled = true;
		}
		calcNights();
	}
	
	function checkMonthsBegin(){
		if((yearBegin.value == yearEnd.value) 
		&& (monthBegin.value != "") && (monthEnd.value != "") && (parseInt(monthBegin.value) > parseInt(monthEnd.value))){
			monthBegin.options[0].selected = true;
			dayBegin.options[0].selected = true;
			dayBegin.disabled = true;
		}
		calcNights();
	}
	
	function checkMonthsEnd(){
		if((yearBegin.value == yearEnd.value) 
		&& (monthBegin.value != "") && (monthEnd.value != "") && (parseInt(monthBegin.value) > parseInt(monthEnd.value))){
			monthEnd.options[0].selected = true;
			dayEnd.options[0].selected = true;
			dayEnd.disabled = true;
		}
		calcNights();
	}
	
	function checkDays(dayObj){
		if((yearBegin.value == yearEnd.value) && (monthBegin.value == monthEnd.value) 
		&& (dayBegin.value != "") && (dayEnd.value != "") && (parseInt(dayBegin.value) > parseInt(dayEnd.value))){
			dayObj.options[0].selected = true;
		}
		calcNights();
	}
	
	function setTypeSelect(obj){
		typeSelect = document.getElementById(obj);
	}
	
	function setYearBegin(obj){
		yearBegin = document.getElementById(obj);
	}
	
	function setMonthBegin(obj){
		monthBegin = document.getElementById(obj);
	}
	
	function setDayBegin(obj){
		dayBegin = document.getElementById(obj);
	}
	
	function setYearEnd(obj){
		yearEnd = document.getElementById(obj);
	}
	
	function setMonthEnd(obj){
		monthEnd = document.getElementById(obj);
	}
	
	function setDayEnd(obj){
		dayEnd = document.getElementById(obj);
	}
	function setNights(obj){
		nightsCount = document.getElementById(obj);
	}
	function calcNights(){
		try{
		//alert('calculating and populating nights count)');
		if(yearBegin.value>0 && monthBegin.value>0 && dayBegin.value>0 && yearEnd.value>0 && monthEnd.value>0 && dayEnd.value>0) {
			nights=0;
			// get dates
			arrivalDate=new Date();
			arrivalDate.setDate(1);
			arrivalDate.setFullYear(yearBegin.value);
			arrivalDate.setMonth(monthBegin.value-1);
			arrivalDate.setDate(dayBegin.value);

			departDate=new Date();
			departDate.setDate(1);
			departDate.setFullYear(yearEnd.value);
			departDate.setMonth(monthEnd.value-1);
			departDate.setDate(dayEnd.value);
			
			nights=Math.round((departDate-arrivalDate)/(1000*60*60*24));
			
			// maximum length of stay
			if (nights > 366) {
				alert('Sorry, you have exceeded the allowable number of 14 consecutive days that can be reserved at this campsite.');
				dayEnd.selectedIndex = 0;
				nightsCount.options[0].selected = true;
			}
			else {
				nightsCount.options[nights].selected=true;
			}
			
		}else {
			nightsCount.options[0].selected=true;
		}
		} catch(x){}
	}
	function fromNights(count){
		//alert('populating from, to '+count);
		if(count=='') {
			//return false;
			count=0;
		}
		count=parseInt(count);
		var arrivalSelected=false;
		var departureSelected=false;

		if(yearBegin.value>0 && monthBegin.value>0 && dayBegin.value>0) {
			arrivalSelected=true;
		}

		if(yearEnd.value>0 && monthEnd.value>0 && dayEnd.value>0) {
			departureSelected=true;
		}

		if(arrivalSelected) {
			//change departure date
			departDate=new Date();
			departDate.setDate(1);
			departDate.setFullYear(yearBegin.value);
			departDate.setMonth(monthBegin.value-1);
			departDate.setDate(dayBegin.value);
			departDate.setDate(departDate.getDate()+count);
			if(departDate.getFullYear()!=yearBegin.value) {
				departDate.setFullYear(yearBegin.value);
				departDate.setMonth(11);
				departDate.setDate(31);
			}
			monthEnd.options[departDate.getMonth()+1].selected=true;
			calendar.setDayEndSource(monthEnd);
			dayEnd.options[departDate.getDate()].selected=true;
			calendar.checkDays(dayBegin);
		}
		if(!arrivalSelected && departureSelected) {
			//change arrival date
			arrivalDate=new Date();
			arrivalDate.setDate(1);
			arrivalDate.setFullYear(yearEnd.value);
			arrivalDate.setMonth(monthEnd.value-1);
			arrivalDate.setDate(dayEnd.value);
			arrivalDate.setDate(arrivalDate.getDate()-count);
			if(arrivalDate.getFullYear()!=yearEnd.value) {
				arrivalDate.setFullYear(yearEnd.value);
				arrivalDate.setMonth(0);
				arrivalDate.setDate(1);
			}

			monthBegin.options[arrivalDate.getMonth()+1].selected=true;
			calendar.setDayBeginSource(monthBegin);
			dayBegin.options[arrivalDate.getDate()].selected=true;
			calendar.checkDays(dayBegin);

		}
		if(!arrivalSelected && !departureSelected) {
			//alert - select at least one date - "Arrival" or "Departure"
			//alert('Please select at least one date - "Arrival" or "Departure"');
			calcNights();
			return false;
			// set select to default value
		}

	}

	
	function setOutputValue(){
		var isOK = true;
		if(searchType == "single"){
			if((yearBegin.value != "") && (monthBegin.value != "") && (dayBegin.value != "")){
				var begin = yearBegin.value + "/" + (parseInt(monthBegin.value)) + "/" + dayBegin.value;
				if((yearEnd.value != "") && (monthEnd.value != "") && (dayEnd.value != "")){
					var end = yearEnd.value + "/" + (parseInt(monthEnd.value)) + "/" + dayEnd.value;
				}
				else {
					isOK = false;
//					alert("Select, please, values in \"To:\" section ");
				}
			}
			else {
				isOK = false;
//				alert("Select, please, values in \"From:\" section ");
			}
			if(isOK){
				outputValue = begin + "-" + end;
				document.getElementById("valueSelect").value = outputValue;
				document.getElementById("From").value = begin;
				document.getElementById("To").value = end;
			} 
		}
		else if(searchType == "multiple"){
			outputValue = "";
			var last = "";
			for(var i = 1; i < 4; i++){
				var temp = eval("daysMonthTemp" + i);
				for(var j = 0; j < temp.length; j++){
					if((temp[j]) && (last == "")){
						if(outputValue != ""){
							outputValue += ";";
						}
						outputValue = outputValue + temp[j];
						last = temp[j];
					}
					else if((temp[j]) && (last != "")){
						last = temp[j];
					}
					else if(last != ""){
						outputValue = outputValue + "-" + last;
						last = "";
						
					}
				}
			}
			document.getElementById("valueSelect").value = outputValue;
		}
		document.getElementById("typeSelect").value = searchType;
		if(outputValue == "") isOK = false;
		return isOK;
	}
	
	function setSearchType(type){
		searchType = "single"; // blocked multiple select
	/*
		searchType = type;
		if( resetCalendarItems();
		else if(searchType == "multiple") resetSingleItems();
		outputValue = null;
	*/
	}
	
	function getSearchType(){
		return searchType;
	}
	
	function resetCalendarItems(){
		setDays(daysMonths);
	}
	
	function resetSingleItems(){
		yearBegin.options[0].selected = true;
		monthBegin.options[0].selected = true;
		dayBegin.options[0].selected = true;
		yearEnd.options[0].selected = true;
		monthEnd.options[0].selected = true;
		dayEnd.options[0].selected = true;
		
		monthBegin.disabled = true;
		dayBegin.disabled = true;
		monthEnd.disabled = true;
		dayEnd.disabled = true;
	}
	
	function setDays(arrays){
		if(arrays){
			daysMonth1 = arrays[0];
			daysMonth2 = arrays[1];
			daysMonth3 = arrays[2];
		}
//		writeCalendarItems();
	}
	
	function writeCalendarItems(){
		document.getElementById("divContainer1").innerHTML = calendarItem(1, (curmonth + beginMonth));
		document.getElementById("divContainer2").innerHTML = calendarItem(2, (curmonth + beginMonth) + 1);
		document.getElementById("divContainer3").innerHTML = calendarItem(3, (curmonth + beginMonth) + 2);
	}
	
	function writeContainer(){
		var strContainer = "";
		strContainer = "<input type=\"hidden\" id=\"typeSelect\" name=\"" + hiddenFieldsType + "\"><input type=\"hidden\" id=\"valueSelect\" name=\"" + hiddenFieldsValue + "\">";
//		strContainer = "<table border=\"0\" cellspacing=\"5\" cellpadding=\"0\"><tr><td id=\"divContainer1\" width=\"95\" height=\"111\" valign=\"top\">1</td><td id=\"divContainer2\" width=\"95\" height=\"111\" valign=\"top\">1</td><td id=\"divContainer3\" width=\"95\" height=\"111\" valign=\"top\">1</td></tr></table><input type=\"hidden\" id=\"typeSelect\" name=\"" + hiddenFieldsType + "\"><input type=\"hidden\" id=\"valueSelect\" name=\"" + hiddenFieldsValue + "\">";
		document.write(strContainer);
	}
	
	function calendarItem(item, month_){
		var year_ = todaydate.getFullYear();
		var month = ((12-month_)<0)?(month_-12):month_;
		var year = ((12-month_)<0)?(year_ + 1):year_;
		var oD = new Date(year, month-1, 1);
		oD.od=oD.getDay()+1;
		var scanfortoday = (year==todaydate.getFullYear() && month==todaydate.getMonth()+1)? todaydate.getDate() : 0;
		dim[1]=(((oD.getFullYear()%100!=0)&&(oD.getFullYear()%4==0))||(oD.getFullYear()%400==0))?29:28;
		
		eval("daysMonthTemp" + item + " = new Array(dim[month - 1])");
		
		var str = "<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\" bgcolor=\"#4A4A4A\"><tr><td><table border=\"0\" cellspacing=\"2\" cellpadding=\"0\"";
		if (document.layers) str += " bgcolor=\"#FFFFFF\">";
		else str += "\">";
		str += "<tr><td><table width=\"100%\" cellpadding=\"0\" border=\"0\" cellspacing=\"2\" bgcolor=\"#FFFFFF\"><tr><td align=\"center\" class=\"calendarMonth\"><table width=\"100%\" cellpadding=\"0\" border=\"0\" cellspacing=\"0\"><tr><td align=\"center\" class=\"calendarMonth\">";
		str += mn[month - 1] + " " + year;
		str += "</td></tr></table></td></tr></table></td></tr><tr><td><table width=\"100%\" cellpadding=\"0\" border=\"0\" cellspacing=\"0\"><tr><td><table id=\"calendarItemBlock\" cellpadding=\"0\" border=\"0\" cellspacing=\"2\" bgcolor=\"#FFFFFF\"><tr align=\"center\">";
		for(var s = 0; s < 7; s++){
			str += "<td class=\"calendarWeekDays\" height=\"16\">";
			str += "SMTWTFS".substr(s,1);
			str += "</td>";
		}
		str += "</tr><tr align=\"center\">";
		var nextDay = 0;
		for(var i = 1; i <= 42; i++){
			var x=((i-oD.od>=0)&&(i-oD.od<dim[month-1]))? i-oD.od+1 : "&nbsp;";
			if(x == "&nbsp;") str += "<td class=\"calendarDay\" height=\"16\">";
			else if((typeDays == 1) && (x > scanfortoday) && (eval("daysMonth" + item))
				&& (eval("daysMonth" + item + "[" + nextDay + "] == 1"))){
				str += "<td class=\"" + calendarDayBooked + "\" height=\"16\">";
				nextDay++;
			}
			else if((typeDays == 1) && (x > scanfortoday) && (eval("daysMonth" + item)) 
				&& (eval("daysMonth" + item + "[" + nextDay + "] == 2"))){
				str += "<td class=\"" + calendarDayBlocked + "\" height=\"16\">";
				nextDay++;
			}
			else if (x < scanfortoday) {
				str += "<td class=\"" + calendarDayBeforeToday + "\" height=\"16\">";
				nextDay++;
			}
			else {
				str += "<td class=\"" + calendarDayEmpty + "\" height=\"16\" onclick=\"" + referenceName + ".changeStyle(" + item + "," + nextDay + ", this, '" + year + "/" + month + "/" + x + "')\">";
				nextDay++;
			}
			str += x;
			str += "</td>";
			if(((i)%7==0)&&(i<36)) str += "</tr><tr align=\"center\">";
		}
		str += "</tr></table></td></tr></table></td></tr></table></td></tr></table>";
		return str;
	}
	
	function checkPosiblePeriod(){
		var backValue = false;
		var count = 0;
		for(var i = 1; (i < 4) && (!backValue); i++){
			var temp = eval("daysMonthTemp" + i);
			for(var j = 0; (j < temp.length) && (!backValue); j++){
				if(temp[j]){
					count++; 
				}
				else count = 0;
				if(count > 15){
					backValue = true;
					count = 0; 
				}
			}
		}
		return backValue;
	}
	
	function changeStyle(item, num, obj, fullDay){
		/*if(searchType == "multiple"){
			if(obj.className == calendarDayEmpty) {
				obj.className = calendarDaySelect;
				eval("daysMonthTemp" + item + "[" + num + "] = fullDay");
				if(checkPosiblePeriod()){
					obj.className = calendarDayEmpty;
					eval("daysMonthTemp" + item + "[" + num + "] = ''");
					alert("You may choose period not more than 15 days");
				}
			}
			else if(obj.className == calendarDaySelect) {
				obj.className = calendarDayEmpty;
				eval("daysMonthTemp" + item + "[" + num + "] = ''");
			}
		}
		else {
			alert("Select, please, type \"Search for multiple date range\"");
		}*/
	}
	
	function setTypeSelectValue(){
	searchType = "single";  // blocked multiple select
	/*
		searchType = "multiple";
		if(typeSelect.checked) 
	*/
	}
	
	function setSinglePeriod(){
		if(beginPeriod && endPeriod && beginPeriod != "" && endPeriod != ""){
			var begin = beginPeriod.split("/");
			//begin[1] = eval(begin[1]) - 1;
			findElementFromSelectBox(yearBegin, eval(begin[0]));
			findElementFromSelectBox(monthBegin, "" + eval(begin[1]));
			monthBegin.disabled = false;
			setDayBeginSource();
			findElementFromSelectBox(dayBegin, eval(begin[2]));
			
			var end = endPeriod.split("/");
			//end[1] = eval(end[1]) - 1;
			findElementFromSelectBox(yearEnd, eval(end[0]));
			findElementFromSelectBox(monthEnd, "" + eval(end[1]));
			monthEnd.disabled = false;
			setDayEndSource();
			findElementFromSelectBox(dayEnd, eval(end[2]));
		}
	}
	
	function findElementFromSelectBox(selectElement, value){
		for(var i = 0; i < selectElement.length; i++){
			if(selectElement.options[i].value == value){
				selectElement.options[i].selected = true;
				break;
			}
		}
	}

	writeContainer();
	setDays(daysMonths);
}

