/* Date constants
====================================*/
	
	var DATES=new Object;
	DATES={
		today:new Date(),
		yesterday:new Date(),
		tommorow:new Date(),
		monthMinus:new Date(),
		monthPlus:new Date(),
		months:new Array("января","февраля","марта","апреля","мая","июня","июля","августа","сентября","октября","ноября","декабря"),
		monthsNominative:new Array("январь","февраль","март","апрель","май","июнь","июль","август","сентябрь","октябрь","ноябрь","декабрь"),
		monthsDaysMax:new Array(31,28,31,30,31,30,31,31,30,31,30,31),
		days:['воскресенье','понедельник','вторник','среда','четверг','пятница','суббота','воскресенье'],
		daysShort:['вс','пн','вт','ср','чт','пт','сб','вс'],
		daysRfc:['sun','mon','tue','wed','thu','fri','sat','sun'],
		endings:{
			'hours':{
				'_default':'часов',
				1:'час',
				2:'часа',
				3:'часа',
				4:'часа'
				},
			'days':{
				'_default':'дней',
				1:'день',
				2:'дня',
				3:'дня',
				4:'дня'
				}
			},
		getEnging:function(num,endings){
			if (!endings){
				return DATES.endings.hours;
				}
			else if(is_string(endings) && DATES.endings[endings]){
				endings=DATES.endings[endings];
				}
			else if (!is_object(endings)){
				return '';
				}
			
			var 
				rm=num%10,
				strEnding=endings['_default'];
			if (isset(endings[rm])){
				strEnding=endings[rm];
				}
			if (num%100>=11 && num%100<=14){
				strEnding=endings['_default'];
				}
			return num+' '+strEnding;
			}
		}
	
	DATES.monthPlus.setDate(DATES.today.getDate()+30);
	DATES.monthMinus.setDate(DATES.today.getDate()-30);
	DATES.yesterday.setDate(DATES.today.getDate()-1);
	DATES.tommorow.setDate(DATES.today.getDate()+1);


/* Dates basic operations
====================================*/
	
	function getMonthSelector(selectID,mActive){
		var o='<select id="'+selectID+'">',isSelected,m;
		for (var m=0; m<DATES.months.length; m++){
			isSelected=(m==mActive)?' selected="selected"':'';
			o+='<option value="'+m+'"'+isSelected+'>'+DATES.months[m]+'</option>';
			}	
		o+='</select>';
		
		return o;
		}

	function getYearSelector(selectID,yActive,yLength){
		var o='<select id="'+selectID+'">',isSelected,cy;
		for (var y=0; y<yLength; y++){
			cy=yActive+y;
			isSelected=(y==yActive)?' selected="selected"':'';
			o+='<option value="'+cy+'"'+isSelected+'>'+cy+'</option>';
			}	
		o+='</select>';
		return o;
		}
	function getOffsetDaysFromDate(days,dt){
		var d=new Date(),
			nd=dt?dt:d
		d.setHours(nd.getHours());
		d.setMinutes(nd.getMinutes());
		d.setSeconds(nd.getSeconds());
		d.setMonth(nd.getMonth());
		d.setFullYear(nd.getFullYear());
		d.setDate(nd.getDate()+days);
		return d
		}
	function getOffsetMonthsFromDate(months,dt){
		var d=new Date(),
			nd=dt?dt:d,
			yearOffSet=0
		if (!months) months=1;			
		if (nd.getMonth()+months>11) yearOffSet=1;
		if (nd.getMonth()+months<0) yearOffSet=-1;
		d.setMonth(nd.getMonth()+months);
		d.setFullYear(nd.getFullYear()+yearOffSet);
		d.setDate(nd.getDate());
		return d
		}

	function getTimeStr(h,m){
		return ((String(h).length<2?0:'')+String(h)+':'+(String(m).length<2?0:'')+String(m));
		}
	
	
		

/* Date Prototypes
====================================*/
/* 
	Date.prototype.getReadable=function(){
		var d=this.getDate(),
		m=DATES.months[this.getMonth()],
		y=this.getFullYear(),
		o=d+' '+m+' '+y;
		return o;	
		}
		
	Date.prototype.getReadableSimple=function(){
		var d=this.getDate().toString(),
			m=(this.getMonth()+1).toString(),
			y=this.getFullYear().toString()
		if (d.length<2) d="0"+d;
		if (m.length<2) m="0"+m;		
		var o=d+'.'+m+'.'+y;
		return o;	
		}
		
	Date.prototype.getTimeStamp=function(){
		var d=this.getDate(),
		m=this.getMonth()+1,
		y=this.getFullYear();
		
		if (d<10) d="0"+d;
		if (m<10) m="0"+m;

		return ""+y+m+d+"000000";
		}
		
	Date.prototype.getFromTimeStamp=function(ts){
		ts=ts+"";
		var y=parseInt(ts.substr(0,4)),
		m=parseInt(ts.substr(4,2))-1,
		d=parseInt(ts.substr(6,2));
		
		this.setFullYear(y)
		this.setMonth(m)
		this.setDate(d)
		this.setHours(0)
		this.setMinutes(0)
		this.setSeconds(0)
	
		return true
		}
			
	Date.prototype.offsetDaysFromDate=function(days,dt){
		var nd=dt?dt:this;
		
		this.setMonth(nd.getMonth());
		this.setFullYear(nd.getFullYear());
		this.setDate(nd.getDate()+days);
		return this
		} */
		
/* Calendar
====================================*/

	function Calendar(targetField,pastLimit,futureLimit,startMonth,onselect){
		this.construct=function(){			
			if (this.block || !targetField) return false;
			this.targetField=targetField;
			this.targetField.calendarObject=this;
			this.targetField.onkeypress=this.targetField.onkeydown=this.targetField.onclick=function(){return false;}
			this.onselect=onselect;
			this.pastLimit=pastLimit;
				this.pastLimit.nullHms();
				this.pastLimit.setDate(1);
			this.futureLimit=futureLimit;
				this.futureLimit.nullHms();
				this.futureLimit.setDate(1);
			var defaultStartMonth=(new Date()).nullHms();
			defaultStartMonth.setDate(1);
			if (startMonth){
				this.startMonth=startMonth
				}
			else if (this.targetField && is_date(this.targetField.value_date)){
				this.startMonth=this.targetField.value_date.duplicate();
				this.startMonth.setMonth(this.targetField.value_date.getMonth());
				this.startMonth.nullHms().setDate(1);
				}
			else{
				this.startMonth=defaultStartMonth
				}
			
			this.minBlockWidth=300;			
			}
		
		
		this.buildBlock=function(){
			
			var 
				cObject=this,
				$this=this;
			this.block=setChild(document.body,this.targetField.id+"_calendar","calendar","DIV");
			this.setBlockPosition();			
			
			this.block.calendarObject=this;
			this.block.head=setChild(this.block,this.block.id+"_head","months","DIV");
			this.block.head.prevBtn=setChild(this.block.head,this.block.head.id+"_prevBtn","prev","DIV","prevMonth");
			this.block.head.currMonth=setChild(this.block.head,this.block.head.id+"_currMonth","curr","DIV","currMonth");
			this.block.head.nextBtn=setChild(this.block.head,this.block.head.id+"_nextBtn","next","DIV","nextMonth");
			this.block.body=setChild(this.block,this.block.id+"_body","days","DIV","days");
			
			this.block.btnClose=setChildExt(
				{
					parent:this.block,
					tag:'A',
					id:this.block.id+'_btnClose',
					className:'btn-close',
					content:'Закрыть',
					onclick:function(){
						$this.killBlock();
						return false;
						}
					}
				);	
			if ($value(this.targetField)){
				this.block.btnClear=setChildExt(
					{
						parent:this.block,
						tag:'A',
						id:this.block.id+'_btnClear',
						className:'btn-clear',
						content:'Сбросить',
						onclick:function(){
							$this.clear();
							return false;
							}
						}
					);
				}
			TriDorogiPage.registerBlurKilled(this.block);			
			toArrestEvent(this.targetField,this.block);
			toArrestEvent($id(this.targetField.id+'_full-options'),this.block);
			}
		this.setBlockPosition=function(){
			var	pos=getWhereIs(this.targetField);
			setPosition(this.block,{left:pos.left,top:pos.top+this.targetField.offsetHeight});
			this.block.style.width=Math.max(this.targetField.offsetWidth,this.minBlockWidth)-2+"px";
			
			}
		this.killBlock=function(){
			
			if (this.block) {
				unsetChild(this.block);
				}
			//this.block=null
			return false
			}
		this.killBlockByBlur=function(){
			if (!this.calendarObject){
				return false;
				}
			this.calendarObject.killBlock.call(this.calendarObject);
			return false;
			}
			
			
		this.printMonth=function(curr){
			var $this=this;
			this.currMonthBegin=curr;
			var nextMonthBegin=getOffsetMonthsFromDate(1,curr),
				prevMonthBegin=getOffsetMonthsFromDate(-1,curr);

			this.block.head.prevBtn.innerHTML=String(DATES.monthsNominative[prevMonthBegin.getMonth()]).firstCharUpper();
			this.block.head.currMonth.innerHTML=String(DATES.monthsNominative[this.currMonthBegin.getMonth()]).firstCharUpper()+', <em>'+curr.getFullYear()+'</em>';
			this.block.head.nextBtn.innerHTML=String(DATES.monthsNominative[nextMonthBegin.getMonth()]).firstCharUpper();
			
			if (prevMonthBegin.getTime()>=this.pastLimit.getTime()){
				this.block.head.prevBtn.innerHTML='<a>'+this.block.head.prevBtn.innerHTML+'</a>'
				var a=$tagname("A",this.block.head.prevBtn)
				a.calendObj=this
				a.newMonth=prevMonthBegin
				a.onclick=this.updateMonth
				}
			else {
				this.block.head.prevBtn.innerHTML='<span>'+this.block.head.prevBtn.innerHTML+'</span>';
				}
			
			if (nextMonthBegin.getTime()<=this.futureLimit.getTime()){
				this.block.head.nextBtn.innerHTML='<a>'+this.block.head.nextBtn.innerHTML+'</a>'
				var a=$tagname("A",this.block.head.nextBtn)
				a.calendObj=this
				a.newMonth=nextMonthBegin
				a.onclick=this.updateMonth
				}
			else {
				this.block.head.nextBtn.innerHTML='<span>'+this.block.head.nextBtn.innerHTML+'</span>'
				}
			
			var daysO="",
				daysCurr=new Date(),
				num=0,
				daysCurr=this.currMonthBegin;
			$clear(this.block.body);
			
			//add empty spans at month's begining
			for (var n=daysCurr.getDay()-1;n>0;n--){
				setChild(this.block.body,null,null,"SPAN",'&nbsp;')
				}
			while(daysCurr.getMonth()==this.currMonthBegin.getMonth()){				
				var spanClass="day_"+daysCurr.getDay(),					
					spanEl=setChildExt(
						{
							parent:this.block.body,
							tag:'SPAN',
							id:this.block.body.id+'_day_'+daysCurr.getTimeStamp(),
							className:spanClass,
							content:(daysCurr.getDay()==0 || daysCurr.getDay()==6)?'<em class="weekend">'+daysCurr.getDate()+'</em>':daysCurr.getDate()
							}
						);
				if 	(
						!( 
							daysCurr.getMonth()==DATES.today.getMonth()
							&& daysCurr.getFullYear()==DATES.today.getFullYear()
							&& daysCurr.getDate()<DATES.today.getDate()
							)
		
					){
					var a=setChildExt(
						{
							parent:spanEl,
							tag:'A',
							className:($this.targetField.value_date && $this.targetField.value_date.equal(daysCurr))?'current':'',
							params:{
								calendObj:$this,
								selectedData:daysCurr
								},							
							content:$clear(spanEl),
							onclick:function(){								
								$this.selectDate(this.selectedData);
								return false;
								}
							}
						);
					}
					
				if (daysCurr.getDay()==0)
					setChild(this.block.body,null,"clear","EM")
				daysCurr=getOffsetDaysFromDate(1,daysCurr);				
				}
			daysO+='<div class="clear0"></div>';
			}
			
		this.updateMonth=function(){
			this.calendObj.printMonth.call(this.calendObj,this.newMonth)
			}
		this.selectDate=function(dt){			
			this.targetField.value=dt.getReadableSimple();
			
			this.targetField.value_dt=dt.toDT();
			this.targetField.value_date=dt;
			if (this.targetField.onclick) {
				this.targetField.onclick.call(this.targetField);
				}
			this.killBlock()
			if (is_function(this.onselect)){
				this.onselect(dt);
				}
			return false;
			}
		this.clear=function(){
			this.targetField.value='';
			
			this.targetField.value_dt=null;
			this.targetField.value_date=null;
			if (this.targetField.onclick) {
				this.targetField.onclick.call(this.targetField);
				}
			this.killBlock();
			if (is_function(this.onselect)){
				this.onselect();
				}
			return false;
			}
		
		this.construct()
		this.buildBlock()
		this.printMonth(this.startMonth)
		return false;
		}
		

function showCalendar(e){	
	killAllCalendars();
	var calend=new Calendar(this,new Date(),getOffsetDaysFromDate(365))
	//EVENTS.append(this,["onblur"],calend.killBlockByBlur);
	return
	}
	
function killAllCalendars(){
	var calendars=getElementsByTagAndClass(document.body,'DIV','calendar')
	for (var i in calendars){
		var c=calendars[i];		
		if (c && c.calendarObject && c.calendarObject.killBlock){
			
			c.calendarObject.killBlock();
			}
		}
	}
