var Gezisitesi = window.Gezisitesi || {};

Gezisitesi.Calendar = function( settings ) {
	this.settings = $.extend( {
		availableDates: [1,2,3,4,5],
		container: '',
		calendarCss: 'GeziCalendar',
		calendarHeaderCss: 'GeziCalendarHeader',
		calendarDaysHeaderCss: 'GeziCalendarDaysHeader',
		calendarContentCellCss: 'GeziCalendarContentCells',
		months: [GezisitesiResources.StaticText.m019,GezisitesiResources.StaticText.m020,GezisitesiResources.StaticText.m021,GezisitesiResources.StaticText.m022,GezisitesiResources.StaticText.m023,GezisitesiResources.StaticText.m024,GezisitesiResources.StaticText.m025,GezisitesiResources.StaticText.m026,GezisitesiResources.StaticText.m027,GezisitesiResources.StaticText.m028,GezisitesiResources.StaticText.m029,GezisitesiResources.StaticText.m030],
		days: [ GezisitesiResources.StaticText.m031,GezisitesiResources.StaticText.m032,GezisitesiResources.StaticText.m033,GezisitesiResources.StaticText.m034,GezisitesiResources.StaticText.m035,GezisitesiResources.StaticText.m036,GezisitesiResources.StaticText.m037],
		firstDayOfWeek: 1, // 0-Pazar, 1-Pazartesi, 2-Salı vs..
		initDate:new Date(),
		reserveStates: {
			availableDates: [0],
			reservedDates: [0],
			unknownDates: [0]
		},
		dateStateCss: {
			availableDateCss: 'GeziCalendarDayAvailable',
			reservedDateCss: 'GeziCalendarDayNotAvailable',
			unknownDateCss: 'GeziCalendarDayStateUnknown'
		}
	}, settings || {});

	this.render();
};

Gezisitesi.Calendar.prototype.isLeapYear = function( year ) {
	return (((year%4==0) && (year%100!=0)) || (year%400==0)) ? true : false;
}

Gezisitesi.Calendar.prototype.daysInMonth = function( month, year ) {
	switch( month )
	{
		case 1: case 3: case 5: case 7: case 8: case 10: case 12:
			return 31;
			break;
		case 2:
			if ( this.isLeapYear( year ) )
				return 29;
			else
				return 28;
			break;
		default:
			return 30;
	}
};

Gezisitesi.Calendar.prototype.getDaysHeader = function() {
	var htmlSource = '';
	for( var i=0; i < 7; i++ )
		htmlSource += '<td class="'+ this.settings.calendarDaysHeaderCss +'">' + this.settings.days[i] + '</td>';
	return htmlSource;
};

Gezisitesi.Calendar.prototype.render = function() {				
	
	if (this.settings.container == '') return;
	
	var initdate = this.settings.initDate;

	var month = initdate.getMonth()+1;
	var year = initdate.getFullYear();
	var date = initdate.getDate();
	var daysInMonth = this.daysInMonth( month, year );
	
	var currentDate=new Date();
	var currentMonth = currentDate.getMonth()+1;
	var today = currentDate.getDate();
	var htmlSource =
		'<table id="GeziCalendar" cellspacing="1" cellpadding="2" border="0" class="'+ this.settings.calendarCss +'">' +
			'<tr><td class="'+ this.settings.calendarHeaderCss +'" colspan="7">'+ this.settings.months[month-1] + ' ' + year.toString() +'</td></tr>'+
			'<tr>'+ this.getDaysHeader() +'</tr>'+
			'<tr>';
	
	var firstDateOfMonth = new Date( year, month-1, 1 );
	var tableOffset = 7-this.settings.firstDayOfWeek;
	var calendarOffset = (firstDateOfMonth.getDay()+tableOffset)%7;
	
	for( i = 1; i <= 42; i++ )
	{
		var activeDay = i - calendarOffset;	
		if ((i > calendarOffset) && ( activeDay <= daysInMonth ) && (activeDay >= date) && (currentMonth!=month || today <= activeDay))
		{ 
			cellContent = activeDay.toString();

				htmlSource += '<td class="'+this.settings.calendarContentCellCss+ ' ' + this.getDatesReserveStateCss(activeDay) +'">'+activeDay.toString()+'</td>';
			
		}
		else
		{
			htmlSource += '<td>&nbsp;</td>';
		}
		
		if ((i%7==0)&&(i<36)) htmlSource += '</tr><tr>';
	}
		
	htmlSource += '</tr></table>';

	$('#'+this.settings.container).html( htmlSource );
};

Gezisitesi.Calendar.prototype.getDatesReserveStateCss = function( date ) {
	
	for(var i=0; i< this.settings.reserveStates.availableDates.length; i++)
		if ( this.settings.reserveStates.availableDates[i] == date ) return this.settings.dateStateCss.availableDateCss;
	
	/*
	for(var i=0; i< this.settings.reserveStates.reservedDates.length; i++)
		if ( this.settings.reserveStates.reservedDates[i] == date ) return this.settings.dateStateCss.reservedDateCss;
	*/
	
	//return this.settings.dateStateCss.unknownDateCss;
	return this.settings.dateStateCss.reservedDateCss;
}