var CalendarController = {
	calendarsLoaded: false,
	reserved: '',
	pending: '',
	validators: new Array(),

	init: function() {
		if(!this.calendarsLoaded) {
			$.ajax({
				url: appConf.siteUrl + 'reservation/pullReservedDays',
				dataType: 'json',
				data: {
					apartmentId: 1
				},
				success: function(data) {
					if (data) {
						CalendarController.setCalendar(1, data.reserved, data.pending);
					}
				}
			});
			$.ajax({
				url: appConf.siteUrl + 'reservation/pullReservedDays',
				dataType: 'json',
				data: {
					apartmentId: 2
				},
				success: function(data) {
					if (data) {
						CalendarController.setCalendar(2, data.reserved, data.pending);
					}
				}
			});
		}
		this.setValidators();
		$('.telephone').keyup(function(){
			var allowed = $(this).val().match(/[0-9-+\(\) ]+/g);
			if (allowed) {
				allowed = allowed.join('');
				if($(this).val() != allowed) {
					$(this).val(allowed);
				}
			}
			else {
				$(this).val('');
			}
		});
		$('[id*=numberofPersons]').numeric();
		$('[id*=numberofPersons]').keyup(function(){
			var id = parseInt($(this).attr('id').match(/\d+/).shift());
			CalendarController.calcPrice(id);
		});
		$('[id*=garage], [id*=ucs], [id*=extrabed]').bind('check', function(){
			$(this).val(1);
			var id = parseInt($(this).attr('id').match(/\d+/).shift());
			CalendarController.calcPrice(id);
		});
		$('[id*=garage], [id*=ucs], [id*=extrabed]').bind('uncheck', function(){
			$(this).val(0);
			var id = parseInt($(this).attr('id').match(/\d+/).shift());
			CalendarController.calcPrice(id);
		});
		$('[id*=submitResevation]').click(function(){
			var id = parseInt($(this).attr('id').match(/\d+/).shift());
			CalendarController.sendDatas(id);
		});
	},
	setCalendar: function (id, reserved, pending) {
		var act = new Date();
		act.setFullYear(act.getFullYear(), (act.getMonth() + 1), act.getDate());
		var selection = new Date();
		act.setFullYear(act.getFullYear(), act.getMonth(), (act.getDate() - 2));
		$('#calendar' + id).DatePicker({
			flat: true,
			date: CalendarController.formatDate(selection, '-'),
			current: CalendarController.formatDate(act, '-'),
			calendars: 2,
			starts: 1,
			mode: 'range',
			extraHeight: 18,
			extraWidth: 18,
			onRender: function(date) {
				var now = new Date();
				return {
					disabled: (date.valueOf() < now.valueOf() - 86400000),
					pending: eval('(' + pending + ')'),
					reserved: eval('(' + reserved + ')')
				}
			},
			onChange: function(formated){
				CalendarController.calcPrice(id);
			},
			locale: appConf.calendarLabels
		});
		$('#calendar' + id).DatePickerClear();
	},

	formatDate: function(date, sep) {
		var day = date.getDate();
		if(date.getDate() < 10) day = '0' + date.getDate();
		var month = date.getMonth() + 1;
		if(month < 10) month = '0' + month;
		return date.getFullYear() + sep  + month + sep + day;
	},

	userFormatDate: function(date) {
		var ret = date.getFullYear() + '. ';
		ret += appConf.calendarLabels.months[date.getMonth()] + ' ' + date.getDate() + '. ';
		return ret;
	},

	setValidators: function() {
		var msg =  '<img src="' + appConf.siteUrl + 'img/form_x.png" alt="X" class="errorX"/>';
		var options = {
			rules: {
				'Customer[name]': 'required',
				'Customer[phone]': 'required',
				'Customer[email]': {
					required: true,
					email: true
				},
				'Reservation[numberofPersons]': "number"
			},
			messages: {
				'Customer[name]': msg,
				'Customer[phone]': msg,
				'Customer[email]': msg,
				'Reservation[numberofPersons]': msg
			}
		};
		this.validators["1"] = $('#reservationform1').validate(options);
		this.validators["2"] = $('#reservationform2').validate(options);
	},

	calcPrice: function(id) {
		var dates = $('#calendar' + id).DatePickerGetDate();
		if (!dates) {
			return false;
		}
		if (dates[0]==undefined){
			$.prompt(appConf.texts.calendar[20],{
				focus: 1
			}); //"Kérjük előbb válasszon időszakot a naptárból!"
			return false;
		}
		var nights = this.getNights(dates[0], dates[1]);
		var adults = parseInt($('#numberofPersons' + id).val());
		if (!adults) {
			return false;
		}
		var price = appConf.prices[id].nights[(adults-1)] * nights;
		price += appConf.prices[id].washing * nights;
		var leavingDate = new Date();
		leavingDate.setFullYear(dates[1].getFullYear(), dates[1].getMonth(), (dates[1].getDate() + 1));
		if ($('#garage' + id).val() == 1) {
			price += appConf.prices[id].garage * nights;
		}
		//Kalkulált ár: || Ft || (+ idegenforgalmi adó)
		var html = appConf.texts.calendar[11] + '<b>' + this.numberFormat(price) + ' ' + appConf.texts.calendar[12] + '</b> ' + appConf.texts.calendar[10];
		if (price) {
			$('#prices' + id).html(html);
		}
		return true;
	},

	getNights: function(from, to){
		from.setHours(0);
		from.setMinutes(0);
		from.setSeconds(0);
		to.setHours(23);
		to.setMinutes(59);
		to.setSeconds(59);
		var differenceMs = Math.abs(from.getTime() - to.getTime());
		return Math.round(differenceMs / (1000 * 60 * 60 * 24));
	},

	numberFormat: function(nStr) {
		nStr += '';
		var x = nStr.split('.');
		var x1 = x[0];
		var x2 = x.length > 1 ? '.' + x[1] : '';
		var rgx = /(\d+)(\d{3})/;
		while (rgx.test(x1)) {
			x1 = x1.replace(rgx, '$1' + ' ' + '$2');
		}
		return x1 + x2;
	},

	sendDatas: function(id) {
		$.prompt.close();
		var dates = $('#calendar' + id).DatePickerGetDate();
		var adults = parseInt($('#numberofPersons' + id).val());
		var maxpersons = parseInt(appConf.apartments[id]);
		if(this.validators[id].form()){
			if (!adults || adults > maxpersons || adults <= 0){
				if(id==1){
					$.prompt('<p>' + appConf.texts.calendar[7] + '</p>', {
						focus: 1
					}); //A kis apartmanban maximum három felnőtt és egy gyerek fér el.
				}
				else{
					$.prompt('<p>' + appConf.texts.calendar[8] + '</p>', {
						focus: 1
					}) //A nagy apartmanban maximum öt felnőtt és egy gyerek fér el.
				}
				return false;
			}
			else if (!dates) {
				$.prompt('<p>' + appConf.texts.calendar[13] + '</p>', {
					focus: 1
				}); //Kérjük jelölje ki a naptáron a foglalni kívánt éjszakákat!
				return false;
			}
			else {
				$.prompt('<p>' + appConf.texts.calendar[14] + '</p>', {
					buttons:{}
				}); //Adatok mentése folyamatban...
			var day = dates[0].getDay();
			var now = new Date();
			var fiveDays = 1000 * 60 * 60 * 24 * 5;
			var nights = this.getNights(dates[0], dates[1]);
			if (nights == 1 && (day == 5 || day == 6) && dates[0].valueOf() > now.valueOf() + fiveDays) {
				$.prompt.close();
				$.prompt('<p>' + appConf.texts.calendar[15] + '</p>' + //Pénteki vagy szombati napokon nem lehet egy éjszakára foglalni!
					'<p>' + appConf.texts.calendar[16] + '</p>', {
						focus: 1
					}); //Foglalását módosítottuk! Kérjük válasszon másik időpontot majd kattintson újra az \"Elküld\" gombra!
				return false;
			}
			$('#reservationform' + id).ajaxSubmit({
				url: 'reservation/new',
				dataType: 'json',
				data: {
					'Reservation[startDate]': CalendarController.formatDate(dates[0], '-'),
					'Reservation[endDate]': CalendarController.formatDate(dates[1], '-'),
					'Reservation[garage]': $('#garage' + id).val(),
					'Reservation[extrabed]': $('#extrabed' + id).val(),
					'Reservation[ucs]': $('#ucs' + id).val(),
					'Reservation[apartmentId]': id
				},
				success: function(data){
					$.prompt.close();
					if(data) {
						if(data.error){
							$.prompt(data.error, {
								focus: 1
							});
						} else if(data.id){
							$.prompt(appConf.texts.calendar[17], { //Sikeres foglalás!
								focus: 1,
								submit: function(){
									document.location = appConf.siteUrl + 'sikeres-foglalas-' + data.id;
								}
							});
						}
					} else {
						$.prompt(appConf.texts.calendar[18], {
							focus: 1
						}); //Foglalás mentése nem sikerült!
					}
				}
			});
		}
	} else {
		$.prompt('<p>' + appConf.texts.calendar[19] + '</p>', {
			focus: 1
		}); //Az űrlap adatai hibásak, kérjük, javítsa!
	}
	return true;
}
}
