var mn=['Январь','Февраль','Март','Апрель','Май','Июнь','Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'];
var mnspr=['января','февраля','марта','апреля','мая','июня','июля','августа','сентября','октября','ноября','декабря'];
var dim=[31,0,31,30,31,30,31,31,30,31,30,31];
var week=['пн','вт','ср','чт','пт','сб','вс'];
var avail_days=[1,2,3,4,5,6,7];
var CalendarObjects = new Array();
var only_future = true;

function BuildCalendar( InputID, DivID, ContentDivID, showDateDiv ){
	var cdc1 = new Calendar( InputID, InputID, false, showDateDiv ); cdc1.build( ContentDivID, DivID );
	var div = document.getElementById( DivID );
	div.style.display = 'block';
}

function select_day( prefix, day ){
	CalendarObjects[ prefix ].select_day( day );
}

function swap_style( prefix, day, obj, is_over ){
	if ( CalendarObjects[ prefix ].d != day ){
		obj.className = is_over ? 'overed' : '';
	}
}

function change_month( prefix, sel ){
	CalendarObjects[ prefix ].change_month( sel );
}

function change_month_top( prefix, date, from_m )
{
	var r=new RegExp( /(\d{1,2})-(\d{4})?/g );
	var parts = r.exec( date );
	CalendarObjects[ prefix ].change_year( parts[2] );
	CalendarObjects[ prefix ].change_month( parts[1] );
	document.getElementById( 'month'+parts[1] ).className = 'selected';
	document.getElementById( 'month'+from_m ).className = '';
}

function change_year( prefix, sel ){
	CalendarObjects[ prefix ].change_year( sel );
}

function Calendar( prefix, outfield, show_hours, showDateDiv ){
	this._prefix = prefix;
	this._outfield = outfield;
	this._show_date_div = showDateDiv;
	this.d = 0;
	this.m = 0;
	this.y = 0;
	this.h = 0;
	this.s = 0;
	this.divID = 0;
	CalendarObjects[ prefix ] = this;
	

	this.get_day = function (){
		return this.d;//_get_object('_day').value;
	}
	
	this.get_month = function(){
		//var sel =  this._get_object('_mouths');
		return this.m;//sel.options[ sel.selectedIndex ].value;
	}
	
	this.get_year = function(){
		//var sel =  this._get_object('_years');
		return this.y;//sel.options[ sel.selectedIndex ].value;
	}
	
	this._normNumber = function ( num ){
		return String( num ).length==1 ? '0' + num : num;
	}
	
	this._get_object = function ( name ){
		return document.getElementById( this._prefix+name );
	}
	
	this.get_out_obj_value = function(){
		var obj = document.getElementById( this._outfield );
		return obj.value;
	}
	
	this.set_out_obj_value = function( value ){
		var obj = document.getElementById( this._outfield );
		obj.value = value;
	}
	
	this._build_out_date = function(){
		var m = this.get_month();
		var d = this.get_day();
		var y = this.get_year();
		
		var str=y+'-'+this._normNumber( parseInt( m ) + 1 )+'-'+this._normNumber( d );
		
		this.set_out_obj_value( str );
		var dispDate = d+' '+mnspr[m]+' '+y+'г';
		document.getElementById( this._show_date_div ).innerHTML = dispDate;
	}
	
	this._rebuild_days = function(){
		var m = this.get_month();
		var d = this.get_day();
		var y = this.get_year();
		
		var dstr = this._build_day_table();
		var div=this._get_object( 'id_calendar' );
		div.innerHTML=dstr;
		this._build_out_date();
	}
	
	this._rebuild_months = function(){
		var m = this.get_month();
		var y = this.get_year();
		
		var mobj=this._get_object( '_mouths' );
		this._rebuild_days();
	}
	
	this._build_day_table = function(){
		var str='<div id="'+this._prefix+'id_calendar">';
		str+='<table class="daycalendar" cellspacing="0"><tr>';
		for( i=0; i<7; i++ ){
			if (i in avail_days)
			{
				str+='<th>'+week[i]+'</th>';
			}
			else
			{
				str+='<th class="notavail">'+week[i]+'</th>';
			}
		}
		str+='</tr>';
		var fdate=new Date(this.y, this.m, 1);
		str += '<tr>';

		var startDay = fdate.getDay();
		if ( startDay == 0 )
			startDay = 7;
			  
		for(i=0;i<startDay-1;i++) {
			str += '<td>&nbsp;</td>';
		}
		var j=0; var c=0;
		var today=new Date();
		for( i=0, j = startDay-1, c=startDay; i<dim[ this.m ]; i++, j++, c++){
			if( j != 0 && j % 7 == 0 ){
				c=1;
				str+="</tr><tr>";
			}
			if (j % 7 in avail_days && ( this.check_future( today, i + 1 ) ) )
			{
				str += '<td id="'+this._prefix+'tdday'+( i+1 )+'" '+( this.d==i+1 ? 'class="selected"' : 'class="notselected"' )+' onclick="javascript:select_day( \''+this._prefix+'\', '+(i+1)+' );return false;" onmouseover="swap_style( \''+this._prefix+'\', '+(i+1)+', this ,1 );" onmouseout="swap_style( \''+this._prefix+'\', '+(i+1)+', this , 0 );" >'+(i+1)+'</td>';
			}
			else
			{
				str += '<td id="'+this._prefix+'tdday'+( i+1 )+'" class="notavail">'+(i+1)+'</td>';
			}
		}
		for( i=j;; i++ ){
			if( i%7 == 0 ) break;
			str+='<td>&nbsp;</td>';
		}
		str+='</tr>';
		str+='</table>';
		str+='</div>';
		return str;
	}
	
	this.check_future = function( today, day )
	{
		checkDate = new Date();
		checkDate.setFullYear( this.y, this.m, day );
		return today <= checkDate;
	}
	
	this.select_day = function( day ){
		prevday = document.getElementById( this._prefix+'tdday'+Math.abs( this.d ) );
		if ( prevday )
			prevday.className='notselected';
		this.d = day;
		thisday = document.getElementById( this._prefix+'tdday'+Math.abs( this.d ) );
		if ( thisday )
		{
			thisday.className='selected';
		}
		else if(day > 0)
		{
			this.select_day( day - 1 );
		}
		this._build_out_date();
	}
	
	this.change_month = function ( month ){
		this.m = month;
		this._rebuild_months();
		//this._build_out_date();
	}
	
	this.change_year = function ( year ){
		this.y = year;
		var oD = new Date(this.y, 1, 1);
		dim[1]=(((oD.getFullYear()%100!=0)&&(oD.getFullYear()%4==0))||(oD.getFullYear()%400==0))?29:28;
		this._rebuild_months();
		//this._build_out_date();
	}
	
	this.build_today = function(){
		var todaydate=new Date();
		this.m=todaydate.getMonth();
		this.y=todaydate.getFullYear();
		this.d=todaydate.getDate();
		var dispDate = this.d+' '+mnspr[this.m]+' '+this.y+'г';
		document.getElementById( this._show_date_div ).innerHTML = dispDate;
	}
	
	this.build = function( contentDivID, divID  ){
		this.divID = divID;
		var date = this.get_out_obj_value();
		if ( date != '' ){
			try {
				var r=new RegExp( /(\d{4})?-(\d{1,2})?-(\d{1,2})?(\s(\d{1,2})?:(\d{1,2})?)?/g );
				var parts = r.exec( date );
				this.y=parseInt( parts[1].replace(/^0+/, "") );
				this.m=parseInt( parts[2].replace(/^0+/, "") ) - 1;
				this.d=parseInt( parts[3].replace(/^0+/, "") );
			} catch(e) {
				this.build_today()
			}
		} else {
			this.build_today()
			this._build_out_date();
		}
		
		var oD = new Date(this.y, 1, 1);
		dim[1]=(((oD.getFullYear()%100!=0)&&(oD.getFullYear()%4==0))||(oD.getFullYear()%400==0))?29:28;
		
		mt = this.get_month_top();
		mt1 = this.get_month_top( 1 );
		yt = this.get_year_top();
		yt1 = this.get_year_top( 1 );
		
		var out = '<table class="calendar"><tr class="header">';
		out += '<td id="month'+mt+'" '+(this.m==mt?'class="selected"':'')+' onclick="change_month_top(\''+this._prefix+'\', \''+mt+'-'+yt+'\', \''+mt1+'\');">'+mn[mt]+' '+yt+'</td>';
		out += '<td id="month'+mt1+'" '+(this.m==mt1?'class="selected"':'')+' onclick="change_month_top(\''+this._prefix+'\', \''+mt1+'-'+yt1+'\', \''+mt+'\');">'+mn[mt1]+' '+yt1+'</td>';
		out += '</tr><tr><td colspan='+( 2 )+'>';
		out += this._build_day_table();
		out += '</td></tr><tr><td colspan="2" class="calendar-bottom">&nbsp;</td></tr></table>';
		var div = document.getElementById( contentDivID );
		div.innerHTML = out;
		
		var dispDate = this.d+' '+mnspr[this.m]+' '+this.y+'г';
		document.getElementById( this._show_date_div ).innerHTML = dispDate;
	}
	
	this.get_month_top = function( delta )
	{
		var todaydate=new Date();//this.get_today_date();
		m=todaydate.getMonth()+( delta ? delta : 0 );
		if ( m > 11 )
			m = 0;
			
		return m;
	}
	
	this.get_year_top = function( delta )
	{
		var todaydate=new Date();//this.get_today_date();
		m=todaydate.getMonth()+1+( delta ? delta : 0 );
		y=todaydate.getFullYear();
		if ( m > 12 )
			y += 1;
			
		return y;
	}
	
	this.get_today_date = function()
	{
		var date = this.get_out_obj_value();
		if ( date != '' ){
			try {
				var r=new RegExp( /(\d{4})?-(\d{1,2})?-(\d{1,2})?(\s(\d{1,2})?:(\d{1,2})?)?/g );
				var parts = r.exec( date );
				dob = new Date( );
				dob.setFullYear(parseInt( parts[1] ), parseInt( parts[2] ), parseInt( parts[3] ) );
				return dob;
			} catch(e) {
				return new Date();
			}
		} else {
			return new Date();
		}
	}
}
