// Use jQuery via $j(...)
var $j = jQuery.noConflict();


var testresults

function checkemail(){
	var str=document.forms.bookingForm.Form_Email.value; 
	var filter=/^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i
	if (filter.test(str))
		testresults=true;
	else {
		alert("Please enter a valid email address!");
		document.forms.bookingForm.Form_Email.focus();
		testresults=false;
	}
	return testresults;
}

// Validate Date Field 
function checkdate(input){
	var validformat=/^\d{2}\/\d{2}\/\d{4}$/; //Basic check for format validity
	var returnval=false;
	if (!validformat.test(input.value))
		alert("Invalid date format. (DD/MM/YYYY)");
	else{ //Detailed check for valid date ranges
		var dayfield=input.value.split("/")[0];
		var monthfield=input.value.split("/")[1];
		var yearfield=input.value.split("/")[2];
		var dayobj = new Date(yearfield, monthfield-1, dayfield);
		if ((dayobj.getMonth()+1!=monthfield)||(dayobj.getDate()!=dayfield)||(dayobj.getFullYear()!=yearfield))
			alert("Please enter a valid date.");
		else returnval=true;
	}
	if (returnval==false) input.select();
	return returnval;
}
  
function validateForm() { 


	if(document.forms.bookingForm.Form_Firstname.value=="") {
		alert("Please enter your first name.");
		document.forms.bookingForm.Form_Firstname.focus();
		return false;
	}
	if(document.forms.bookingForm.Form_Lastname.value=="") {
		alert("Please enter your last name.");
		document.forms.bookingForm.Form_Lastname.focus();
		return false;
	}
	if(document.forms.bookingForm.Form_Email.value=="") {
		alert("Please enter your email address.");
		document.forms.bookingForm.Form_Email.focus();
		return false;
	} 
	var knowUsValue =  document.forms.bookingForm.FormKnowUsMenu.options[document.forms.bookingForm.FormKnowUsMenu.selectedIndex].value;
	if ((knowUsValue == "-"))
	{
		alert("Please enter how did you find out about us");
		document.forms.bookingForm.FormKnowUsOther.focus();
		return false;
	}
	
	if ((knowUsValue == "OtherSE" ) || (knowUsValue == "Web" ) || (knowUsValue == "Other" )) 
	{
		
		if(document.forms.bookingForm.FormKnowUsOther.value=="") {
			alert("Please enter how did you find out about us");
			document.forms.bookingForm.FormKnowUsOther.focus();
			return false;
		} 
	}
	if (checkemail()) {
		if (checkdate(document.forms.bookingForm.DateFrom)) {
			return checkdate(document.forms.bookingForm.DateTo);
		} else return false;
	} else return false;
}


$j(document).ready(function(){

	// Do not show the estimated price 
	$j('#price_range').hide();
	$j('#price_range li').hide();	
	$j('#price_range').before("<span>No room type selected</span>");
	
	// Hide minimum stay
	$j('#minimum_stay').hide();
	
	// Add click events to the menu 
	$j("#roomTab ul li a").each( 
		function(element, index) {
			$j(this).click(function(e) {
				e.preventDefault();
				updateBanner($j(this));
			});
		}
	);
	
	// Add click events to the ResidenceType and RoomType
	$j("#Form_ResidenceType input").each( 		 	
		function(element, index) {				
			$j(this).click(function(e) { 		
				var select_type = $j(this).attr("name");
				
				minimumStay();	

				if 	( select_type == "Form_ResidenceType[]" ) {	
					updateResidenceType($j(this));
				} else if ( select_type == "Form_RoomType[]" ) {			
					setSelectedSize($j(this));
				}
				
			});
		}
	);
	
	// Add onchange events to the date selection boxes
	//$j("#Form_Form_EditableDateField60, #Form_Form_EditableDateField61").change(
	$j("#_DateFrom, #_DateTo").change(
		function(e) {
			setDates();
		}
	);
	
	// Parse the dates
	parseAndSetDates();
	
	// Remove the first border-line of the second li
	$j('.bookingPage:eq(1) li').addClass('first'); 
	
	// Do not show the selectedResidence in the initial stage if no selected
	var hideFlag = true;
	$j('#selected_residence_ li label').each (
		function(element, index) {	
			if ($j(this).text() == "" ) {
				$j(this).parent().hide();
			} else {
				hideFlag = false;
				$j(this).addClass('selected');
				$j(this).parent().attr({ style: "" });
			}
		}
	);
	if (hideFlag) {
		$j('#selected_residence_').hide();
	} else {
		$j('#selected_residence_').prev().hide();
	}
	
	//disableRoomType if residence is not selected yet
	$j( ".room_type li input" ).each(
		function(element, index) {	
			if ($j(this).parent().parent().prev().find('li input').is(':checked') == false) {
				$j(this).attr('disabled', true);
			}
		}
	); 
	
	// Load the requested residence banner image
	loadSelectedResidence();

});


function loadSelectedResidence() {
	var residence_type = _getResidenceType();
	
	// Make sure that the active item inside the menu is the same as the selected residence
	var current_residence = $j("#roomTab div.active").next().find('a').text();
	$j("#roomTab ul li a").each(
		function(element, index) {
			if($j(this).text() == residence_type) {
				$j(this).trigger('click');
				return false;
			}
		}
	)
}

function activeRoomTypes(element) {	 
	var roomType_checkbox = "#" +$j(element).parent().parent().next().attr('id') + " li input"; 
	if ($j(element).is(':checked')) {		
		$j(roomType_checkbox).each(
			function(element, index) {											 
				$j(this).attr('disabled', false);
			}
		);
	} else {
		$j(roomType_checkbox).each(
			function(element, index) {											 
				$j(this).attr('disabled', true);								 
				$j(this).attr('checked', false);
			}
		);
	}
}

function updateBanner(element) {

	$j("#roomTab ul li").each(
		function(index) {
			$j(this).show();
			if (index != 0) {
				$j(this).removeClass('first');
			}
		}
	);
	
	$j("div.residenceRoom").each(
		function() {
			//$j(this).parent().hide();
			$j(this).parent().removeClass("active").addClass("link")
		}
	)
		
	// Make li invisible
	$j(element).parent().parent().find(":first").hide();

	// Make the next li having a FIRST class. Not if it is the last item!
	if ($j(element).parent().parent().children() != 0) {
		$j(element).parent().parent().next().next().find(":first").addClass('first');
	}

	// Make the parent div visible			
	//$j(element).parent().parent().prev().show();
	$j(element).parent().parent().prev().removeClass("link").addClass("active");
	
	// Show the correct MAIN image
	$j("#roomBanner img").each(
		function() {
			$j(this).hide();
		}
	);

	var banner_image = '#banner_' + $j(element).text().toLowerCase().replace(/\s+/g, '_');
	$j(banner_image).show();
}

function updateResidenceType(element) {
	var selectedResidneceType = '#selected_residence_ .'+ $j(element).next().attr("for") + ' label';
	var price_range = '#price_range .'+ $j(element).next().attr("for") + ' label';
	
	if  ( $j(element).is(':checked') ) {	
		// Update selected property
		$j(selectedResidneceType).parent().parent().show();
		//$j(selectedResidneceType).parent().show();
		
		$j(selectedResidneceType).parent().attr({ style: "" });
		
		$j(selectedResidneceType).text($j(element).next().text()); 
		$j(price_range).text($j(element).next().text()); 
		
		//remove selected class
		$j('#selected_residence_ label').each (
			function(index, element) {
				$j(this).removeClass("selected");	
			}
		); 
		//add selected class
		$j(selectedResidneceType).addClass("selected");	
		$j('#selected_residence_').prev().hide();
	} else {
		// De-select Residence type
		$j(selectedResidneceType).parent().hide();
		$j(selectedResidneceType).empty();
		$j(price_range).parent().hide();
		$j(price_range).next().empty();
	}
	
	//active roomtypes that this residence has
	activeRoomTypes(element);
}

function setSelectedSize(element) {	

	var ResidenceType = $j(element).parent().parent().prev().find('li label').attr("for");
	var selectedRoomType_element = '#selected_residence_ .'+ ResidenceType + ' div';
	var price_range = '#price_range .'+ ResidenceType + ' div';
	var RoomType_toBeAdded = "-"+$j(element).next().text();
	var RoomType_toBeAdded_wrap = '<span class="selected">' + RoomType_toBeAdded + '</span>';
		
	if  ( $j(element).attr("checked") ) {	
		//remove text
		$j("#estimatedPriceItem span").remove();
		$j('#price_range').show();
		
		$j(price_range).parent().show();
		
		//remove old selected class	
		$j('#selected_residence_ span').each (
			function(index, element) {
				$j(this).removeClass("selected");	
			}
		); 
		
		// add selected room type
		$j(selectedRoomType_element).append(RoomType_toBeAdded_wrap);
		
		updatePriceRange(ResidenceType);
		
	} else {
		// De-select Residence type
		$j(selectedRoomType_element + " span").each(
			function(index, element) {
				if ( $j(this).text() == RoomType_toBeAdded ) { 
					$j(this).remove();
				}
			}
		);	
		
		//update price range
		if ( $j(selectedRoomType_element).text() == "" ) {
			$j(price_range).parent().hide();
			$j(price_range).empty();
			
			 if ( showNoRoomSelected() ) {
				 $j("#price_range").before("<span>No room type selected</span>");
				 $j("#price_range").hide();
			 }
		} else {
			updatePriceRange(ResidenceType);
		}
	
	}
	 
	//$j("#selected_size").text($j(element).next().text());	
}

//if no roomtype selected yet show text
function showNoRoomSelected() {
	var result = true;
	$j("#price_range div").each(
		function(index, element) { 
			if ( $j(this).text() != "" && result ) {  
				result = false;
			}
		}
	);
	return result;
}

function setDates() {
	var from_date = $j("#_DateFrom").val();
	var end_date = $j("#_DateTo").val();
	$j("#selected_dates").text(from_date + " - " + end_date);
	
	minimumStay();
}

function parseAndSetDates() {
	var str_dates = $j('#selected_dates').text();
	var str_date_from = "";
	var str_date_to = "";
	if (str_dates != "" && (str_dates.indexOf("date") == -1)) {
		if (str_dates.length >= 10) {
			str_date_from = str_dates.substr(0, 10); 
		}
		if (str_dates.length = 23) {
			str_date_to = str_dates.substr(13);
		}
		
		$j("#_DateFrom").val(str_date_from);
		$j("#_DateTo").val(str_date_to);
	}	
}

function minimumStay() {

	// Check first which residence has been selected
	var any_selected = false;

	if ($j("#chi_120_checkbox").is(':checked') || $j("#chi_314_checkbox").is(':checked') || $j("#chi_393_checkbox").is(':checked')) {
		any_selected = true; 
	}

	if (any_selected) {
		var str_date_from = $j("#_DateFrom").val();
		var str_date_to = $j("#_DateTo").val();
		if (str_date_from != "" && str_date_to != "") {
			var date_from = new Date(str_date_from.substr(6), parseInt(str_date_from.substr(3,2) - 1), str_date_from.substr(0,2), 0, 0, 0, 0);
			var date_to = new Date(str_date_to.substr(6), parseInt(str_date_to.substr(3,2) - 1), str_date_to.substr(0,2), 23, 59, 59, 0);
			var date_diff = date_to.getTime() - date_from.getTime();

			if (date_diff > 0) {
				// Find out how many days are there
				date_diff = date_diff / 1000;
				var days = Math.ceil(date_diff / 86400) - 1; // Only count the nights

				// We need to make an exception for CHI 120, 393, 314 as the minimum stay is 1 month
				if (days < 30) {
					$j('#minimum_stay').show();
				}
				else {
					$j('#minimum_stay').hide();
				}
			}
		}
		else {
			$j('#minimum_stay').hide();
		}
	}
	else {
		$j('#minimum_stay').hide();
	}
}

function updatePriceRange(ResidenceType) {	
	calculatePrice(ResidenceType);
}

function calculatePrice(residence_type_class) {
	var price = 0;
	var room_type_code = -1;
	var residence_type = $j('#selected_residence_ div span.selected').parent().prev().text().toUpperCase();

	$j("#selected_residence_ ." + residence_type_class + " div span").each(
		function(index, element) {
			var room_type = $j(this).text().toLowerCase();

			room_type_code = _getSelectedRoomTypeCode(room_type); 
			var new_price = _getTotalMonthlyRate(residence_type, room_type_code); //alert(residence_type + " - " +room_type_code + " - " + new_price);
			if ( price == 0 || new_price < price) {
				price = new_price;
			}
		}
	);		 

	showPrice(price);
}


function _getResidenceType() {
	return $j('#selected_residence_ label.selected').text().toUpperCase();
}



function _getSelectedRoomTypeCode(room_type) {
	var room_type_code = -1;
	switch (room_type) {
		case "-Luxury One Bedroom (1,050 sq.ft.)".toLowerCase() : room_type_code = 0; break;

		case "-One Bedroom (650 sq.ft.)".toLowerCase() : room_type_code = 0; break;
		case "-One Bedroom (700 sq.ft.)".toLowerCase() : room_type_code = 1; break;

		case "-Studio (290 sq.ft.)".toLowerCase() : room_type_code = 0; break;

		case "-Studio (430/490 sq.ft.)".toLowerCase() : room_type_code = 0; break;
		case "-One Bedroom (410-760 sq.ft.)".toLowerCase() : room_type_code = 1; break;
		case "-Luxury One Bedroom (900 sq.ft.)".toLowerCase() : room_type_code = 2; break;
		case "-Two Bedroom (1,400 sq.ft.)".toLowerCase() : room_type_code = 3; break;
	}
	
	return room_type_code;
}

function _getTotalMonthlyRate(residence_type, room_type_code) {
	var result = 0;
	var rate = 0;

	switch(residence_type) {
		case "CHI 120" :
			switch(room_type_code) {
				case 0 : rate = 28000; break;
			}
			break;
		case "CHI 279" :
			switch(room_type_code) {
				case 0 : rate = 16000; break;
				case 1 : rate = 22400; break;
			}
			break;
		case "CHI 393" :
			switch(room_type_code) {
				case 0 : rate = 11000; break;
			}
			break;
		case "CHI 314" :
			switch(room_type_code) {
				case 0 : rate = 14400; break;
				case 1 : rate = 14800; break;
				case 2 : rate = 32000; break;
				case 3 : rate = 44000; break;
			}
			break;
	}
	
	result = rate;
	return result;
}

function showPrice(price) { 
	var residence_type_class = $j('#selected_residence_ div span.selected').parent().parent().attr("class");
	
	$j("#price_range ." + residence_type_class + " div").html('-From HK$' + price);

}

function showKnowUsBox()
{
	var knowUsValue =  document.forms.bookingForm.FormKnowUsMenu.options[document.forms.bookingForm.FormKnowUsMenu.selectedIndex].value;
	if ((knowUsValue == "OtherSE" ) || (knowUsValue == "Web" ) || (knowUsValue == "Other" )) 
	{
		$j("#FormKnowUsOther").show();
	}
	else
	{
		$j("#FormKnowUsOther").hide();
	}
}