var ABCPro = ABCPro || {};
ABCPro.Front = {
	getAbsX: function (elt) { 
		return (elt.x) ? elt.x : this.getAbsPos(elt,"Left"); 
	},
	getAbsY: function (elt) { 
		return (elt.y) ? elt.y : this.getAbsPos(elt,"Top"); 
	},
	getAbsPos: function (elt, which) {
		var iPos = 0;
		while (elt != null) {
			iPos += elt["offset" + which];
			elt = elt.offsetParent;
		}
		return iPos;
	},
	uclick: function (evnt, calObj, el) {
		var o_id = null;
		if (typeof el == 'object') {
			o_id = parseInt(el.getAttributeNode('axis').value);
		}
			
		if (calObj.first == 1) {
			var tdays = 0;
			switch (calObj.price_based_on) {
				case 'days':
					tdays = Math.abs(eval(o_id - calObj.s_id)) / (60 * 60 * 24) + 1;
					break;
				case 'nights':
					tdays = Math.abs(eval(o_id - calObj.s_id)) / (60 * 60 * 24);
					var thestyle = window.document.getElementById("d" + calObj.calendar_id + "_" + calObj.cur_id);
					calObj.sum = parseFloat(calObj.sum) - parseFloat(thestyle.abbr);
					break;
			}		
			if (tdays < calObj.min_bl) {
				window.document.getElementById(calObj.container_messages).innerHTML = calObj.message_1;
			} else {
				if (calObj.s_id > calObj.cur_id) {
					var sdate = new Date(calObj.cur_id * 1000);
					var edate = new Date(calObj.s_id * 1000);
				} else {
					var sdate = new Date(calObj.s_id * 1000);
					var edate = new Date(calObj.cur_id * 1000);
				}
				if (calObj.s_id != calObj.cur_id) {
					calObj.half_day=0;
				}
				var params = '&view=' + calObj.view + '&half_day=' + calObj.half_day + '&start_date=' + calObj.s_id + '&end_date=' + calObj.cur_id + '&sMonth=' + calObj.s_month + '&sYear=' + calObj.s_year + '&cid=' + calObj.calendar_id;
				ABCPro.Front.triggerLoading(calObj, 'message_2');
				ABCPro.Ajax.sendRequest(calObj.booking_form_url + params, function (req) {
					if (window.document.getElementById(calObj.container_availability)) {
						window.document.getElementById(calObj.container_availability).innerHTML = req.responseText;
						
						if (window.document.forms[calObj.booking_form_name]) {
							ABCPro.Front.bindBookingForm(calObj);
							
						}
					}
				});			
	        }
			calObj.first = 0;
			calObj.res_ids = [];
		} else {
			if (calObj.s_id > 0) {
				if (calObj.s_id > calObj.cur_id) {
					var tmp_id = calObj.s_id;
					calObj.s_id = calObj.cur_id;
					calObj.cur_id = tmp_id;
				}
				ABCPro.Front.updatePaint(evnt, -1, calObj);
	        }
			calObj.first = 1;
			calObj.s_id = o_id;
			calObj.cur_id = o_id;
			window.document.getElementById(calObj.container_dates).innerHTML = '';       
			ABCPro.Front.updatePaint(evnt, o_id, calObj);
		}
	},
	_color: function (calObj, i) {
		try {
			var thestyle= window.document.getElementById('d' + calObj.calendar_id + "_" + i);
			thestyle.style.backgroundImage = "";
			thestyle.style.backgroundPosition = "center";
			thestyle.style.backgroundColor = "";
			switch (parseInt(thestyle.scope, 10)) {
			case 2:
				thestyle.style.backgroundImage = "url(" + calObj.image_url + "?color1=" + calObj.booked_days_bg_color + "&color2=" + calObj.available_days_bg_color + ")";
				break;
			case 4:
				thestyle.style.backgroundImage = "url(" + calObj.image_url + "?color1=" + calObj.pending_reservations_color + "&color2=" + calObj.available_days_bg_color + ")";
				break; 
			case 3:
				thestyle.style.backgroundImage = "url(" + calObj.image_url + "?color1=" + calObj.available_days_bg_color + "&color2=" + calObj.booked_days_bg_color + ")";
				break;
			case 5:
				thestyle.style.backgroundImage = "url(" + calObj.image_url + "?color1=" + calObj.available_days_bg_color + "&color2=" + calObj.pending_reservations_color + ")";
				break;
			case 1:
				thestyle.style.backgroundColor = "#" + calObj.available_days_bg_color;
				break;
			}
		} catch (error) {
	
		}
	},
	updateRes: function (calObj) {
		var cal_id_len = 0, temp_cal_id = calObj.calendar_id;
		while (temp_cal_id >= 1) {
			cal_id_len++;
			temp_cal_id = temp_cal_id / 10;
		}
	
		var all_date = window.document.getElementsByTagName("td");
		if (all_date) {
			for (var i = 0, len = all_date.length; i < len; i++) {
				if (all_date[i].scope == -1 || all_date[i].scope == -2) {
					calObj.res_ids.push(all_date[i].id.substr(parseInt(1) + parseInt(cal_id_len)));
				}
			}
		}
	},
	updatePaint: function (evnt, o_id, calObj, el) {
		if (o_id == null && typeof el == 'object') {
			o_id = parseInt(el.getAttributeNode('axis').value);
		}
		
		if (calObj.first == 1) {
			calObj.half_day = 0;
			calObj.sum = 0;
			calObj.last = 0;
			for (var i = 0; i < calObj.res_ids.length; i++) {
				if ((calObj.s_id < calObj.res_ids[i] && calObj.res_ids[i] < o_id) || (calObj.s_id > calObj.res_ids[i] && calObj.res_ids[i] > o_id)) {
					return;
				}
			}
	        switch (calObj.price_based_on) {
	        case 'days':
	        	var tdays = Math.abs(eval(o_id - calObj.s_id)) / (60 * 60 * 24) + 1;
	        	break;
	        case 'nights':
	        	var tdays = Math.abs(eval(o_id - calObj.s_id)) / (60 * 60 * 24);
	        	break;
	        }
	
			window.document.getElementById(calObj.container_messages).innerHTML = '';
			if (tdays > calObj.max_bl) {
				window.document.getElementById(calObj.container_messages).innerHTML = calObj.message_3;
				return;
			}       

			if (o_id > calObj.s_id) {

				for (i = calObj.s_id; i <= o_id; i = i + (60 * 60 * 24)) {
					try {
						if (calObj.last) {
							calObj.cur_id = i - (60 * 60 * 24);
							return;
						}
						var thestyle= window.document.getElementById('d' + calObj.calendar_id + "_" + i);
						thestyle.style.backgroundImage = "";
						thestyle.style.backgroundPosition = "center";
						thestyle.style.backgroundColor = "";
						if (thestyle.scope == 2 || thestyle.scope == 4) {
							if (i == calObj.s_id) {
								if (thestyle.scope == 2) {
									thestyle.style.backgroundImage = "url(" + calObj.image_url + "?color1=" + calObj.booked_days_bg_color + "&color2=" + calObj.select_color + ")";
								} else if (thestyle.scope == 4) {
									thestyle.style.backgroundImage = "url(" + calObj.image_url + "?color1=" + calObj.pending_reservations_color + "&color2=" + calObj.select_color + ")";
								}
							} else {
								if (thestyle.scope == 2) {
									thestyle.style.backgroundImage = "url(" + calObj.image_url + "?color1=" + calObj.booked_days_bg_color + "&color2=" + calObj.available_days_bg_color + ")";
								} else if (thestyle.scope == 4) {
									thestyle.style.backgroundImage = "url(" + calObj.image_url + "?color1=" + calObj.pending_reservations_color + "&color2=" + calObj.available_days_bg_color + ")";
								}
								calObj.cur_id = i - (60 * 60 * 24);
								return;
							}
						} else if (thestyle.scope==3) {
							thestyle.style.backgroundImage="url("+calObj.image_url+"?color1="+calObj.select_color+"&color2="+calObj.booked_days_bg_color+")";
							calObj.last=1;
						} else if (thestyle.scope==5) {
							thestyle.style.backgroundImage="url("+calObj.image_url+"?color1="+calObj.select_color+"&color2="+calObj.pending_reservations_color+")";
							calObj.last=1;
						} else if (thestyle.scope==1) {
							switch (calObj.reserve_dates_as_half_booked) {
			              	case 'true':
								if (calObj.s_id == i) {
									thestyle.style.backgroundImage = "url("+calObj.image_url+"?color1="+calObj.available_days_bg_color+"&color2="+calObj.select_color+")";
								} else if (i == o_id) {
									thestyle.style.backgroundImage="url("+calObj.image_url+"?color1="+calObj.select_color+"&color2="+calObj.available_days_bg_color+")";
								} else {
									thestyle.style.backgroundColor="#"+calObj.select_color;
								}
			              		break;
			              	default:
			              		thestyle.style.backgroundColor = "#" + calObj.select_color;
			              	}
						} else {
							return;
						}
						calObj.sum = parseFloat(calObj.sum) + parseFloat(thestyle.abbr);
					} catch (error) {
	
					}
				}
			} else {
	
				for (var i = calObj.s_id; i >= o_id; i = i - (60 * 60 * 24)) {
					try {
						if (calObj.last) {
							calObj.cur_id = i + (60 * 60 * 24);
							return;
						}
						var thestyle= window.document.getElementById('d' + calObj.calendar_id + "_" + i);
						thestyle.style.backgroundImage="";
						thestyle.style.backgroundPosition="center";
						thestyle.style.backgroundColor="";
						if (thestyle.scope == 2) {
							thestyle.style.backgroundImage="url("+calObj.image_url+"?color1="+calObj.booked_days_bg_color+"&color2="+calObj.select_color+")";
							calObj.last = 1;
							if (i == calObj.s_id) {
								calObj.half_day=2;
							}
						} else if (thestyle.scope==4) {
							thestyle.style.backgroundImage="url("+calObj.image_url+"?color1="+calObj.pending_reservations_color+"&color2="+calObj.select_color+")";
							calObj.last=1;
							if (i == calObj.s_id) {
								calObj.half_day = 2;
							}
						} else if (thestyle.scope == 3 || thestyle.scope == 5) {
							if (i == calObj.s_id) {
								if (thestyle.scope==3) {
									thestyle.style.backgroundImage="url("+calObj.image_url+"?color1="+calObj.select_color+"&color2="+calObj.booked_days_bg_color+")";
									calObj.half_day=1;
								} else if (thestyle.scope==5) {
									thestyle.style.backgroundImage="url("+calObj.image_url+"?color1="+calObj.select_color+"&color2="+calObj.pending_reservations_color+")";
									calObj.half_day=1;
								}
							} else {
								if (thestyle.scope==3) {
									thestyle.style.backgroundImage="url("+calObj.image_url+"?color1="+calObj.available_days_bg_color+"&color2="+calObj.booked_days_bg_color+")";
								} else if (thestyle.scope==5) {
									thestyle.style.backgroundImage="url("+calObj.image_url+"?color1="+calObj.available_days_bg_color+"&color2="+calObj.pending_reservations_color+")";
								}
								calObj.cur_id=i+(60*60*24);
								return;
							}
						} else if (thestyle.scope==1) {
							switch (calObj.reserve_dates_as_half_booked) {
		              		case 'true':
								if (calObj.s_id==i) {
									if (calObj.s_id==o_id) {
										var e = (window.event) ? window.event : evnt;
										var half=thestyle.offsetWidth/2;
										var half_sum=parseInt(half)+parseInt(ABCPro.Front.getAbsX(thestyle));
										if (half_sum>e.clientX) {
											calObj.half_day=1;
											thestyle.style.backgroundImage="url("+calObj.image_url+"?color1="+calObj.select_color+"&color2="+calObj.available_days_bg_color+")";
										} else {
											calObj.half_day=2;
											thestyle.style.backgroundImage="url("+calObj.image_url+"?color1="+calObj.available_days_bg_color+"&color2="+calObj.select_color+")";
										}
									} else {
										thestyle.style.backgroundImage="url("+calObj.image_url+"?color1="+calObj.select_color+"&color2="+calObj.available_days_bg_color+")";
									}
								} else if (i==o_id) {
									thestyle.style.backgroundImage="url("+calObj.image_url+"?color1="+calObj.available_days_bg_color+"&color2="+calObj.select_color+")";
								} else {
									thestyle.style.backgroundColor="#"+calObj.select_color;
								}
			              		break;
			              	default:
			              		thestyle.style.backgroundColor="#"+calObj.select_color;
			              	}
						} else {
							return;
						}
						calObj.sum= parseFloat(calObj.sum) + parseFloat(thestyle.abbr);
					} catch (error) {
	
					}
				}
			}
	          
			if (calObj.cur_id > o_id && o_id >= calObj.s_id) {
				var i = o_id;
	
				for (i = i + (60 * 60 * 24); i <= calObj.cur_id; i = i + (60 * 60 * 24)) {
					ABCPro.Front._color(calObj, i);
				}
			} else if (calObj.cur_id < calObj.s_id && o_id >= calObj.s_id) {
				var i = calObj.cur_id;
	   
				for (i; i < calObj.s_id; i = i + (60 * 60 * 24)) {
					ABCPro.Front._color(calObj, i);
				}
			} else if (calObj.cur_id < o_id && o_id <= calObj.s_id) {
				var i = calObj.cur_id;
	
				for (i; i < o_id; i = i + (60 * 60 * 24)) {
					ABCPro.Front._color(calObj, i);
				}
			} else if (calObj.cur_id > calObj.s_id && o_id <= calObj.s_id) {
				var i = calObj.s_id;
	
				for (i = i + (60 * 60 * 24); i <= calObj.cur_id; i = i + (60 * 60 * 24)) {
					ABCPro.Front._color(calObj, i);
				} 
			}
			calObj.cur_id = o_id;
		}
	      
		if (o_id == -1) {
			var i = calObj.s_id;
	            
			for (i; i <= calObj.cur_id; i = i + (60 * 60 * 24)) {
				ABCPro.Front._color(calObj, i);
			}
		}
	},
	errorHandler: function (calObj, message) {
		var err = ABCPro.Utils.getElementsByClass("ABCPro_Error", window.document.forms[calObj.booking_form_name], "P");
		if (err[0]) {
			err[0].innerHTML = calObj.validation.error_title + message.replace(/\n/g, "<br />");
			err[0].style.display = '';
		} else {
			alert(calObj.validation.error_title + message);
		}
	},
	triggerLoading: function (calObj, message) {
		window.document.getElementById(calObj.container_availability).innerHTML = "<div style=\"width: " + calObj.calendarWidth + "px; height: " + calObj.calendarHeight + "px;\">" + calObj[message] + "</div>";
		window.document.getElementById(calObj.container_messages).innerHTML = '';
	},
	validateBookingForm: function (btn, calObj) {
		var re = /^([0-9a-zA-Z\.\-\_]+)@([0-9a-zA-Z\.\-\_]+)\.([0-9a-zA-Z\.\-\_]+)+$/,
			message = "";
		
		var frm = window.document.forms[calObj.booking_form_name];
		for (var i = 0, len = frm.elements.length; i < len; i++) {
			var cls = frm.elements[i].getAttributeNode("class");
			if (cls && cls.value.indexOf("ABCPro_Required") !== -1) {
				switch (frm.elements[i].nodeName) {
				case "INPUT":
					switch (frm.elements[i].type) {
					case "checkbox":
					case "radio":
						if (!frm.elements[i].checked && frm.elements[i].getAttribute("rev")) {
							message += "\n - " + frm.elements[i].getAttribute("rev"); 
						}
						break;
					default:
						if (frm.elements[i].value.length === 0 && frm.elements[i].getAttribute("rev")) {
							message += "\n - " + frm.elements[i].getAttribute("rev");
						}
						break;
					}
					break;
				case "TEXTAREA":
					if (frm.elements[i].value.length === 0 && frm.elements[i].getAttribute("rev")) {						
						message += "\n - " + frm.elements[i].getAttribute("rev");
					}
					break;
				case "SELECT":
					switch (frm.elements[i].type) {
					case 'select-one':
						if (frm.elements[i].value.length === 0 && frm.elements[i].getAttribute("rev")) {
							message += "\n - " + frm.elements[i].getAttribute("rev"); 
						}
						break;
					case 'select-multiple':
						var has = false;
						for (j = frm.elements[i].options.length - 1; j >= 0; j = j - 1) {
							if (frm.elements[i].options[j].selected) {
								has = true;
								break;
							}
						}
						if (!has && frm.elements[i].getAttribute("rev")) {
							message += "\n - " + frm.elements[i].getAttribute("rev");
						}
						break;
					}
					break;
				default:
					break;
				}
			}
		}
		
		if (frm.email && frm.email.value.length !== 0 && frm.email.value.match(re) == null) {
			message += "\n - " + calObj.validation.invalid_email;
		}
		
		if (message.length === 0) {
			return true;
		} else {
			this.errorHandler(calObj, message);		
			btn.disabled = false;
			return false;
		}
	},
	validateSummaryForm: function (btn, calObj) {
		var pass = true,
			message = "\n" + calObj.validation.payment,
			i;
		
		if (pass) {
			return true;
		} else {
			this.errorHandler(calObj, message);		
			btn.disabled = false;
			return false;
		}
	},
	setPaymentsPrice: function(calObj, json) {
		var form = window.document.forms[calObj.payment[json.payment]];
		
		if (typeof form != 'undefined') {
			switch (json.payment) {
				case 'authorize':
					//form.x_amount.value = json.price;
					form.x_description.value = json.calendar_name + ', Reservation ID: ' + json.reservation_refid;
					form.x_custom_reservation_id.value = json.reservation_id;
					break;
				default:
					//form.amount.value = json.price;
					form.item_name.value = json.calendar_name + ', Reservation ID: ' + json.reservation_refid;
					form.item_number.value = json.reservation_refid;
					break;
			}
		} else return false;
		
		return true;
	},
	bindBookingForm: function (calObj) {
		// bind onchange event for payment type select
		ABCPro.Utils.addEvent(window.document.forms[calObj.booking_form_name][calObj.booking_form_payment_method], "change", function () {
			// if there will be any credit card option...
			if (calObj.cc_data_flag) {
				var $this = this;
				var $ccData = document.getElementById(calObj.cc_data_wrapper);
				var $value = $this.options[$this.selectedIndex].value.split('::');
				
				
				if ($value[0] == 'credit_card') {
					// show the credit cards fields
					$ccData.style.display = "block";
					
					// for each field add a requered class name
					for (i = 0; i < calObj.cc_data_ids.length; i++) {
						ABCPro.Utils.addClassName(document.getElementById(calObj.cc_data_ids[i]), 'ABCPro_Required', true);
					}
				} else {
					// hide the credit cards fields
					$ccData.style.display = "none";
					
					// for each field remove the requered class name
					for (i = 0; i < calObj.cc_data_ids.length; i++) {
						ABCPro.Utils.removeClassName(document.getElementById(calObj.cc_data_ids[i]), 'ABCPro_Required');
					}
				}
			}
		});
		
		function calcPrice() {
			var qs = [];
			qs.push("cid=" + calObj.calendar_id);
			qs.push("ts=1");

			var postData = ABCPro.Utils.serialize(window.document.forms[calObj.booking_form_name]);
			window.document.forms[calObj.booking_form_name]
			ABCPro.Ajax.postJSON(calObj.booking_form_prices_url + "&" + qs.join("&"), function (json) {
				window.document.getElementById("ABCPro_Total_" + calObj.calendar_id).innerHTML = json.total;
			}, postData);
		}
		
		var arr = ABCPro.Utils.getElementsByClass("ABCPro_Package", window.document.forms[calObj.booking_form_name], "INPUT");
		for (var i = 0, len = arr.length; i < len; i++) {
			ABCPro.Utils.addEvent(arr[i], "click", function (event) {
				calcPrice.apply(window.document.forms[calObj.booking_form_name], []);
			});
		}
		
		var arrExtras = ABCPro.Utils.getElementsByClass("ABCPro_Package_Extra", window.document.forms[calObj.booking_form_name], "SELECT");
		for (var i = 0, len = arrExtras.length; i < len; i++) {
			ABCPro.Utils.addEvent(arrExtras[i], "change", function (event) {
				calcPrice.apply(window.document.forms[calObj.booking_form_name], []);
			});
		}
		
		ABCPro.Utils.addEvent(window.document.forms[calObj.booking_form_name].elements['pets'], "change", function (event) {
			calcPrice.apply(window.document.forms[calObj.booking_form_name], []);
		});
		
		// bind form submit ...
		ABCPro.Utils.addEvent(window.document.forms[calObj.booking_form_name][calObj.booking_form_submit_name], "click", function () {
			var $this = this;
			$this.disabled = true;
			if (!ABCPro.Front.validateBookingForm($this, calObj)) {
				return;
			}
			var postData = ABCPro.Utils.serialize(window.document.forms[calObj.booking_form_name]);
			if ($this.form.captcha) {
				ABCPro.Ajax.getJSON(calObj.booking_captcha_url + "&captcha=" + $this.form.captcha.value, function (json) {
					switch (json.code) {
					case 100:
						ABCPro.Front.errorHandler(calObj, '\n' + json.text);
						$this.disabled = false;
						break;
					case 200:
						ABCPro.Front.triggerLoading(calObj, 'message_4');
						ABCPro.Ajax.sendRequest(calObj.booking_summary_url, function (req) {
							window.document.getElementById(calObj.container_availability).innerHTML = req.responseText;
							ABCPro.Front.bindBookingSummary(calObj, postData);
						}, postData);
						break;
					}
				});
			} else {
				ABCPro.Front.triggerLoading(calObj, 'message_4');
				ABCPro.Ajax.sendRequest(calObj.booking_summary_url, function (req) {
					window.document.getElementById(calObj.container_availability).innerHTML = req.responseText;
					ABCPro.Front.bindBookingSummary(calObj, postData);
				}, postData);
			}								
		});
	
		ABCPro.Utils.addEvent(window.document.forms[calObj.booking_form_name][calObj.booking_form_cancel_name], "click", function () {
			this.disabled = true;
			var qs = "&cid=" + calObj.calendar_id + "&view=" + calObj.view + "&month=" + window.document.forms[calObj.booking_form_name].sMonth.value + "&year=" + window.document.forms[calObj.booking_form_name].sYear.value;
			ABCPro.Front.triggerLoading(calObj, 'message_5');
			ABCPro.Ajax.sendRequest(calObj.prev_next_url + qs, function (req) {
				window.document.getElementById(calObj.container_availability).innerHTML = req.responseText;
				ABCPro.Front.bind(calObj);
			});
		});
	},
	bindBookingSummary: function (calObj, postData) {
		if (typeof window.document.forms[calObj.booking_form_name] != "undefined" && typeof window.document.forms[calObj.booking_form_name][calObj.booking_form_submit_name] != 'undefined') {
			ABCPro.Utils.addEvent(window.document.forms[calObj.booking_form_name][calObj.booking_form_submit_name], "click", function () {
				var $this = this;
				$this.disabled = true;
				if (!ABCPro.Front.validateSummaryForm($this, calObj)) {
					return;
				}
				ABCPro.Ajax.postJSON(calObj.booking_save_url, function (json) {
					switch (json.code) {
					case 100:
						ABCPro.Front.errorHandler(calObj, '\n' + json.text);
						$this.disabled = false;
						break;
					case 200:
						if (typeof window.document.forms[calObj.payment[json.payment]] != 'undefined') {
							if (json.payment != '' && json.payment != 'book') {
								ABCPro.Front.setPaymentsPrice(calObj, json);
								window.document.forms[calObj.payment[json.payment]].submit();
							} else {
								ABCPro.Front.errorHandler(calObj, '\n' + json.text);
							}
						}
						break;
					}																								
				}, postData + ABCPro.Utils.serialize(window.document.forms[calObj.booking_form_name]));
			});
		}
		
		if (typeof window.document.forms[calObj.booking_form_name] != 'undefined' && typeof window.document.forms[calObj.booking_form_name][calObj.booking_form_confirm_name] != 'undefined') {
			ABCPro.Utils.addEvent(window.document.forms[calObj.booking_form_name][calObj.booking_form_confirm_name], "click", function () {
				var $this = this;
				$this.disabled = true;
				ABCPro.Front.triggerLoading(calObj, 'message_6');
				ABCPro.Ajax.postJSON(calObj.booking_save_url, function (json) {
					window.document.getElementById(calObj.container_availability).innerHTML = json.text;
				}, postData);
			});
		}
		
		if (typeof window.document.forms[calObj.booking_form_name] != 'undefined' && typeof window.document.forms[calObj.booking_form_name][calObj.booking_form_cancel_name] != 'undefined') {
			ABCPro.Utils.addEvent(window.document.forms[calObj.booking_form_name][calObj.booking_form_cancel_name], "click", function () {
				this.disabled = true;
				ABCPro.Front.triggerLoading(calObj, 'message_2');
				ABCPro.Ajax.sendRequest(calObj.booking_form_url, function (req) {
					window.document.getElementById(calObj.container_availability).innerHTML = req.responseText;
					ABCPro.Front.bindBookingForm(calObj);
				}, postData);
			});
		}
	},
	bind: function (calObj) {
		var i, p;
		calObj.data = calObj.data || [];
		calObj.data = calObj.data.concat(ABCPro.Utils.getElementsByClass(calObj.class_name_dates, window.document.getElementById(calObj.container_availability), "td"));
		
		if (calObj.price_based_on == 'nights') {
			calObj.data = calObj.data.concat(ABCPro.Utils.getElementsByClass(calObj.class_name_pending_nights_start, window.document.getElementById(calObj.container_availability), "td"));
			calObj.data = calObj.data.concat(ABCPro.Utils.getElementsByClass(calObj.class_name_pending_nights_end, window.document.getElementById(calObj.container_availability), "td"));
			calObj.data = calObj.data.concat(ABCPro.Utils.getElementsByClass(calObj.class_name_booked_nights_start, window.document.getElementById(calObj.container_availability), "td"));
			calObj.data = calObj.data.concat(ABCPro.Utils.getElementsByClass(calObj.class_name_booked_nights_end, window.document.getElementById(calObj.container_availability), "td"));
		}
		
		for (i = 0, len = calObj.data.length; i < len; i++) {
			if (calObj.accept_booking) {
				ABCPro.Utils.addEvent(calObj.data[i], "click", function (event) {
					ABCPro.Front.uclick(event, calObj, this);
				});
			}
			
			ABCPro.Utils.addEvent(calObj.data[i], "mouseover", function (event) {
				if (calObj.accept_booking) {
					ABCPro.Front.updatePaint(event, null, calObj, this);
				}
				
				if (calObj.show_prices) {
					p = ABCPro.Utils.getElementsByClass(calObj.class_name_prices, this, "span");
					p[0].style.display = "block";
				}
			});
			
			if (calObj.show_prices) {
				ABCPro.Utils.addEvent(calObj.data[i], "mouseout", function (event) {
					p = ABCPro.Utils.getElementsByClass(calObj.class_name_prices, this, "span");
					p[0].style.display = "none";
				});
			}
		}

		var a = ABCPro.Utils.getElementsByClass(calObj.class_name_month, window.document.getElementById(calObj.container_navigation), "a");
		for (var m, y, rel, j = 0, alen  = a.length; j < alen; j++) {
			ABCPro.Utils.addEvent(a[j], "click", function () {
				rel = this.getAttributeNode("rel").value;
				switch (rel.split("-")[0]) {
				case 'next':
					m = parseInt(calObj.s_month, 10) + parseInt(calObj.view, 10) > 12 ? parseInt(calObj.s_month) + parseInt(calObj.view, 10) - 12 : parseInt(calObj.s_month) + parseInt(calObj.view, 10);
					y = parseInt(calObj.s_month, 10) + parseInt(calObj.view, 10) > 12 ? parseInt(calObj.s_year) + 1 : parseInt(calObj.s_year);
					break;
				case 'prev':
					m = parseInt(calObj.s_month, 10) - parseInt(calObj.view, 10) < 1 ? parseInt(calObj.s_month) - parseInt(calObj.view, 10) + 12 : parseInt(calObj.s_month) - parseInt(calObj.view, 10);
					y = parseInt(calObj.s_month, 10) - parseInt(calObj.view, 10) < 1 ? parseInt(calObj.s_year) - 1 : parseInt(calObj.s_year);
					break;
				}
				var queryStr = "&cid=" + calObj.calendar_id + "&view=" + calObj.view + "&month=" + m + "&year=" + y;
				/*ABCPro.Ajax.onStart = function () {
					window.document.getElementById(calObj.container_availability).innerHTML = '<img src="' + calObj.indicator_path + '" alt="" />';
				};
				ABCPro.Ajax.onStop = function () {
					window.document.getElementById(calObj.container_availability).innerHTML = "";
				};*/
				ABCPro.Front.triggerLoading(calObj, 'message_5');
				ABCPro.Ajax.sendRequest(calObj.prev_next_url + queryStr, function (req) {
					window.document.getElementById(calObj.container_availability).innerHTML = req.responseText;
					calObj.s_month = m;
					calObj.s_year = y;
					ABCPro.Front.bind(calObj);
				});
			});
		}
		
		ABCPro.Utils.addEvent(window, "unload", ABCPro.Utils.eventCache.flush);
	}
};
