/*<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />*/
/*
	Класс календаря на JQuery
	2011.03.03
*/

var jCalendar = function(){
	this.months = new Array();
	this.weekdays = new Array();
	this.dateFormat = 'd.m.Y'; 
	/*в PHP стиле 
	Y - Порядковый номер года, 4 цифры - Примеры: 1999, 2003
	m - Порядковый номер месяца с ведущими нулями - От 01 до 12
	d - День месяца, 2 цифры с ведущими нулями - от 01 до 31
	*/
	this.inputValue = ''; //значение передаваемое в календарь
	this.date = null;
	this.wnd = null;
	this.positionLeft = 0;
	this.positionTop = 0;	
	//var curDate = new Date();
	this.identity = '';
	
}
jCalendar.prototype.close_callback = function(){}; //вызов после закрытия

//создание календаря
jCalendar.prototype.create = function(){
	this.language_include();
	
	if ( $('#'+this.identity).length > 0 ){ $.setMaxZIndex( $('#'+this.identity) ); return false; }
	
	if (this.check_date_format() == false) return false;

	this.startYear = this.date.getFullYear() - 10;
	this.endYear = this.date.getFullYear() + 10;



	this.paint();
	
	$.setMaxZIndex( this.wnd );

}

//отправляет дату во внешние контейнер
jCalendar.prototype.outDate = function(){
	this.strDate = this.convertDateToFormat();
	if ('function' == typeof this.success_callback) this.success_callback();
}
jCalendar.prototype.convertDateToFormat = function(){
	var sDate;
	
	var sYear = new String(this.date.getFullYear());
	var sMonth = new String( (this.date.getMonth()+1) );
	var sDay = new String(this.date.getDate());	

	
	//.lpad('0',4)
	sDate = this.dateFormat;
	re = /[Y]/;
	sDate = sDate.replace(re,sYear.lpad('0',4));
	re = /[m]/;
	sDate = sDate.replace(re,sMonth.lpad('0',2));
	re = /[d]/;
	sDate = sDate.replace(re,sDay.lpad('0',2));		

	return sDate;
}

jCalendar.prototype.jc_close = function(){
	this.wnd.remove();
	for ( o in this )
		delete this[o];
	this.close_callback();
}

jCalendar.prototype.paint = function(){
	var gthis = this;
	this.wnd = $('<div>');
	this.wnd.addClass('jc_main');
	this.wnd.css('left',this.positionLeft+'px');
	this.wnd.css('top',this.positionTop+'px');	
	this.wnd.attr('id',this.identity);
	$('body').append( this.wnd );
	this.paint_content();
	
	this.wnd.click( function(){
		$.setMaxZIndex( gthis.wnd );
	} );
	
	
}

jCalendar.prototype.paint_content = function(){
	var gthis = this;
//	var wnd = $('<div>');
//	wnd.css('left',this.positionLeft+'px');
//	wnd.css('top',this.positionTop+'px');	
//	wnd.addClass('jc_main');
//	wnd.attr('id',this.identity);
	
	var objHeader = $('<div>');
	this.wnd.text('').append( objHeader );
	objHeader.addClass('jc_header');

	var objTitle = $('<div>');
	objHeader.append( objTitle );
	objTitle.addClass('jc_title');
	objTitle.html('Calendar');

	var objClose = $('<div>');
	objHeader.append( objClose );
	objClose.addClass('jc_close');
	objClose.click( function(){
		gthis.jc_close();
	} );

	var objBody = $('<div>');
	this.wnd.append( objBody );
	objBody.addClass('jc_body');
	
	var objDatesBlock = $('<div>');
	objBody.append( objDatesBlock );
	objDatesBlock.addClass('jc_dates_block');
	
	var objMonthSelect = $('<select>');
	objDatesBlock.append( objMonthSelect );
	objMonthSelect.addClass('jc_month_select');
	var la = this.months.length;
	for (var i = 0; i < la; i++ ){
		var objOption = $('<option>');
		objOption.attr('value', i );
		if ( i == this.date.getMonth() ){
			objOption.attr('selected', true);	
		}
		objOption.text( this.months[i] );
		objMonthSelect.append( objOption );
	};
	objMonthSelect.change( function(){
		gthis.date.setMonth( $(this).attr('value') );
		gthis.paint_content();
	} );	

	var objYearSelect = $('<select>');
	objDatesBlock.append( objYearSelect );
	objYearSelect.addClass('jc_year_select');
	for (var i = this.startYear; i < this.endYear; i++){
		var objOption = $('<option>');
		objOption.attr('value', i );
		if ( i == this.date.getFullYear() ){
			objOption.attr('selected', true);	
		}
		objOption.text( i );
		objYearSelect.append( objOption );
	}
	objYearSelect.change( function(){
		gthis.date.setFullYear( $(this).attr('value') );
		gthis.startYear = gthis.date.getFullYear() - 10;
		gthis.endYear = gthis.date.getFullYear() + 10;
		gthis.paint_content();
	} );
	
	var objNoFloat = $('<div>');
	objNoFloat.addClass('nofloat');
	objDatesBlock.append( objNoFloat );
	
	var o = $('<div>');
	o.addClass('jc_dates_target');
	objBody.append( o );
	

	
	$.setMaxZIndex( this.wnd );
//	alert(wnd.html());

	//this.wnd.replaceWith( wnd );

	this.paint_days();

//	this.wnd.
}

jCalendar.prototype.paint_days = function(){
	var gthis = this;
	//Узнаем количество дней
	
	var dayCount = new Date( this.date.getFullYear(), this.date.getMonth()-1, 0 ).getDate();
	//Получить стартовый день недели
	var dayWeek = new Date( this.date.getFullYear(), this.date.getMonth(), 1).getDay();
	
	var curDay = this.date.getDate();
	var curMonth = this.date.getMonth();
	var curYear = this.date.getFullYear();	

	
	if ( dayWeek==0 ){ dayWeek = 7; };
	
	var datesObj = $('<div>');
	//this.datesObj.replaceWith( datesObj );
	
	var tblCal = $('<table>');
	tblCal.addClass('jc_table_days');
	datesObj.append( tblCal );
	
	var tblCalTr = $('<tr>');
	tblCal.append( tblCalTr );
	
	var l = this.weekdays.length;
	for ( var i = 0; i < l; i++ ){
		var tblCalTh = $('<th>');
		tblCalTr.append(tblCalTh);
		tblCalTh.text(this.weekdays[i]);
	}
	
	
	var tblCalTr = $('<tr>');
	tblCal.append( tblCalTr );	
	var curDayWeek = 1;
	for ( var i = curDayWeek; i < dayWeek; i++ ){ //заполняем пустые дни недели до начала расчета
		var tblCalTd = $('<td>');
		tblCalTr.append(tblCalTd);			
	}
	curDayWeek = i;
	//alert(curDay);
	for ( var i = 1; i <= dayCount; i++ ){
		var tblCalTd = $('<td>');
		tblCalTr.append(tblCalTd);
		tblCalTd.text(i);
		if (curDay==i){
			tblCalTd.addClass('selected');
		}
		tblCalTd.mouseover( function(){
			$(this).addClass('jc_day_over');							 
		});
		tblCalTd.mouseleave( function(){
			$(this).removeClass('jc_day_over');							 
		});	
		tblCalTd.click( function(){
			var d = parseInt($(this).text(),10);
			gthis.date.setDate(d);
			gthis.outDate();
			gthis.jc_close();							 
		});			
		curDayWeek++;
		if ( curDayWeek > 7 ){
			curDayWeek = 1;
			var tblCalTr = $('<tr>');
			tblCal.append( tblCalTr );
		}
	}

	for ( var i = curDayWeek; i <= 7; i++ ){ //заполняем пустые дни недели до начала расчета
		var tblCalTd = $('<td>');
		tblCalTr.append(tblCalTd);			
	}
	this.wnd.find('.jc_dates_target').text('').append( datesObj );
}


jCalendar.prototype.success_callback = function(){
	alert(3);
}
jCalendar.prototype.language_include = function(){
	this.months.push("январь","февраль","март","апрель","май","июнь","июль","август","сентябрь","октябрь","ноябрь","декабрь");	
	this.weekdays.push("пн","вт","ср","чт","пт","сб","вс");		
	this.messages = {
		'format_date_incorrect':'Формат даты некорректный'	
	};
	
}

//проверка формата даты
jCalendar.prototype.check_date_format = function(){
	this.date = new Date();
	
	if ( this.inputValue.length == 0 ){
		return true;
	}
	
	//alert(this.dateFormat);
	//Распарсить эту байду
	var regexpstring;
	regexpstring = "";
	Y = 0;
	m = 0;
	d = 0;	
	mat = 1;
	for (i=0; i<this.dateFormat.length; i++){
		switch(this.dateFormat.substr(i,1)){
			case "Y":
				regexpstring +="([0-9]{4})";
				Y = mat;
				mat++;
				break;
			case "m":
				regexpstring +="([0,1][0-9])";
				m = mat;
				mat++;
				break;
			case "d":
				regexpstring +="([0-3][0-9])";
				d = mat;
				mat++;
				break;														
			default:
			regexpstring += this.dateFormat.substr(i,1);
		}
	}	
	re = new RegExp(regexpstring);
	
	if (!re.test(this.inputValue)){
		this.error( 'format_date_incorrect' );
		return false;
	}

	
	myArray = re.exec(this.inputValue);	

	this.selectedYear = parseInt( myArray[Y], 10 );
	this.selectedMonth = parseInt( myArray[m], 10 );
	if ( this.selectedMonth < 1 ) this.selectedMonth = 1;
	if ( this.selectedMonth > 12 ) this.selectedMonth = 12;
	this.selectedDay = parseInt( myArray[d], 10 );


	this.date.setFullYear(this.selectedYear);
	this.date.setMonth(this.selectedMonth-1);
	this.date.setDate(this.selectedDay);
	
	return true;
//	if (this.startYear>this.endYear) this.startYear=this.endYear;

}
jCalendar.prototype.error = function( sError ){
	alert( this.messages[sError] );
	
}





