if(navigator.userAgent.indexOf("MSIE")!=-1){
	var isIE = 1;
}
var mouseDown=0;
var zMax=10;

//класс Календарь
function Calendar(key,button,lan) {
//метод создания html-элемента
	this.createElement = function(tag, className) {
		var elem = document.createElement(tag);
		elem.className = className;
		return elem;
	};

	var calendar = this;//ссылка на себя
	var currentDate = new Date();//создание текущей даты(сегодняшнее число)
	this.button = button;
	this.key = key;
    this.lan = lan;
    this.currentDate = currentDate;//текущая дата
	this.date = currentDate;//дата, выбранная пользователем
	this.showDate = null;
	this.colvoOfSutok = 0;//количество суток
	this.delta = 0;//смещение относительно текущей даты
	this.daysWeek = new Array();//массив активных дней недели
	this.dateRangeLeft = null;//левая граница для дней недели
	this.dateRangeRight = null;//правая граница для дней недели
    this.poleIdFixed = "";//id элемента, к которому привязан календарь
	this.poleIdIn = "";//id поля, из которого выводится информация
    this.poleIdOut = "";//id поля, в которое выводится информация

    this.week = new Array();//дни недели
    var weeks = {
        en : new Array('Mo','Tu','We','Th','Fr','Sa','Su'),
        ru : new Array('Пн','Вт','Ср','Чт','Пт','Сб','Вс'),
        de : new Array('Mo','Di','Mi','Do','Fr','Sa','So'),
        cn : new Array('Mo','Tu','We','Th','Fr','Sa','Su')
    };
    this.week = weeks[this.lan];
    this.prevYear = new Year("calendarPrevYear", calendar);//предыдущий год
	this.nextYear = new Year("calendarNextYear", calendar);//следующий год
	this.months = new Months(calendar,this.date,lan);//названия месяцев
	this.cells = new Array();//массив чисел месяца
	for(var i = 0; i < 42; i++){
		this.cell = new Cell(this);
		this.cells.push(this.cell);
	}
//метод создания html календаря
	this.createCalendar = function(){
        this.blockWeek = this.createElement("div", "calendarWeek");
		this.blockWeek.innerHTML = "";
		for(var i = 0; i < this.week.length; i++){
			var dayWeek = document.createElement("div");
			dayWeek.className = "calendarDay";
			dayWeek.style.fontWeight = "bold";
			dayWeek.innerHTML = this.week[i];
			if(this.week[i] == "Сб"){
				dayWeek.style.color = "#900";
			}else {
				if(this.week[i] == "Вс"){
					dayWeek.style.color = "#900";
				} else {
					dayWeek.style.color = "#000";
				}
			}
			this.blockWeek.appendChild(dayWeek);
		}
		this.blockCalendar = this.createElement("div", "calendarContainer");//HTML-элемент календаря
        this.blockCalendar.id = "calendarContainer";
        this.blockHeader = this.createElement("div", "calendarHeader");//HTML-заголовка
		this.blockDate = this.createElement("div", "calendarDate");//блок даты
		this.blockDateMonth = this.createElement("div","calendarDateMonth");//блок месяца в дате
		this.blockDateYear = this.createElement("div", "calendarDateYear");//блок года в дате

		this.blockYear = this.createElement("div","calendarYear");//блок выбора года
		this.blockYear.style.display = "none";

		this.blockContainerNumber = this.createElement("div", "calendarContainerNumber");//контейнер для чисел
		this.blockSelectYear = this.createElement("select", "calendarSelectYear");
		this.createSelect = function(){
			for(var i = 1900; i <=2020; i++) {
				this.optionElement = this.createElement("option", "");
				this.optionElement.value = i;
				this.optionElement.appendChild(document.createTextNode(i));
				this.blockSelectYear.appendChild(this.optionElement);
				if(i == calendar.date.getFullYear()){
					this.optionElement.selected = "true";
				}
			}
		};
		this.createSelect();
		this.blockSelectYear.onchange = function() {
			var year = this.options[this.selectedIndex].value;
			var date = new Date(calendar.showDate.getTime());
			date.setFullYear(year);//установка года
			calendar.blockDateYear.innerHTML = date.getFullYear();
			calendar.setShowDate(date);
			calendar.refreshNumbers(date);
		};

		this.blockSelectYearSetValue = function(year) {
			var el = this.blockSelectYear;
			el.options[year-1900].selected = true;
		};

//кнопка закрытия календаря
	this.blockCloseButton = this.createElement("div", "calendarclosecalendar");
	this.blockCloseButton.appendChild(document.createTextNode("x"));

	this.blockCloseButton.onclick = function() {
		calendar.blockCalendar.style.display = "none";
	};

//кнопка скрытия блока года
	this.blockYearHideButton = this.createElement("div","calendarHideYear");
	this.blockYearHideButton.appendChild(document.createTextNode("_"));

	this.blockYearHideButton.onclick = function() {
		if(calendar.blockYear.style.display = "block"){
			var oldCalendar = getPositionData(calendar.blockCalendar);
			calendar.blockWeek.style.top = 19 + "px";
			calendar.blockContainerNumber.style.top = 20 + "px";
			calendar.blockCalendar.style.height = oldCalendar.height - 15 - 8 + "px";
			calendar.blockYear.style.display = "none";
		}
	};
	this.blockYear.appendChild(this.blockSelectYear);
	this.blockYear.appendChild(this.blockYearHideButton);

    this.blockYear.style.display = "none";
	this.blockDate.appendChild(this.blockDateMonth);
	this.blockDate.appendChild(this.blockDateYear);
	this.blockHeader.appendChild(this.prevYear.blockElement);
	this.blockHeader.appendChild(this.blockDate);
	this.blockHeader.appendChild(this.blockCloseButton);
	this.blockHeader.appendChild(this.nextYear.blockElement);
	this.blockCalendar.appendChild(this.blockHeader);
	//this.blockFooter.appendChild(this.months.blockElement);
	//this.blockCalendar.appendChild(this.blockFooter);
	this.blockCalendar.appendChild(this.blockYear);
	this.blockCalendar.appendChild(this.blockWeek);

	for(var i = 0; i < 42; i++){
		this.blockContainerNumber.appendChild(this.cells[i].blockElement);
	}

	this.blockCalendar.appendChild(this.blockContainerNumber);
	this.blockCalendar.id = "blockCalendarId_" + this.key;
	this.blockCalendar.style.left = 0 + "px";
	this.blockCalendar.style.top = 0 + "px";
//	this.blockCalendar.style.visibility = "hidden";
    this.blockCalendar.style.display = "none";

    document.body.appendChild(this.blockCalendar);
    var yearBlock = getPositionData(this.blockYear);
    this.setShowDate = function(showDate) {
		this.showDate = showDate;
	};
	this.setDate = function(date){
		this.date = date;
	};
	this.setcolvoOfSutok = function(delta,colvoOfSutok){
		this.delta = delta;
		this.colvoOfSutok = colvoOfSutok;
	};
	this.setcurcallback = function(curcallback){
		this.curcallback = curcallback;
	};
//метод установки полей для активизации дней недели
	this.setDaysWeek = function(daysWeek,dateRangeLeft,dateRangeRight){
		var lengthString = daysWeek.length;
		for(var i = 0; i < lengthString; i++){
			this.daysWeek[this.daysWeek.length] = daysWeek.charAt(i);
		}
		this.dateRangeLeft = dateRangeLeft;
		this.dateRangeRight = dateRangeRight;
	};
//обработчик нажатия мыши
	this.blockHeader.onmousedown = function(event){
		event = (event) ? event : ((window.event) ? window.event : null);
		t = this.parentNode;
		posY=((isIE == 1) ? event.y : event.pageY)-parseInt(t.style.top);
    	posX=((isIE == 1) ? event.x : event.pageX)-parseInt(t.style.left);
		t.style.zIndex = zMax++;
		mouseDown=t;//ссылка которую передаем
		return false;
	};
//обработчик перемещения мыши
	document.onmousemove = function(event){
		event = (event) ? event : ((window.event) ? window.event : null);
	if(!mouseDown){
		return;
	};
		var x = (isIE == 1) ? event.x : event.pageX;
		var y = (isIE == 1) ? event.y : event.pageY;
		mouseDown.style.top = (y - posY) + "px";
		mouseDown.style.left = (x - posX) + "px";
	return false;
	};
//обработчик маусапа
	document.onmouseup = function(event){
		mouseDown = null;
	};


	};//закончился метод создания календаря

	this.createCalendar();
    this.getBlockHeight = function() {
        var height = 0;
        var children = calendar.blockCalendar.childNodes;
        for(var i = 0; i < children.length; i++){
           var el = getPositionData(children[i]);
           height += el.height;
        }
        return height;
	};

	this.setBlockHeight = function(height) {
        calendar.blockCalendar.style.height = height + "px";
	};

		this.blockDateYear.onclick = function() {
			if(calendar.blockYear.style.display == "none"){
                var oldCalendar = getPositionData(calendar.blockCalendar);
                var yearBlock = getPositionData(calendar.blockSelectYear);
                calendar.blockWeek.style.top = 15 + "px";
				calendar.blockContainerNumber.style.top = 15 + "px";
                if(navigator.userAgent.indexOf("Firefox")!=-1){
                    calendar.blockCalendar.style.height = 153 + "px";
                } else {
                    calendar.blockCalendar.style.height = oldCalendar.height + 15 + "px";
                }
                calendar.blockYear.style.display = "block";
				var d = new Date();
				d.setFullYear(calendar.blockDateYear.innerHTML);
            } else {
				var oldCalendar = getPositionData(calendar.blockCalendar);
                calendar.blockWeek.style.top = 19 + "px";
				calendar.blockContainerNumber.style.top = 20 + "px";
				calendar.blockCalendar.style.height = oldCalendar.height - 15 - 8 + "px";
				calendar.blockYear.style.display = "none";
			}
		};

//метод отображения блока с календарем
	this.show = function(poleIdFixed, poleIdIn,poleIdOut,c,defaultDate) {
        this.position(poleIdFixed,c);
        var defaultD;
        if(!defaultDate){
            defaultD = null;
        } else {
            defaultD = defaultDate;
        }
        this.drow(poleIdFixed, poleIdIn,poleIdOut,defaultD);
      //  this.blockCalendar.style.visibility = "visible";
		this.blockCalendar.style.display = "block";
       };
//метод отрисовки календаря
	this.drow = function(poleIdFixed,poleIdIn,poleIdOut,defaultDate) {
/*создание нового объекта Date*/
        var now = new Date();
		var date,resultCompareDate;
        var parseDateValue = DateUtils.parseDate(poleIdIn,now,this.lan);
        if(defaultDate){defaultDate = DateUtils.stringToDate(defaultDate);}
            if(parseDateValue){
                date = parseDateValue;
            } else {
                if(defaultDate) {
                    date = defaultDate;
                } else {
                    date = now;
                }
            }
        var showDate = new Date(date.getTime());
        this.setProperties(date,showDate,poleIdFixed,poleIdIn,poleIdOut);
        this.refreshNumbers(date);
    };
/*метод установки свойств класса*/
	this.setProperties = function(date,showDate,poleIdFixed,poleIdIn,poleIdOut) {
        this.date = date;
		var m = this.date.getMonth();
        var year = this.date.getFullYear();
        this.showDate = showDate;
		this.poleIdFixed = poleIdFixed;
		this.poleIdIn = poleIdIn;
        this.poleIdOut = poleIdOut;
        //установка месяца даты в строковом виде
		this.blockDateMonth.innerHTML = this.months.months[m] + ',';
		//установка года даты в строковом виде
		this.blockDateYear.innerHTML = year;
		this.blockSelectYearSetValue(year);
	};
/*метод перерисовки чисел*/
this.refreshNumbers = function(date){
    var showDate = new Date(date.getTime());
    showDate.setDate(1);
    var index = 0;
	var delta1 = 0;
	var delta2 = 0;
	var flag=2;
	var f = 0;
	var d = showDate.getDay();//день недели 1-го числа месяца
	if(d == 0){d = d + 7;}//воскресенье
	var n = ostatok(showDate,d);
	delta1 = calendar.currentDate.getDate() + calendar.delta;
	delta2 = delta1 + calendar.colvoOfSutok;
	var rangeDateLeft = new Date();
	rangeDateLeft.setDate(delta1);
	var rangeDateRight = new Date();
	rangeDateRight.setDate(delta2);
	var metka = 0;
    var colRow = 6;

    for(var i = 0; i < 42; i++){
        var b = (index < d-1 ? b=0 : b=1);
		if(!b){
            this.cells[i].blockElement.className = "calendarEmptyDay";
            this.cells[i].blockElement.innerHTML = "00";
	    	this.cells[i].blockElement.style.display = "block";
		} else {
			if(showDate.getDate() == 1)flag --;
			if(flag == 1){
//сравнение даты с текущей
				var compareCurrentDate = DateUtils.compareDates(calendar.currentDate,showDate);
				var compareRangeDateLeft = DateUtils.compareDates(rangeDateLeft,showDate);
				var compareRangeDateRight = DateUtils.compareDates(rangeDateRight,showDate);
				var compareChooseDate = DateUtils.compareDates(showDate,calendar.date);
					if(calendar.colvoOfSutok == 0){//отображение с днями недели
						var deltaRangeLeft = DateUtils.compareDates(showDate,calendar.dateRangeLeft);
						var deltaRangeRight = DateUtils.compareDates(showDate,calendar.dateRangeRight);
						if(deltaRangeLeft != -1 && deltaRangeRight != 1){//в диапазоне
							var el = showDate.getDay();
							if(el == 0){el = 7};
							var ecval = findEcval(calendar.daysWeek,el);
							if(ecval == true) {
								if(compareChooseDate == 0){//активная не текущая дата
									this.cells[i].blockElement.className = "calendarChooseDay";
									this.cells[i].blockElement.style.display = "block";
									this.cells[i].blockElement.style.cursor = "pointer";
									f = 1;
								}else{ //активная текущая дата
									if(compareCurrentDate == 0){
										this.cells[i].blockElement.className = "calendarCurrentDay";
										this.cells[i].blockElement.style.display = "block";
										this.cells[i].blockElement.style.cursor = "pointer";
										f = 1;
									}else{
										this.cells[i].blockElement.className = "calendarDay";
										this.cells[i].blockElement.style.display = "block";
										this.cells[i].blockElement.style.cursor = "pointer";
										f = 1;
									}
								}
							} else {
								if(compareCurrentDate == 0){
									this.cells[i].blockElement.className = "calendarCurrentDay";
									this.cells[i].blockElement.style.display = "block";
									f = 0;
								}else{
								this.cells[i].blockElement.className = "calendarNonDiapazon";
								this.cells[i].blockElement.style.display = "block";
								f = 0;
								}
							}
						} else {
							if(compareCurrentDate == 0){
									this.cells[i].blockElement.className = "calendarCurrentDay";
									this.cells[i].blockElement.style.display = "block";
									f = 0;
								}else{
								this.cells[i].blockElement.className = "calendarNonDiapazon";
								this.cells[i].blockElement.style.display = "block";
								f = 0;
								}
						}
					} else {//отображение с количеством суток
						if(compareRangeDateLeft != 1 && compareRangeDateRight != -1){//диапазон
							if(compareChooseDate == 0){
								this.cells[i].blockElement.className = "calendarChooseDay";
								this.cells[i].blockElement.style.display = "block";
								this.cells[i].blockElement.style.cursor = "pointer";
								f = 1;
							}else{
								if(compareCurrentDate == 0){
									this.cells[i].blockElement.className = "calendarCurrentDay";
									this.cells[i].blockElement.style.display = "block";
									this.cells[i].blockElement.style.cursor = "pointer";
									f = 1;
								}
                                else {
									this.cells[i].blockElement.className = "calendarDay";
									this.cells[i].blockElement.style.display = "block";
									this.cells[i].blockElement.style.cursor = "pointer";
									f = 1;
								}
							}
						} else {
							if(compareCurrentDate == 0){
								this.cells[i].blockElement.className = "calendarCurrentDay";
								this.cells[i].blockElement.style.display = "block";
								f = 0;
							}else{
								this.cells[i].blockElement.className = "calendarNonDiapazon";
								this.cells[i].blockElement.style.display = "block";
								f = 0;
							}
						}

					}
				this.cells[i].setPoleContent(showDate,calendar.poleIdOut,f);
				showDate.setDate(showDate.getDate()+1);//инкремент даты
	//пока флаг=1
			} else {
				if(metka == 0){
					metka = i;
				}
				if(i < n){
                    this.cells[i].blockElement.className = "calendarEmptyDay";
                    this.cells[i].blockElement.innerHTML = "00";
                    this.cells[i].blockElement.style.display = "block";
				} else {
					this.cells[i].blockElement.style.display = "none";
                    colRow = 5;
                }
			}
		}
		index++;


    } //
        if(colRow == 6){
            if(navigator.userAgent.indexOf("MSIE")!=-1){
                        calendar.blockCalendar.style.height = 150 + "px";
                    } else {
                        if(navigator.userAgent.indexOf("Opera")!=-1){
                            calendar.blockCalendar.style.height = 149 + "px";
                        } else {
                            calendar.blockCalendar.style.height = 153 + "px";
                        }
            }
        } else {
            calendar.blockCalendar.style.height = 131 + "px";
        }
        //var tmpHeight = parseInt(calendar.blockCalendar.style.height);
        //var height = calendar.getBlockHeight();// получение высоты блока календаря
};
	this.remove = function() {
		while(this.blockCalendar.hasChildNodes())
			this.blockCalendar.removeChild(this.blockCalendar.firstChild);
	};
	this.position = function(poleIdFixed,c) {
		if(typeof c == 'undefined'){c = 0;}
		var divElementPole = document.getElementById(poleIdFixed);//получение элемента по ID
        var positionPole = getPositionData(divElementPole);
        if(c == 0){//bottom
			if(Globals.isIE6() && positionPole.left < 0){
				this.blockCalendar.style.left = -1*positionPole.left + 550 + "px";
			}
			else {
				this.blockCalendar.style.left = positionPole.left + "px";
			}
			this.blockCalendar.style.top = positionPole.top + positionPole.height + "px";
		} else {
			if(c == 1){//right
				this.blockCalendar.style.left = positionPole.left + positionPole.width + "px";
				this.blockCalendar.style.top = positionPole.top + "px";
			} else {
				if(c == 2) {//left
                    if(Globals.isIE6()){
                        if(positionPole.left < 0) {
							this.blockCalendar.style.left = -1*positionPole.left - 190 + "px";
						}
						else {
							this.blockCalendar.style.left = positionPole.left - 145 -5 + "px";
						}
					    this.blockCalendar.style.top = positionPole.top + "px";
                    } else {
                        if(navigator.userAgent.indexOf("Firefox")!=-1){
                            this.blockCalendar.style.left = positionPole.left - 145 -1 + "px";
					        this.blockCalendar.style.top = positionPole.top + "px";
                        } else {
                            this.blockCalendar.style.left = positionPole.left - 145 + "px";
					        this.blockCalendar.style.top = positionPole.top + "px";
                        }
                    }
                } else {//top
					if(navigator.userAgent.indexOf("MSIE")!=-1){
                        this.blockCalendar.style.left = positionPole.left + "px";
					    this.blockCalendar.style.top = positionPole.top -145 + "px";
                    } else {
                        if(navigator.userAgent.indexOf("Firefox")!=-1){
                            this.blockCalendar.style.left = positionPole.left + "px";
					        this.blockCalendar.style.top = positionPole.top -150 + "px";
                        } else {
                            this.blockCalendar.style.left = positionPole.left + "px";
					        this.blockCalendar.style.top = positionPole.top -148 + "px";
                        }
                    }
				}
			}
		}
	};
	this.hide = function() {
        this.blockCalendar.style.display = "none";
    };
}

//класс Ячейка
function Cell(calendar) {
	this.calendar = calendar;//ссылка на пэрент
	this.contentCell = 0;//содержимое ячейки в числовом формате
	this.date = null;
	this.dateString = null;//содержимое ячейки в строковом формате
	var cell = this;//ссылка на себя

	this.createElement = function() {//метод создания HTML-элемента
		var elem = document.createElement("div");
		elem.className = "calendarDay";
		return elem;
	};
	this.blockElement = this.createElement();//HTML-элемент
	this.blockElement.appendChild(document.createTextNode(this.contentCell));
	var calendar = this.calendar;
	this.setPoleDate = function(showDate) {
		var showDate = new Date(showDate.getTime());
		var date = DateUtils.dateToString(showDate);
		return date;
	};

	this.setPoleContent = function(showDate,poleIdOut,f){
		var poleIdOut = poleIdOut;
		this.remove();
		this.date = new Date(showDate.getTime());
		this.dateString = this.setPoleDate(showDate);
		var d = showDate.getDate();
		this.contentCell = d;
		this.blockElement.appendChild(document.createTextNode(d));

		this.blockElement.onclick = function(){
			var pole = document.getElementById(poleIdOut);
			if(f == 1){
				pole.value = cell.dateString;
				calendar.setDate(cell.date);
				cell.calendar.hide();
				if(calendar.curcallback) {
					calendar.curcallback();
				}
			}
		};
	};

	this.remove = function() {
		while(this.blockElement.hasChildNodes())
			this.blockElement.removeChild(this.blockElement.firstChild);
	};
}
//класс месяцы
function Months(calendar,date,lan) {
    this.calendar = calendar;
	var month = this;
    this.months = new Array();
    var months = {
        en : new Array('January','February','March','April','May','June','July','August','September','October','November','December'),
        ru : new Array('Январь','Февраль','Март','Апрель','Май','Июнь',"Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"),
        de : new Array('Januar','Februar','Marz','April','Mai','Juni','Juli','August','September','Oktober','November','Dezember'),
        cn : new Array('January','February','March','April','May','June','July','August','September','October','November','December')
    };
    this.months = months[lan];
    this.createElement = function(tag,id) {
		var elem = document.createElement(tag);
		elem.id = id;
		return elem;
	};
	this.blockElement = this.createElement("div", "calendarMonth");
 	this.selectElement = this.createElement("select", "calendarSelect");

	this.drowSelect = function(date){
		for(var i = 0; i < this.months.length; i++){
			this.optionElement = this.createElement("option", "");
            this.optionElement.appendChild(document.createTextNode(this.months[i]));
			this.selectElement.appendChild(this.optionElement);
			if(i == date.getMonth()){
				this.optionElement.selected = "true";
			}
		}
	};
	this.drowSelect(date);
	this.selectElement.onchange = function() {
		for(var i = 0; i < this.options.length; i++){
			var index = this.selectedIndex;
			var showDate = calendar.showDate;
			showDate.setMonth(index);//изменение месяца
			calendar.refreshNumbers(calendar.date,showDate,calendar.poleIdInOut);
		}
	};
	this.changeSelected = function(){
		for(var i = 0; i < this.months.length; i++){
			if(i == calendar.date.getMonth()){
				month.selectElement.options[i].selected = true;
			} else {
				month.selectElement.options[i].selected = false;
			}
		}
	};

	this.blockElement.appendChild(this.selectElement);
}
//класс год
function Year(className, calendar) {
//метод создания html-элемента
	this.createElement = function(tag, className) {
		var elem = document.createElement(tag);
		elem.className = className;
		return elem;
	};
	this.calendar = calendar;

	this.blockElement = this.createElement("div", className);

	this.prevYear = "<<";
	this.nextYear = ">>";
	var calendar = this.calendar;
	if(this.blockElement.className == 'calendarPrevYear'){
		this.blockElement.appendChild(document.createTextNode(this.prevYear));
	} else {
		if(this.blockElement.className == 'calendarNextYear'){
			this.blockElement.appendChild(document.createTextNode(this.nextYear));
		} else {
			alert('unknown className');
		}
	}
	this.blockElement.onclick = function(){
		var date = new Date(calendar.showDate.getTime());
		var m = date.getMonth();
		var year = date.getFullYear();
		if(this.className == 'calendarPrevYear'){
			if(m == 0){
				m=12;
				year--;//деккремент
			}
			m--;
		} else {
			if(m == 11){
				m=-1;
				year++;//инкремент
			}
			m++;
		}
		date.setDate(1);
		date.setMonth(m);//установка месяца
		date.setFullYear(year);//установка года
		calendar.blockDateMonth.innerHTML = calendar.months.months[m] + ',';
		calendar.blockDateYear.innerHTML = date.getFullYear();
		year = date.getFullYear();
		calendar.blockSelectYearSetValue(year);
		calendar.setShowDate(date);
        calendar.refreshNumbers(date);
	};
}
