var CDate = {};
(function (date) {
	CDate = {
		   w: date.getDay(),
		   d: date.getDate(),
		   m: date.getMonth(),
		   y: date.getFullYear(),
		date: date
	};
 })(new Date);

var Reservation = {
	stepEnable: function (step) {
		var div = $('step' + step);
		if (!div) return false;
		var was_disabled = Element.hasClassName(div, 'hidden');
		if (step == 2) this.setupCalendar();
		if (step == 4) this.stepEnable(5);
		if (step == 5) this.stepEnable(6);
		if (step == 6) this.stepEnable(7);
		Element.removeClassName(div, 'hidden');
		if (was_disabled) {
			new Effect.Pulsate(div, {duration: 1, from: 0.5});
		}
	},
	stepDisable: function (step) {
		var div = $('step' + step);
		if (!div) return false;
		if (Element.hasClassName(div, 'hidden')) return false;
		Element.addClassName(div, 'hidden');
		this.stepDisable(step + 1);
	},

	exclusivity: function (to_show) {
		var solo = $('p_solo');
		if (!solo) return false;
		var ifld = $('f_solo');
		if (to_show) {
			var was_disabled = Element.hasClassName(solo, 'hidden');
			Element.removeClassName(solo, 'hidden');
			if (was_disabled) {
				new Effect.Pulsate(solo, {duration: 1, from: 0.5});
			}
		} else {
			ifld.checked = false;
			Element.addClassName(solo, 'hidden');
		}
		this.updateSolo(ifld);
	},

	dateStatus: function (date, y, m, d) {
		var diff = date - CDate.date;
		if (diff < 172800000 || diff > 5356800000) return true;

		if (ReservationDisabled && ReservationDisabled[m]) {
	        for (var i in ReservationDisabled[m])
	        	if (ReservationDisabled[m][i] == d)
	        		return true;
		}

		return false;
	},

	setupCalendar: function () {
		Calendar.setup({
			inputField:  'f_date',
			ifFormat:    '%u, %e, %m, %Y',
			displayArea: 'f_date_show',
			daFormat:    '%A, %B %e, %Y',
			button:      'f_date_trigger',
			firstDay:    1,
			weekNumbers: false,
			range:       [CDate.y, CDate.y],
			dateStatusFunc: Reservation.dateStatus,
			onClose:     function(calendar) {
				calendar.hide();
				var fd = $F('f_date');
				var ifld = $('f_date_show');
				var ofld = $('i_date');
				if (fd == '') {
					Reservation.stepDisable(3);
					ofld.innerHTML = '';
				} else {
					Reservation.stepEnable(3);
					ofld.innerHTML = ifld.innerHTML;
				}
				Reservation.updatePersonFee();
			}
		});
	},

	updatePersons: function (el) {
		var ifld  = $('f_persons');
		var ofld1 = $('i_persons');
		if ($F(el) == 0) {
			this.stepDisable(2);
			this.exclusivity(false);
		} else {
			this.stepEnable(2);
			this.exclusivity(
				(el.selectedIndex < el.options.length - 1) ? true : false
			);
		}
		ofld1.innerHTML = ifld.value;
		this.updatePersonFee();
	},

	updateSolo: function (el) {
		var ifld = $('f_solo');
		var ofld = $('i_solo');
		var li_solo = $('l_solo');
		if (ifld.checked) {
			Element.removeClassName(li_solo, 'hidden');
			ofld.innerHTML = ifld.value;
		} else {
			Element.addClassName(li_solo, 'hidden');
			ofld.innerHTML = 0;
		}
		this.updateTotalCharge();
	},

	updateHour: function (el) {
		var ifld = $('f_hour');
		var ofld = $('i_hour');
		if ($F(el) == '') {
			this.stepDisable(4);
			ofld.innerHTML = '';
		} else {
			this.stepEnable(4);
			ofld.innerHTML = ifld.options[ifld.selectedIndex].innerHTML;
		}
	},

	updatePersonFee: function () {
		var ofet = $('i_fee');
		var perfee = 0;
		var pkg = $('f_persons').selectedIndex;
		var fd = $F('f_date');
		if (fd != '') {
			var dow = fd.replace(/,.*$/, '') - 1;
			if (pkg > 0)
				perfee = ReservationPrices[dow][pkg-1];
		}
		ofet.innerHTML = perfee;
		this.updateTotalCharge();
	},

	updateTotalCharge: function () {
		var tc = parseFloat($('i_solo').innerHTML) + parseFloat($('i_fee').innerHTML);
		if (ReservationDiscount > 0) {
			$('i_total_old').innerHTML = '$' + tc;
		}
		$('i_total').innerHTML = '$' + this.roundPrice(tc * (100 - ReservationDiscount)/100);
	},

	roundPrice: function (num) {
		var pint = Math.floor(num);
		var res = Math.floor((num - pint) * 100) / 100;
		return pint + res;
	},

	updateContact: function (el) {
		var row = Element.findParent(el, 'div', 'row');
		if (!row) return false;
		if (RegExp("^[a-zA-Z0-9-_.]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,4}$").test($F(el))) {
			Element.removeClassName(row, 'row-error');
			// this.stepEnable(6);
			return true;
		} else {
			Element.addClassName(row, 'row-error');
			// this.stepDisable(6);
			return false;
		}
	},

	sendRequest: function (form) {
		var ret = this.updateContact($('f_email'));
		if (!ret) {
			return false;
		}
		var info = $('info_review').innerHTML.toString().replace(/<[^>]+>/g,'');
		info += "\nName:  " + $F('f_name');
		info += "\nEmail: " + $F('f_email');
		info += "\nPhone: " + $F('f_phone');
		info += "\nHotel: " + $F('f_hotel');
		$('f_computed_request').value = info;
		return NeoForm.submit(form, Reservation.thankYou);
	},

	thankYou: function (req, json) {
		window.location = '/reservations/thank-you.shtml';
		return true;
		Element.addClassName($('reservations'), 'hidden');
		Element.removeClassName($('tnx'), 'hidden');
	}
};
