/*
function var_dump(d, l)
{
	if (l == null) l = 1;
	var s = '';
	if (typeof(d) == "object") {
		s += typeof(d) + " {\n";
		for (var k in d) {
			try	{
				for (var i=0; i<l; i++) s += "\t";
				s += k+":\t" + var_dump(d[k],l+1);
			} catch (e) {
			}
		}
		for (var i=0; i<l-1; i++) s += "\t";
		s += "}\n"
	} else {
		s += "" + d + "\n";
	}
	return s;
}
*/

var apgetfio = 1;
var apgetphone = 1;
var apgetmail = 1;
var apgetcompany = 1;

var apfiofield = 'hbs_name';
var apphonecountrycodefield = 'hbs_phone_country_code';
var apphonecodefield = 'hbs_phone_code';
var apphonefield = 'hbs_phone';
var apmailfield = 'hbs_email';
var apcompanyfield = 'hbs_company';

if(typeof(window.apreadytofill) != 'undefined') {
	window.apfillform();
} else {
	window.apreadytofill = true;
}


// Плагин HBS-заявки

// Т.к. заявка может открываться несколько раз, а в jQuery при навешивании события функция-обработчик добавляется а не замещает уже существующую, необходимо везде сначала снимать старый обработчик, а потом уже навешивать новый, чтоб обработчик события не выполнялся сразу по несколько раз

(function($) {
	$.fn.HBSOrder = function(options) {

		$.fn.HBSOrder.options = $.extend({}, $.fn.HBSOrder.options, options);
		var opts = $.fn.HBSOrder.options;

		return this.each(function() {
			// Пока заявка полностью не прогрузилась, запрещаем делать AJAX-запросы
			$.fn.HBSOrder.ready = false;

			// Объект заявки
			$order = $(this);

			// Вешаем обработчик нажатия кнопки "Закрыть заявку"
			$order.find("#close_btn").unbind("click").click(function() {
				$order.togglePopup();
				return false;
			});

			// Заполняем названия гостиницы и номера
			$order.find("span#hotel_name").html(opts.hotelName);
			$order.find("span#room_name").html(opts.roomName);
			
			/**
			* Активируем календарики
			*/

			// первый
			var $datepicker1 = $order.find("input[name=datein]");
			// второй
			var $datepicker2 = $order.find("input[name=dateout]");

			var tmp;

			// Даты, в которые доступно онлайн-бронирование (будут подсвечиваться залененьким)
			var datesOnline = [];
			for (var i in opts.datesOnline) {
				tmp = opts.datesOnline[i].split('-');
				datesOnline.push(new Date(tmp[0], tmp[1]-1, tmp[2]));
			}

			// Даты, в которые номер не доступен для бронирования (стоп-сейл)
			var datesStop = [];
			for (var i in opts.datesStop) {
				tmp = opts.datesStop[i].split('-');
				datesStop.push(new Date(tmp[0], tmp[1]-1, tmp[2]));
			}

			// Активируем первый календарик
			$datepicker1.datepicker({
				dateFormat: 'dd.mm.yy',
//				minDate: +1,
				minDate: 0,
				onlineDates: datesOnline,
				stopDates: datesStop
			}).unbind("change").change(function() {
				// При изменении даты, меняем минимальную дату второму календарику
				var date = new Date($(this).datepicker('getDate'));
				var nextDay = new Date(date.getTime());
				nextDay.setDate(date.getDate() + 1);
				$datepicker2.datepicker('option', 'minDate', nextDay);
				// Обновляем текст о длине периода
				$order.refreshPeriodLength();
				// Запрашиваем цены за новый период
				$order.requestPrice();
			});

			// Активируем второй календарик
			$datepicker2.datepicker({
				dateFormat: 'dd.mm.yy',
				onlineDates: datesOnline,
				stopDates: datesStop
			}).unbind("change").change(function() {
				// Обновляем текст о длине периода
				$order.refreshPeriodLength();
				// Запрашиваем цены за новый период
				$order.requestPrice();
			});

			// Вызываем для выполнения кода обработчика изменения первого календарика
			$datepicker1.change();

			// По клику на картинку с календарем, устанавливаем фокус в текст-инпут
			$order.find("#datein_btn").unbind("click").click(function() {
				$datepicker1.focus();
			});
			$order.find("#dateout_btn").unbind("click").click(function() {
				$datepicker2.focus();
			});

			// Для всех селектов "Номер №... Размещение:" устанавливаем обработчик на изменение
			$order.find("#rooms_capacity")
				.find("select")
				.each(function() {
					this.value = opts.roomCapacity;
				}).unbind("change").change(function() {
					// по имени селекта определяем к какому номеру по счету он относится (1-8)
					var room_num = /^room\[(\d)\]/.exec($(this).attr("name"))[1];
					// Записываем измененное значение в переменную
					$.fn.HBSOrder.rooms[room_num] = this.value;
					// Обновляем список номеров
					$order.refreshRoomsList();
					// И цену
					$order.updatePrice();
					// Выравниваем по центру
					$order.alignCenter();
				}).change();
			
			$order.find("[name=order_room_count]").unbind("change").change(function() {
				for (var i = 1; i <= 8; i++) {
					$order.find("#room_"+i).css("display", i <= this.value ? "" : "none");
					$order.find("#room_persons_"+i).css("display", i <= this.value ? "" : "none");
				}
				$order.updatePrice();
				$order.alignCenter();
			}).val(opts.roomsCount).change();

			$order.find("#bf_box").unbind("click").click(function() {
				$order.updatePrice();
			});

			// Меняем все текстовые поля "гражданство" на селекты со списком стран
			$order.find(".citizenship").each(function() {
				var $elSelect = $("<select></select>");
				$elSelect
					.attr('name', $(this).attr('name'))
					.css('width', '100%')
					.fillSelect2(opts.countries);

				$(this).replaceWith($elSelect);
			});

			$order.find("select[name=pay_type]").unbind("change").change(function() {
				if (this.value == 4 || this.value == 5) {
					$order.find("tr#pay_city_row").css("display", "");
				} else {
					$order.find("tr#pay_city_row").css("display", "none");
				}
			}).change();

			$order.find("#booking_info").css("display", "none");
			$order.find("#link_booking_info").unbind("click").click(function() {
				$order.find("#booking_info").slideToggle("slow");
			});

			$order.find("#rules_link").unbind("click").click(function() {
				$order.find("#booking_rules").fadeIn();
				 $("var").each(function() {
					 $(this).empty().prepend($("<img>").attr("src", $(this).attr("title")));
				 });
				return false;
			});

			$order.find("#rules_ok_btn").unbind("click").click(function() {
				$order.find("#booking_rules").hide();
				return false;
			});
			
			$order.find("input[name=room_id]").val(opts.roomId);			

			var $form = $order.find("form");

			$form.find("#hbs_email").change(function() {
				var val = $(this).val();
				val = val.replace( /^\s+/g, '').replace( /\s+$/g, '');
				if (val != $(this).val())
				{
					$(this).val(val);
				}

			});

			var attemptsNumber = 0; // Количество попыток отправить заявку

			$("#submit_btn").unbind("click").click(function() {

				if ($.fn.HBSOrder.options.eventUrl) {
					/*
					$.post($.fn.HBSOrder.options.eventUrl, {
						type: 'click',
						order_hash: $.fn.HBSOrder.orderHash,
						data: $.fn.HBSOrder.options.eventData
					});
					*/
				}

				// Если используется гугл аналитика
				if (typeof(_gaq) != 'undefined') {
					// Сообщаем что заявку пытались отправить
					_gaq.push(['_trackPageview', '/HBS_send_click']);
				}

				if ($("input[name=c_name]").val().replace(/^\s+|\s+$/g, '') != '') {
					var $guest_input = $("input[name=guests\\[1\\]\\[1\\]\\[name\\]]");
					if ($guest_input.val().replace(/^\s+|\s+$/g, '') == '') {
						if (confirm('Вы не указали ни одного проживающего.\nИспользовать в качестве проживающего указанные Ф.И.О. контактного лица?')) {
							$guest_input.focus().val($("input[name=c_name]").val());
						}
					}
				}
			});
			
			$form.validate({
				rules: {
					datein: "required",
					dateout: "required",
					c_name: "required",
					c_phone: {
						required: {
							depends: function(element) {
								return ($("input[name=c_email]").val() == "");
							}
						}
					},
					c_email: {
						email: true,
						required: {
							depends: function(element) {
								return ($("input[name=c_phone]").val() == "");
							}
						}
					},
					"guest[1][fio]": {
						required: {
							depends: function(element) {
								return $(element).is(":visible");
							}
						}
					},
					"guest[9][fio]": {
						required: {
							depends: function(element) {
								return $(element).is(":visible");
							}
						}
					}
				},
				errorPlacement: function(error, element) {
					// no errors displaying
				},
				messages: {
					datein: "Дата заезда",
					dateout: "Дата выезда",
					c_name: "Контактное лицо",
					c_phone: "",
					c_email: "Телефон или контактный e-mail",
					"guest[1][fio]": "Ф.И.О. хотя бы одного проживающего",
					"guest[9][fio]": "Ф.И.О. хотя бы одного проживающего"
				},
				invalidHandler: function(form, validator) {
					attemptsNumber++;

					var error_str = '';
					var errors = validator.numberOfInvalids();
					if (errors) {
						$("#div_fill ul").empty();
						for (var i in validator.invalid) {
							if (validator.invalid[i] != "") {
								$("#div_fill ul").append("<li><b>"+validator.invalid[i]+"</b></li>");
								error_str += ' * '+validator.invalid[i] + '\n';
							}
						}
						$("#js_errors").show();
					} else {
						$("#js_errors").hide();
					}

					if ($.fn.HBSOrder.options.eventUrl) {
						$.post($.fn.HBSOrder.options.eventUrl, {
							type: 'invalid',
							order_hash: $.fn.HBSOrder.orderHash,
							data: $.fn.HBSOrder.options.eventData,
							comment: error_str
						});
					}

					// Если используется гугл аналитика
					if (typeof(_gaq) != 'undefined') {
						// Сообщаем что произошла ошибка валидации
						_gaq.push(['_trackPageview', '/HBS_valid_error']);
					}

					if (attemptsNumber > 1) {
						alert('Заполните необходимые поля, отмеченные красным:\n\n'+error_str);
					}
				},

				submitHandler: function(form) {
				
					$(window).disableCloseConfirm();

					if ($.fn.HBSOrder.options.eventUrl) {
						$.post($.fn.HBSOrder.options.eventUrl, {
							type: 'send',
							order_hash: $.fn.HBSOrder.orderHash,
							data: $.fn.HBSOrder.options.eventData
						});
					}
					
					$.ajax({
					url: '/capcha/check.php',
					beforeSend: '',
					type: 'POST',
					datatype: 'html',
					data:"code="+$('.capcha_field').val(),
					success: function(response){
							if(response != 1){
								alert('Заполните необходимые поля, отмеченные красным:\n\n * Неверно введен код с картинки');
								return false;						
							}else{
								form.submit();
								$(form).find("#submit_btn")
									.attr("disabled", "disabled")
									.val("Отправка...");
								}								
						}
					}); 

				},

				errorClass: 'input-error'
			});

			if ($.fn.HBSOrder.options.handlerUrl) {
				$form.attr("action", $.fn.HBSOrder.options.handlerUrl);
			}

			$.fn.HBSOrder.orderHash = Math.floor(Math.random() * (99999999)) + 1;
			$order.find("input[name=order_hash]").val($.fn.HBSOrder.orderHash);

			$.fn.HBSOrder.ready = true;

			$order.requestPrice();

			$order.togglePopup();
		});
	};

	$.fn.HBSOrder.ready = false;

	$.fn.HBSOrder.orderHash = 0;

	$.fn.HBSOrder.price = {
		sgl: 0,
		dbl: 0,
		bf: 0,
		exb: 0,
		currency: 'руб.'
	};

	$.fn.HBSOrder.rooms = {
		1: 0,
		2: 0,
		3: 0,
		4: 0,
		5: 0,
		6: 0,
		7: 0,
		8: 0
	};

	$.fn.HBSOrder.options = {
		handlerUrl: '',
		roomId: 0,
		roomName: 'Номер без названия',
		hotelId: 0,
		hotelName: 'Без названия',
		roomsCount: 1,
		roomCapacity: 1,
		countries: {0: 'No countries'},
		datesOnline: [],
		datesStop: [],
		calculatorUrl: '',
		eventUrl: '',
		eventData: ''
	};

	/* Очищаем select */
	$.fn.clearSelect = function() {
		return this.each(function(){
			/* Проверяем является ли элемент select`ом */
			if(this.tagName=='SELECT') {
				this.options.length = 0;
				/* Блокируем на время заполнения */
				$(this).attr('disabled','disabled');
			}
		});
	}

	/* Заполняем select переданными данными */
	$.fn.fillSelect2 = function(dataArray) {
		return this.clearSelect().each(function(){
			/* Проверяем является ли элемент select`ом */
			if(this.tagName=='SELECT') {
				var currentSelect = this;
				$.each(dataArray,function(index,data){
					/* Создаем новый option */
//					var option = new Option(data, index);
					var option = new Option(data, data); // костыль для того чтобы у селекта со странами значениями были названия стран
					/* Добавляем новый option к select`у */
					if($.support.cssFloat) {
						currentSelect.add(option,null);
					} else {
						currentSelect.add(option);
					}
				});
				$(this).removeAttr('disabled');
			}
		});
	}


	//align element in the middle of the screen
	$.fn.alignCenter = function() {
		if (!$.fn.HBSOrder.ready) return;

		if($.browser.msie) { // гребаный ИЕ6
			return $(this).css({'position': 'absolute', 'top': '100px', 'left': '100px'});
		} else {
			//get margin left
			var marginLeft = - $(this).width()/2 + 'px';
			//get margin top
			var marginTop = - $(this).height()/2 + 'px';
			//return updated element
			return $(this).css({'margin-left': marginLeft, 'margin-top': marginTop});
		}
	};


	$.fn.togglePopup = function() {
		var $order = $(this);

		// Если такого элемента ещё не существует
		if ($('#__hbsorder_background').size() == 0) {
			// Надо создать
			var $bg = $('<div id="__hbsorder_background" class="hidden"></div>');
			$bg
//				.click(function(){$order.togglePopup();}) // убрать заявку при клике на темном фоне
				.prependTo("body");

			// Переносим заявку почти в самое начало документа
			$bg.after($order);
		}

		//detect whether popup is visible or not
		if($order.hasClass('hidden')) {
			//hidden - then display
			//when IE - fade immediately
			if($.browser.msie) {
//				$('#__hbsorder_background').height($(document).height()).removeClass('hidden'); // в ИЕ полностью непрозрачная получается(((
			} else {
				//in all the rest browsers - fade slowly
				$('#__hbsorder_background').height($(document).height()).removeClass('hidden').fadeTo('slow', 0.7);
			}

			$(this)
				.alignCenter()
				.removeClass('hidden');

			$(window).enableCloseConfirm();

			if ($.fn.HBSOrder.options.eventUrl) {
				$.post($.fn.HBSOrder.options.eventUrl, {
					type: 'open',
					order_hash: $.fn.HBSOrder.orderHash,
					data: $.fn.HBSOrder.options.eventData
				});
			}

			// Если используется гугл аналитика
			if (typeof(_gaq) != 'undefined') {
				// Сообщаем что заявка открыта
				_gaq.push(['_trackPageview', '/HBS_opened']);
			}




		} else {
			//visible - then hide
			$order.addClass('hidden');
			$('#__hbsorder_background').addClass('hidden').removeAttr('style');

			$(window).disableCloseConfirm();

			if ($.fn.HBSOrder.options.eventUrl) {
				$.post($.fn.HBSOrder.options.eventUrl, {
					type: 'close',
					order_hash: $.fn.HBSOrder.orderHash,
					data: $.fn.HBSOrder.options.eventData
				});
			}

			// Если используется гугл аналитика
			if (typeof(_gaq) != 'undefined') {
				// Сообщаем что заявка закрыта
				_gaq.push(['_trackPageview', '/HBS_closed']);
			}
		}
	};

	$.fn.refreshPeriodLength = function() {
		var $order = $(this);

		var date_from = new Date($order.find("input[name=datein]").datepicker('getDate'));
		var date_to = new Date($order.find("input[name=dateout]").datepicker('getDate'));

		var length = Math.round((date_to.getTime() - date_from.getTime()) / 86400000);

		function plural(n, form1, form2, form5)
		{
			var p = (n % 10 == 1 && n % 100 != 11 ? 0 : (n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2));
			switch(p) {
				case 0:
				default:
					return form1;
				case 1:
					return form2;
				case 2:
					return form5;
			}		
		}

		if (typeof(lang)!='undefined' && lang == 'eng') {
			$order.find("#period_length").html(length+' '+(length>1?'nights':'night'));
		} else {
			$order.find("#period_length").html(length+' '+plural(length, 'сутки', 'суток', 'суток'));
		}
	}

	$.fn.refreshRoomsList = function() {
		var $room_div;
		for (var i in $.fn.HBSOrder.rooms) {
			$room_div = $order.find("#room_persons_"+i);
			if ($.fn.HBSOrder.rooms[i] == 1) {
				$room_div.find(".person-1").css("display", "");
				$room_div.find(".person-2").css("display", "none");
				$room_div.find(".person-3").css("display", "none");

				$room_div.find(".img-person-1").css("display", "");
				$room_div.find(".img-person-2").css("display", "none");
				$room_div.find(".img-person-3").css("display", "none");
			} else if ($.fn.HBSOrder.rooms[i] == 2) {
				$room_div.find(".person-1").css("display", "");
				$room_div.find(".person-2").css("display", "");
				$room_div.find(".person-3").css("display", "none");

				$room_div.find(".img-person-1").css("display", "");
				$room_div.find(".img-person-2").css("display", "");
				$room_div.find(".img-person-3").css("display", "none");
			} else if ($.fn.HBSOrder.rooms[i] == 3) {
				$room_div.find(".person-1").css("display", "");
				$room_div.find(".person-2").css("display", "");
				$room_div.find(".person-3").css("display", "");

				$room_div.find(".img-person-1").css("display", "");
				$room_div.find(".img-person-2").css("display", "");
				$room_div.find(".img-person-3").css("display", "");
			}
		}
	}

	$.fn.requestPrice = function() {
		if (!$.fn.HBSOrder.ready) return;

		var $order = $(this);
		
		var url = $.fn.HBSOrder.options.calculatorUrl;

		var data = {
			room_id: $.fn.HBSOrder.options.roomId,
			date_from: $order.find('input[name=datein]').val(),
			date_to: $order.find('input[name=dateout]').val()
		};

		$.getJSON(url, data, function(result, status) {
			$.fn.HBSOrder.price = result;
			$order.updatePrice();
		});
	}

	$.fn.updatePrice = function() {
		if (!$.fn.HBSOrder.ready) return;

		var $order = $(this);

		var $bfBox = $order.find("#bf_box")
		if ($.fn.HBSOrder.price.bf == -1) { // если завтрак включен
			$bfBox.attr("disabled", "disabled");
			$bfBox.attr("checked", "checked");
		} else if ($.fn.HBSOrder.price.bf > 0) { // если завтрак стоит денег
			$bfBox.removeAttr("disabled");
		} else { // если х.з. что
			$bfBox.attr("disabled", "disabled");
			$bfBox.removeAttr("checked");
		}

		var rooms_count = $order.find('select[name=order_room_count]').val();
		var total_price = 0;
		for (var i = 1; i <= rooms_count; i++) {
			if ($.fn.HBSOrder.rooms[i] == 1) {
				if ($.fn.HBSOrder.price.sgl < 0) {
					total_price = -2;
					break;
				}
				total_price += $.fn.HBSOrder.price.sgl;
				if ($bfBox.is(":checked") && $.fn.HBSOrder.price.bf > 0) {
					total_price += $.fn.HBSOrder.price.bf;
				}
			} else if ($.fn.HBSOrder.rooms[i] == 2) {
				if ($.fn.HBSOrder.price.dbl < 0) {
					total_price = -2;
					break;
				}
				total_price += $.fn.HBSOrder.price.dbl;
				if ($bfBox.is(":checked") && $.fn.HBSOrder.price.bf > 0) {
					total_price += $.fn.HBSOrder.price.bf * 2;
				}
			} else if ($.fn.HBSOrder.rooms[i] == 3) {
				if ($.fn.HBSOrder.price.dbl < 0) {
					total_price = -2;
					break;
				}
				total_price += $.fn.HBSOrder.price.dbl;
				if ($.fn.HBSOrder.price.exb > 0) {
					total_price += $.fn.HBSOrder.price.exb;
				}
				if ($bfBox.is(":checked") && $.fn.HBSOrder.price.bf > 0) {
					total_price += $.fn.HBSOrder.price.bf * 3;
				}
			}
		}
		var price_str;
		if (total_price >= 0) {
			price_str = total_price + ' ' + $.fn.HBSOrder.price.currency;
		} else {
			price_str = 'по запросу';
		}
		$order.find('#total_price').html(price_str);
	}


	/* jQuery events не заработали в хроме, поэтому всё на обычном js */

	$.fn.HBSOrder.closeConfirm = function(e) {
		var msg = "Если Вы покинете страницу сейчас, заявка не будет отправлена.";
		(e || window.event).returnValue = msg;
		return msg;
	}


	$.fn.enableCloseConfirm = function() {
		if (window.addEventListener) {
			window.addEventListener('beforeunload', $.fn.HBSOrder.closeConfirm, true);   
		} else if (window.attachEvent) {
			var r = window.attachEvent("onbeforeunload", $.fn.HBSOrder.closeConfirm);   
		}

		$(window).unbind("unload").unload(function() {
			if ($.fn.HBSOrder.options.eventUrl) {
				$.post($.fn.HBSOrder.options.eventUrl, {
					type: 'away',
					order_hash: $.fn.HBSOrder.orderHash,
					data: $.fn.HBSOrder.options.eventData
				});
			}
		});
	};

	$.fn.disableCloseConfirm = function() {
		if (window.removeEventListener) {
			window.removeEventListener('beforeunload', $.fn.HBSOrder.closeConfirm, true);
		} else if (window.detachEvent) {
			window.detachEvent("onbeforeunload", $.fn.HBSOrder.closeConfirm);
		}

		$(window).unbind("unload");
	};

	// дополнение Onik
	$(".update_img").live('click',function(){
		function getrandom(min_random, max_random) {
			var range = max_random - min_random + 1;
			return Math.floor(Math.random()*range) + min_random;
		}
		var rand = getrandom(1,9999);
		$(".update_img_current").attr("src","/captcha.php?="+rand);
	});
	
})(jQuery);

