/*!
* jSolare JavaScript Library v0.1.0
*
* Copyright 2010, hotelwebservice
* For Solare Hotels.
*
* Date: Tue May 05 12:31:00 2010 -0100
*/

var jSolare = {
	initialized: false,
	currentdata: {
		lang: 'EN'
	},
	useAjaxCache: false,
	ajaxCache:  [],
	toggleEffectDuration: 400
}

jSolare.init = function(config) {
	this.config = {};
	this.config.texts = config.texts;
	
	this.jQueryObj   = jQuery;
	if(typeof(jQuery)!='function' || typeof(jQuery)=='undefined') {
		alert(this.config.texts.error_nojquery);
		this.initialized = false;
		return false;
	}
	
	this.ajaxDataUrl = (config.ajaxDataUrl!='')? config.ajaxDataUrl : '';
	this.ajaxLoginUrl = (config.ajaxLoginUrl!='')? config.ajaxLoginUrl : '';
	this.useAjaxCache = config.ajaxCache;
	this.currentdata = {
		hotel:         (config.hotel!='')? config.hotel : '',
		ratepage:      1,
		lang:          (config.lang || this.currentdata.lang),
		rate:          '',
		session_token: (config.session_token!='')? config.session_token : ''
	};
	
	// Init observers when document was loaded completely!
	jSolare.jQueryObj().ready(function() {
		jSolare.initObserver();
		this.initialized = true;	
		
		// Set periodically KeepAlive:
		var keepaliveSecs = 30;
		var keepaliveId = setInterval(function() {
			jSolare.keepAlivePing();
		}, keepaliveSecs*1000);
		
	});
	
}

/*
* Creates Event triggers on links and other dom elements (using jQuery)
*/
jSolare.initObserver = function() {
	
	// Login Layer
	
	this.jQueryObj('p.loginArea01Btn input').bind('click', function(event) {
		event.preventDefault();
		jSolare.loginUser();
	});
	
	// Rate Pager
	this.jQueryObj('a.ratepager_prev').live('click', function() {
		if((jSolare.currentdata.ratepage-1)>0) {
			console.log('jSolare: rate pager loads page '+(jSolare.currentdata.ratepage-1));
			jSolare._loadRates(jSolare.currentdata.ratepage-1);
		} else {
			console.log('jSolare: rate pager can not load page '+(jSolare.currentdata.ratepage-1)+'; is currently 0!');
		}
	});
	this.jQueryObj('a.ratepager_next').live('click', function() {
		if(jSolare.currentdata.ratepage_max>0 && (jSolare.currentdata.ratepage+1)<ratepage_max) {
			console.log('jSolare: rate pager loads page '+(jSolare.currentdata.ratepage+1));
			jSolare._loadRates(jSolare.currentdata.ratepage+1);
		} else {
			console.log('jSolare: rate pager can not load page '+(jSolare.currentdata.ratepage+1)+'; is currently <ratepage_max> ('+jSolare.currentdata.ratepage_max+')!');
		}
	});
	this.jQueryObj('div.planMod01LList li').live('mouseover', function() {
		jSolare.jQueryObj(this).addClass('hover');
	});
	this.jQueryObj('div.planMod01LList li').live('mouseout', function() {
		jSolare.jQueryObj(this).removeClass('hover');
	});	
	this.jQueryObj('div.planMod01LList li').live('click', function(event) {
		event.preventDefault();
		
		// Effect:
		var selectable = (jSolare.jQueryObj(this).find('.planLLoad').length > 0)? false : true;
		if(selectable) {
			jSolare.jQueryObj('div.planMod01LList li').each(function(){
				jSolare.jQueryObj(this).removeClass('active');
			});
			jSolare.jQueryObj(this).addClass('active');
		}
		// Action:
		var rel = jSolare.jQueryObj(this).attr('rel');
		var relspl = rel.split("_");
		var ratecode          = relspl[0];
		var roomcode          = relspl[1];
		var smokingpreference = relspl[2]; 
		
		jSolare.loadRateplanDetails(ratecode, roomcode, smokingpreference, jSolare.currentdata.arrivalDate, jSolare.currentdata.nights);
		
		return false;
	});

	
	// Hotel selection page: Toggle advanced search/filter link
	this.jQueryObj('#hotelselection_toggledetailfilter').live('click', function(event) {
		event.preventDefault();
		jSolare.jQueryObj(this).blur();
		jSolare.jQueryObj('#hotelselection_filterdetails').toggle();
		// Show correct texts
		if(jSolare.jQueryObj('#hotelselection_filterdetails').is(':visible')) {
			jSolare.jQueryObj('#hotelselection_toggledetailfilter .txt_moredetails').hide();
			jSolare.jQueryObj('#hotelselection_toggledetailfilter .txt_closeadvanced').show();
		} else {
			jSolare.jQueryObj('#hotelselection_toggledetailfilter .txt_closeadvanced').hide();
			jSolare.jQueryObj('#hotelselection_toggledetailfilter .txt_moredetails').show();
		}
	});
	
	// Hotel selection page: region selector -> retrieve hotel list from ajax
	this.jQueryObj('#regionselect').bind('change', function() {
		var region = "";
		var regionname = "";
		$("#regionselect option:selected").each(function () {
			region     = jSolare.jQueryObj(this).val();
			//test:regionname = jSolare.jQueryObj(this).text();
		});
		if(region!='') {
			jSolare.buildHotelSelector(region, jSolare.currentdata.lang);
		}
	});
	
	this.jQueryObj('#hotelselection_googlemap_list ul li a').live('click', function(event) {
		event.preventDefault();
		jSolare.jQueryObj(this).blur();
		try {
			var thismarker = eval('marker_' + jSolare.jQueryObj(this).attr('rel')); 
			google.maps.event.trigger(thismarker, "click");
			
			jSolare.jQueryObj('#hotelselection_googlemap_list ul li').removeClass('act');
			jSolare.jQueryObj(this).parent().addClass('act');
			
		} catch(e) {}
	});
	/*
	this.jQueryObj('#map_canvas map').each(function(i,el) {
		jSolare.jQueryObj(el).live('click', function(event) {
			alert('Klick auf Marker');
		});
	});
	*/
	
	this.jQueryObj('a#childrenselector_room1').bind('click', function(event) {
		jSolare.jQueryObj('#childrenselector_room1_cnt').toggle();
		if(jSolare.jQueryObj('#childrenselector_room1_cnt').is(':visible')) {
			var top = event.target;
		}
	});
	this.jQueryObj('#childrenselector_room1_cnt select').bind('change', function(event) {
		var v = jSolare.jQueryObj('#childrenselector_room1_cnt select').first().val();
		jSolare.jQueryObj('a#childrenselector_room1').text(v);
		jSolare.jQueryObj('#childrenselector_room1_cnt').hide();
	});
	
	this.jQueryObj('a#childrenselector_room2').bind('click', function(event) {
		jSolare.jQueryObj('#childrenselector_room2_cnt').toggle();
	});
	this.jQueryObj('#childrenselector_room2_cnt select').bind('change', function(event) {
		var v = jSolare.jQueryObj('#childrenselector_room2_cnt select').first().val();
		jSolare.jQueryObj('a#childrenselector_room2').text(v);
		jSolare.jQueryObj('#childrenselector_room2_cnt').hide();
	});
	
	this.jQueryObj('a#childrenselector_room3').bind('click', function(event) {
		jSolare.jQueryObj('#childrenselector_room3_cnt').toggle();
	});
	this.jQueryObj('#childrenselector_room3_cnt select').bind('change', function(event) {
		var v = jSolare.jQueryObj('#childrenselector_room3_cnt select').first().val();
		jSolare.jQueryObj('a#childrenselector_room3').text(v);
		jSolare.jQueryObj('#childrenselector_room3_cnt').hide();
	});
	
	
	
	// Rateplans page: Tabs for roomrates (single, double, twin, ...)
	this.jQueryObj('ul#planRTabs li a').live('click', function(event) {
		event.preventDefault();
		jSolare.jQueryObj(this).css('outline', 'none');
		var index = jSolare.jQueryObj('ul#planRTabs li').index(jSolare.jQueryObj(this).parent());
		
		// li.active
		jSolare.jQueryObj('ul#planRTabs li').removeClass('active');
		jSolare.jQueryObj(this).parent().addClass('active');
		
		// Get "my" content div
		jSolare.jQueryObj('div#planRTabsContents div.planRRoom').each(function(i2) {
			if(i2==index) {
				jSolare.jQueryObj(this).show();
			} else {
				// Hide all other divs
				jSolare.jQueryObj(this).hide();
			}
		});
	});
	// Visual Effect:
	this.jQueryObj('.roomMod02Table .roomMod01M a').live('click', function(event) {
		jSolare.jQueryObj('.roomMod02Table td.active').removeClass('active');
		jSolare.jQueryObj(this).closest('td').addClass('active');
		jSolare.jQueryObj('.roomMod02Table td p.date').removeClass('focus');
		jSolare.jQueryObj(this).closest('td').find('p::first-child').addClass('focus');
	});
	
	
	// Step "address" - Observe zipcode field
	this.jQueryObj('#address_zipcode_field').bind('keyup', function(event) {
		var val = jSolare.jQueryObj('#address_zipcode_field').val();
		if(val.length>=7) {
			jSolare.getZipcodeRemoteData();
			jSolare.jQueryObj('#fieldcontainer_address2').show();
		} else {
			jSolare.jQueryObj('#fieldcontainer_address2').hide();
		}
	});
	this.jQueryObj('#address_zipcode_field').bind('blur', function(event) {
		jSolare.getZipcodeRemoteData();
	});
	// Step "address" - Observe radio buttons (company, association, school)
	this.jQueryObj('#address_cas_yes').bind('click', function(event) {
		jSolare.jQueryObj('#fieldcontainer_address_cas').show();
	});
	// Step "address" - Observe radio buttons (company, association, school)
	this.jQueryObj('#address_cas_no').bind('click', function(event) {
		jSolare.jQueryObj('#fieldcontainer_address_cas').hide();
	});
	
}

jSolare.showLoginArea = function() {
	jSolare.jQueryObj('#loginArea').show();
	
	// bind event handler for "body click"
	jSolare.jQueryObj('body').click(function(event) {
		// Check if click on loginArea or not
		var t = event.target;
		var canClose = true;
		if(t) {
			if(t.id && t.id == 'loginAreaImg') {
				canClose = false;
			}
			var tparent = t.offsetParent;
			if(tparent && ((tparent.id && tparent.id == 'loginArea') || (tparent.className == 'loginArea01M')) ) {
				canClose = false;
			}
		}
		if(canClose) {
			jSolare.jQueryObj('#loginArea').hide();
		}
	});
}

jSolare.loginUser = function() {
	var memberno = document.getElementsByName('login01')[0].value;
	var memberpw = document.getElementsByName('login02')[0].value;
	var fullurl = jSolare.ajaxLoginUrl + 'method=login&memberno='+memberno+"&password="+memberpw;
	// Hide Message
	jSolare.jQueryObj('#loginerrmsg').hide();
	jSolare.ajax({
		url: fullurl,
		dataType: 'json',
		success: function(jsondata, textstatus, request) {
			if(jsondata == true) {
				jSolare.jQueryObj('#loginform').submit();
			} else {
				// Show Message
				jSolare.jQueryObj('#loginerrmsg').show();
			}
		}
	});
}

jSolare.bindCalendarPopups = function() {
	
	// initialize the "Select date" link
	jSolare.jQueryObj('#calendar_picker_checkin')
		.datePicker(
			// associate the link with a date picker
			{
				createButton: false
				//startDate:'01/01/2005',
				//endDate:'31/12/2010'
			}
		).bind(
			// when the link is clicked display the date picker
			'click',
			function()
			{
				updateCalendarFields('checkin', $(this).dpGetSelected()[0]);
				$(this).dpDisplay();
				return false;
			}
		).bind(
			// when a date is selected update the SELECTs
			'dateSelected',
			function(e, selectedDate, $td, state)
			{
				updateCalendarFields('checkin', selectedDate);
			}
		).bind(
			'dpClosed',
			function(e, selected)
			{
				updateCalendarFields('checkin', selected[0]);
			}
		);
	jSolare.jQueryObj('#calendar_picker_checkout')
		.datePicker(
			// associate the link with a date picker
			{
				createButton: false
				//startDate:'01/01/2005',
				//endDate:'31/12/2010'
			}
		).bind(
			// when the link is clicked display the date picker
			'click',
			function()
			{
				updateCalendarFields('checkout', $(this).dpGetSelected()[0]);
				$(this).dpDisplay();
				return false;
			}
		).bind(
			// when a date is selected update the SELECTs
			'dateSelected',
			function(e, selectedDate, $td, state)
			{
				updateCalendarFields('checkout', selectedDate);
			}
		).bind(
			'dpClosed',
			function(e, selected)
			{
				updateCalendarFields('checkout', selected[0]);
			}
		);
	
	var updateCalendarFields = function(tf, selectedDate)
	{
		var selectedDate = new Date(selectedDate);
		$('#'+tf+'D').val(selectedDate.getDate());
		$('#'+tf+'M').val(selectedDate.getMonth()+1);
		$('#'+tf+'Y').val(selectedDate.getFullYear());
	}
	
	// listen for when the selects are changed and update the picker
	jSolare.jQueryObj('#checkinD, #checkinM, #checkoutY').bind('change', function() {
		var d = new Date(
			$('#checkinY').val(),
			$('#checkinM').val()-1,
			$('#checkinD').val()
		);
		$('#calendar_picker_checkin').dpSetSelected(d.asString());
	});
	jSolare.jQueryObj('#checkoutD, #checkoutM, #checkoutY').bind('change', function() {
		var d = new Date(
			$('#checkoutY').val(),
			$('#checkoutM').val()-1,
			$('#checkoutD').val()
		);
		$('#calendar_picker_checkout').dpSetSelected(d.asString());
	});
	
	$('#checkinD').trigger('change');
	$('#checkoutD').trigger('change');
	
}

jSolare.showMessage = function(msgtype, msgtext) {
	/*
	// extended:
	jSolare.jQueryObj('#msgOverlay').css('height', jSolare.jQueryObj('body').innerHeight());
	jSolare.jQueryObj('#msgOverlay').show();
	var body_halfwidth = Math.round( parseInt(jSolare.jQueryObj('body').innerWidth()) / 2);
	var msgcontainer_width = Math.round(jSolare.jQueryObj('#msgContainer').width() / 2);
	jSolare.jQueryObj('#msgContainer').css('left', Math.round(body_halfwidth - msgcontainer_width) );
	jSolare.jQueryObj('#msgContainer h1').text( (msgtype.toUpperCase()=='ERROR')? 'Error' : 'Message' );
	jSolare.jQueryObj('#msgContainer h3').text(msgtext);
	jSolare.jQueryObj('#msgContainer').fadeIn(200);
	jSolare.jQueryObj('#msgContainer a#msgbutton_ok').text('Back to hotel selection page').click(function(event) {
		event.preventDefault();
		jSolare.jQueryObj('#msgContainer').hide();
		jSolare.jQueryObj('#msgOverlay').fadeOut();
		jSolare.jumpToHotelSelection();
	});
	*/
	// Ticket #381:
	alert(msgtext.replace(/{br}/, '\n'));
}

jSolare.jumpToHotelSelection = function() {
	window.location.href = '/';
}

jSolare.keepAlivePing = function() {
	var d = new Date();
	var fullurl = '/includes/_keepalive.cfm?'+jSolare.currentdata.session_token;
	jSolare.ajax({
		url: fullurl,
		success: function(data, textstatus, request) {},
		error: function(xhr, ajaxOptions, thrownError) {}
	});
}

jSolare.loadRateplanLinkClick = function(link, smokingpreference, sort) {
	if(smokingpreference=='') { smokingpreference = 'NOPREF'; }
	if(sort=='')              { sort = 'RECOMMDED'; }
	
	// Remember selected item in jSolare object
	var active_rel =jSolare.jQueryObj('#rateplanlist li.active').attr('rel'); // e.g.: "AR_NOPREF"
	var active_rels = active_rel.split('_'); // Array -> [ 0:"AR", 1:"NOPREF" ]
	var active_ratecode = active_rels[0]; // First element: "AR"
	jSolare.currentdata.rate = active_ratecode;
	
	// remove list items (but show ajax loader)
	jSolare.jQueryObj('#rateplanlist li.rateplanlist_item').remove();
	
	// link class
	jSolare.jQueryObj('.sortMod01 ul li').removeClass('active');
	jSolare.jQueryObj(link).parent().addClass('active');
	
	jSolare.loadRateplanList(smokingpreference, sort);
}

jSolare.addUnloadEvent = function(func) {
	var oldOnunload = window.onunload;
	if(typeof window.onunload != 'function') {
		window.onunload = func;
	} else {
		window.onunload = function() {
			oldOnunload();
			func();
		}
	}
}

/*
* Toggle function for dom elements (mainly div elements)
*/
jSolare.toggleElement = function(elem_to_toggle, effect) {
	if(effect===undefined) {
		jSolare.jQueryObj(elem_to_toggle).toggle();
	} else {
		// Show toggle with effect
		switch(effect) {
			case 'fade':
				if(this.jQueryObj(elem_to_toggle).visible) {
					jSolare.jQueryObj(elem_to_toggle).fadeOut(this.toggleEffectDuration);
				} else {
					jSolare.jQueryObj(elem_to_toggle).fadeIn(this.toggleEffectDuration);
				}
				break;
			case 'slide':
			default:
				// Use jQuery function here
				this.jQueryObj(elem_to_toggle).slideToggle(this.toggleEffectDuration);
				break;
		}
	}
}

/*
* Wrapper for AJAX requests (mainly called by other jSolare functions)
*/
jSolare.ajax = function(d) {
	// Using jQuery ajax wrapped
	d.type     = 'GET';
	d.cache    = this.useAjaxCache;
	if(d.error==undefined) {
		d.error = function(request,textstatus,err) { alert('AJAX Error: ('+request.status+') '+textstatus); };
	}
	this.jQueryObj.ajax(d);
}

jSolare.buildHotelSelector = function(region_id, lang) {
	
	var fullurl = jSolare.ajaxDataUrl + 'method=getHotelList&regionID='+region_id+"&LANG="+lang;
	jSolare.ajax({
		url: fullurl,
		dataType: 'json',
		success: function(jsondata, textstatus, request) {
			jSolare.jQueryObj('#hotelselect option').remove();
			
			// First option: "nohotelselected" - only on first page
			if(jSolare.jQueryObj('.sortMod01').length == 0) {
				var hotelselect = jSolare.jQueryObj('#hotelselect')[0];
				var option = new Option(jSolare.config.texts.nohotelselected, '');
				if(jSolare.jQueryObj.browser.msie) {
					hotelselect.add(option);
	            } else {
	                hotelselect.add(option, null);
	            }
			}
			
			jSolare.jQueryObj.each(jsondata.DATA, function() {
				var hotelselect = jSolare.jQueryObj('#hotelselect')[0];
				var item = this;
				var option = new Option(item[1], item[0]);
				if(jSolare.jQueryObj.browser.msie) {
					hotelselect.add(option);
                } else {
                    hotelselect.add(option, null);
                }
			});
			
		}
	});
	
}

jSolare.loadOtherHotelAvailabilitiesPage = function(smokingpreference) {
	var fullurl = '/includes/steps/rateplans/ajax_rateplans_otherhotels.cfm';
	jSolare.ajax({
		url: fullurl,
		data: "smokingpreference="+smokingpreference,
		success: function(data, textstatus, request) {
			jSolare.jQueryObj('#rateplans_otherhotels_ajaxcontainer').html(data);
		}
	});
}

jSolare.getZipcodeRemoteData = function() {
	var ja_postal_code = jSolare.jQueryObj('#address_zipcode_field').val();
	if(ja_postal_code.length<=0) {
		return false;
	}
	var fullurl = jSolare.ajaxDataUrl + 'method=findAddressByPostalcode&postalcode='+ja_postal_code;
	jSolare.ajax({
		url: fullurl,
		dataType: 'json',
		success: function(jsondata, textstatus, request) {
			jSolare.jQueryObj('#address_zipcode_field').val(jsondata.postalcode);
			jSolare.jQueryObj('#pref').val(jsondata.prefecture);
			var address2 = jsondata.address2;
			address2_bracketpos = address2.search(/\uff08/g);
			if(address2_bracketpos >= 0) {
				address2 = address2.substr(0, address2_bracketpos);
			}
			jSolare.jQueryObj('#city').val(jsondata.address1 + address2);
			jSolare.jQueryObj('#fieldcontainer_address2').show();
		},
		error: function(xhr, ajaxOptions, thrownError) {
			jSolare.jQueryObj('#address_zipcode_field').val('');
			jSolare.jQueryObj('#pref').val('');
			jSolare.jQueryObj('#city').val('');
		}
	});
}

/*
* Layout A2_1: load rates from AJAX into UL-List
* @param	smokingpreference	Smoking preference selected: [NOPREF|SMOKING|NONSMOKING]
* @param	sortBy				Sorting: [RECOMMENDED|ASC|DESC]
*/
jSolare.loadRateplanList = function(smokingpreference, sort) {
	var fullurl = '/includes/steps/rateplans/ajax_rateplans_list.cfm';
	jSolare.jQueryObj('#rateplanlist li.rateplanlist_loader').show();
	jSolare.ajax({
		url: fullurl,
		dataType: 'script',
		data: "hotelcode="+jSolare.currentdata.hotel+"&smokingpreference="+smokingpreference+"&sort="+sort+"&active="+jSolare.currentdata.rate,
		success: function(data, textstatus, request) {
			//jSolare.jQueryObj('#rateplanlist').appendTo(data);
			jSolare.jQueryObj('#rateplanlist li.rateplanlist_loader').before(data);
			// hide loader:
			jSolare.jQueryObj('#rateplanlist li.rateplanlist_loader').hide();
			
			// empty?
			if(data.length<1) {
				jSolare.showMessage('error', jSolare.config.texts.noratesavailable);
			}
		}
	});
}

/*
* Layout A2_1: load room details from AJAX into content section
* @param	ratecode			Rate code from selected item
* @param	roomcode			Room code from selected item 
* @param	smokingpreference	Smoking preference selected: [NOPREF|SMOKING|NONSMOKING]
*/
jSolare.loadRoomDetails = function(ratecode, roomcode, smokingpreference, startdate, nights) {
	var fullurl = '/includes/steps/rateplans/ajax_rateplans_roomdetail.cfm';
	if(startdate==undefined) { startdate = ''; }
	jSolare.ajax({
		url: fullurl,
		data: "hotelcode="+jSolare.currentdata.hotel+"&ratecode="+ratecode+"&roomcode="+roomcode+"&smokingpreference="+smokingpreference+"&date="+startdate,
		success: function(data, textstatus, request) {
			jSolare.jQueryObj('#roomDetails').html(data);
		}
	});
	// Also set startdate and nights in form:
	// Default format: "2010-09-03"
	var checkin = startdate.split('-');
	if(checkin.length == 3) {
		var checkinY = parseInt(checkin[0], 10);
		var checkinM = parseInt(checkin[1], 10);
		var checkinD = parseInt(checkin[2], 10);
	} else {
		// Check for format "2010/09/03"
		var checkin = startdate.split('/');
		if(checkin.length == 3) {
			var checkinY = parseInt(checkin[0], 10);
			var checkinM = parseInt(checkin[1], 10);
			var checkinD = parseInt(checkin[2], 10);
		}
	}
	if(checkinY != Number.NaN) {
		var nights = (parseInt(nights)>0)? parseInt(nights) : 1;
		var checkout = new Date( checkinY, checkinM-1, checkinD );
		checkout.setDate(checkout.getDate()+nights);
		jSolare.jQueryObj('#checkinY').val(checkinY);
		jSolare.jQueryObj('#checkinM').val(checkinM);
		jSolare.jQueryObj('#checkinD').val(checkinD);
		jSolare.jQueryObj('#checkoutY').val(checkout.getFullYear());
		jSolare.jQueryObj('#checkoutM').val(checkout.getMonth()+1);
		jSolare.jQueryObj('#checkoutD').val(checkout.getDate());
	}
	// And set the new startdate into jSolare object:
	jSolare.currentdata.arrivalDate = startdate;
}

/*
* Layout A2_1: load room details from AJAX into content section
* @param	roomratecode			RoomRate code combination from selected item 
* @param	smokingpreference	Smoking preference selected: [NOPREF|SMOKING|NONSMOKING]
*/
jSolare.loadRoomDetailsByRoomRate = function(roomratecode, smokingpreference) {
	var fullurl = '/includes/steps/rateplans/ajax_rateplans_roomdetail.cfm';
	jSolare.ajax({
		url: fullurl,
		data: "hotelcode="+jSolare.currentdata.hotel+"&roomratecode="+roomratecode+"&smokingpreference="+smokingpreference,
		success: function(data, textstatus, request) {
			jSolare.jQueryObj('#roomDetails').html(data);
		}
	});
}

/*
* Layout A2_1: dayrates calendar panel (and post-loading via AJAX) -- trigger function
* @param	hotelcode			Hotel code from selected item (there could be different hotels, not using std here!)
* @param	ratecode			Rate code from selected item
* @param	roomcode			Room code from selected item
* @param	dt					Date to select
* @param	smokingpreference	Smoking preference selected: [NOPREF|SMOKING|NONSMOKING]
*/
jSolare.dayRatePanel_scrollLeft_OLD = function(linkObj, hotelcode, ratecode, roomcode, dt, smokingpreference, rtc) {
	
	var panelObj = jSolare.jQueryObj(linkObj).closest('div.dayratepanel');
	var panelPos = (panelObj.data('position')!=undefined)? panelObj.data('position') : 0;
	var panelTbl = jSolare.jQueryObj(panelObj).find('.tableMask');
	
	var isOtherHotel = (jSolare.jQueryObj(panelObj).closest('#rateplans_otherhotels').length>0);
	var isOnTriggerWork = jSolare.jQueryObj(linkObj).hasClass('donottrigger');
	
	if(isOnTriggerWork == false) {
		// Trigger other scrollers:
		if(isOtherHotel) {
			
			// Other hotels: only trigger this link, not all:
			/*
			jSolare.jQueryObj('#rateplans_otherhotels div.rateplans_otherhotels_item p.roomMod01B a').each(function(i,el) {
				jSolare.jQueryObj(el).addClass('donottrigger');
				jSolare.jQueryObj(el).click();
			});
			*/
			jSolare.jQueryObj(linkObj).addClass('donottrigger');
			jSolare.jQueryObj(linkObj).click();
			
		} else {
			jSolare.jQueryObj('#planRTabsContents .roomcategory_'+rtc+' p.roomMod01B a').each(function(i,el) {
				jSolare.jQueryObj(el).addClass('donottrigger');
				jSolare.jQueryObj(el).click();
			});
		}
	}
	
	if(isOnTriggerWork) {
		jSolare.jQueryObj(linkObj).removeClass('donottrigger');
		
		if(panelPos>0) {
			// scroll table to the right 
			panelTbl.css('left', $(panelTbl).position().left + 497);
			panelPos--;
			panelObj.data('position', panelPos);
		}
		
		if(panelPos==0) {
			// Do not allow more scrolling to left
			jSolare.jQueryObj(panelObj).find('.roomMod01B').addClass('roomMod01B_inactive');
		}
	}
}

/*
* Layout A2_1: dayrates calendar panel (and post-loading via AJAX) -- trigger function
* @param	hotelcode			Hotel code from selected item (there could be different hotels, not using std here!)
* @param	ratecode			Rate code from selected item
* @param	roomcode			Room code from selected item
* @param	dt					Date to select
* @param	smokingpreference	Smoking preference selected: [NOPREF|SMOKING|NONSMOKING]
*/
jSolare.dayRatePanel_scrollLeft = function(linkObj, hotelcode, ratecode, roomcode, dt, smokingpreference, rtc) {
	
	
	
	var panelObj  = jSolare.jQueryObj(linkObj).closest('div.dayratepanel');
	var panelPos  = (panelObj.data('position')!=undefined)? panelObj.data('position') : 0;
	var panelDate = (panelObj.data('dtleft')!=undefined)? panelObj.data('dtleft') : dt;
	var panelTbl  = jSolare.jQueryObj(panelObj).find('.tableMask');
	
	var isOtherHotel = (jSolare.jQueryObj(panelObj).closest('#rateplans_otherhotels').length>0);
	
	if(!isOtherHotel) {
	
		var today = new Date();
		var todayMinus6 = new Date(today.getFullYear(), today.getMonth(), today.getDate()-6, 0, 0, 0);
		var dt2 = new Date(Date.parse(dt));
		if(todayMinus6 <= dt2) {
			jSolare.loadRateplanDetails(ratecode, roomcode, smokingpreference, dt, jSolare.currentdata.nights);
		} else {
			jSolare.jQueryObj(panelObj).find('.roomMod01B').addClass('roomMod01B_inactive');
		}
		return false;
	
	}
	
	var isOnTriggerWork = jSolare.jQueryObj(linkObj).hasClass('donottrigger');

	if(isOnTriggerWork == false) {
		// Trigger other scrollers:
		if(isOtherHotel) {
			
			// Other hotels: only trigger this link, not all:
			/*
			jSolare.jQueryObj('#rateplans_otherhotels div.rateplans_otherhotels_item p.roomMod01B a').each(function(i,el) {
				
				jSolare.jQueryObj(el).addClass('donottrigger');
				jSolare.jQueryObj(el).click();
			});
			*/
			jSolare.jQueryObj(linkObj).addClass('donottrigger');
			jSolare.jQueryObj(linkObj).click();
						
		} else {
			jSolare.jQueryObj('#planRTabsContents .roomcategory_'+rtc+' p.roomMod01B a').each(function(i,el) {
				jSolare.jQueryObj(el).addClass('donottrigger');
				jSolare.jQueryObj(el).click();
			});
		}
	}
	
	if(jSolare.jQueryObj(linkObj).hasClass('donottrigger')) {
		
		jSolare.jQueryObj(linkObj).removeClass('donottrigger');
	
		// set position as element data
		if(panelObj.data('position')==undefined) {
			jSolare.jQueryObj(panelObj).data('position', 0);
		}
		
		// set date as element data
		if(panelObj.data('dtleft')==undefined  || panelObj.data('dtleft').length<1) {
			var dt2 = new Date(Date.parse(dt));
			jSolare.jQueryObj(panelObj).data('dtleft', dt2);
		} else {
			var dt2 = panelDate;
		}
		
		// set position as element data
		if(panelObj.data('datesloaded')==undefined) {
			if(isOtherHotel) {
				// No data shown on btnLoad-click
				jSolare.jQueryObj(panelObj).data('datesloaded', []);
			} else {
				var dt3 = new Date(Date.parse(dt));
				var dtarrival = new Date(dt3.getFullYear(), dt3.getMonth(), dt3.getDate()+7, 0, 0, 0);
				jSolare.jQueryObj(panelObj).data('datesloaded', [dtarrival.getTime()]);
			}
		}
		
		var today = new Date();
		var todayMinus6 = new Date(today.getFullYear(), today.getMonth(), today.getDate()-6, 0, 0, 0);
		if(todayMinus6 <= dt2) {
		
			// Allow Scrolling to left (backwards)
			jSolare.jQueryObj(panelObj).find('.roomMod01B').removeClass('roomMod01B_inactive');
			
			jSolare.jQueryObj(panelObj).data('position', panelPos - 1);
			
			// have boxes to be loaded?
			var tds = jSolare.jQueryObj(panelObj).find('.tableMask td').length;
			
			if(tds<=0) {
				jSolare.jQueryObj(panelObj).data('position', 0);
			}
			
			// Set dtleft
			dtleft = new Date(dt2.getFullYear(), dt2.getMonth(), dt2.getDate(), 0, 0, 0);
			jSolare.jQueryObj(panelObj).data('dtleft', dtleft);
			
			// Set dtright so that the next click call is correct:
			dtright = new Date(dt2.getFullYear(), dt2.getMonth(), dt2.getDate()+7, 0, 0, 0);
			jSolare.jQueryObj(panelObj).data('dtright', dtright);
			
			
			// Check if have to load AJAX data or if we only have to scroll
			
			var datesloaded = jSolare.jQueryObj(panelObj).data('datesloaded');
			
			if(jSolare.jQueryObj.inArray(dt2.getTime(), datesloaded)<0) {
				
				var dt = panelObj.data('dtleft');
				
				datesloaded.push(dt.getTime());
				jSolare.jQueryObj(panelObj).data('datesloaded', datesloaded);
				
				var thisdt = dt.getFullYear() + "-" + (dt.getMonth() + 1) + "-" + dt.getDate();
				var urlpath = '/includes/steps/rateplans/';
				var url = (isOtherHotel) ? 'ajax_rateplans_oh_dayrate.cfm' : 'ajax_rateplans_dayrate.cfm';
				
				// set new date (-7 days) to DOM element
				dtleft = new Date(dt2.getFullYear(), dt2.getMonth(), dt2.getDate()-7, 0, 0, 0);
				jSolare.jQueryObj(panelObj).data('dtleft', dtleft);
				
				jSolare.ajax({
					url: urlpath + url,
					context: panelObj,
					data: "hotelcode=" + hotelcode + "&ratecode=" + ratecode + "&roomcode=" + roomcode + "&date=" + thisdt + "&smokingpreference=" + smokingpreference,
					success: function(data, textstatus, request){
						var panelTbl = jSolare.jQueryObj(this).find('.tableMask');
						var panelPos = (jSolare.jQueryObj(this).data('position') != undefined) ? jSolare.jQueryObj(this).data('position') : 1;
						var tds      = jSolare.jQueryObj(this).find('.tableMask td').length;
						try {
							var width = 498 * (Math.round(tds / 7)+1);
						} 
						catch (e) {
							var width = 498;
						}
						try {
							jSolare.jQueryObj(panelTbl).width(width);
						} 
						catch (e) {
						}
						try {
							jSolare.jQueryObj(this).find('.tableMaskLoader').hide();
							jSolare.jQueryObj(this).find('.tableMaskLoaderBtn').hide();
							jSolare.jQueryObj(panelTbl).find('tr:last').prepend(data);
						}
						catch (e) {
						}
						
						// scroll table to the left (new prepend = left pos 0)
						if(tds>0) {
							jSolare.jQueryObj(panelTbl).css('left', 0);
						}
						
					}
				});
				
				// hide loader button
				jSolare.jQueryObj(panelObj).find('.tableMaskLoaderBtn').hide();
				// show loader
				jSolare.jQueryObj(panelObj).find('.tableMaskLoader').show();
				
			} else {
				// only scrolling necessary:
				
				// set new date (-7 days) to DOM element
				dtleft = new Date(dt2.getFullYear(), dt2.getMonth(), dt2.getDate()-7, 0, 0, 0);
				jSolare.jQueryObj(panelObj).data('dtleft', dtleft);
				
				// scroll table to the left
				if(tds>0) {
					jSolare.jQueryObj(panelTbl).css('left', $(panelTbl).position().left + 497);
				}
				
			}
			
			
			
		}
	}
}


/*
* Layout A2_1: dayrates calendar panel (and post-loading via AJAX) -- trigger function
* @param	hotelcode			Hotel code from selected item (there could be different hotels, not using std here!)
* @param	ratecode			Rate code from selected item
* @param	roomcode			Room code from selected item
* @param	dt					Date to select
* @param	smokingpreference	Smoking preference selected: [NOPREF|SMOKING|NONSMOKING]
*/
jSolare.dayRatePanel_scrollRight = function(linkObj, hotelcode, ratecode, roomcode, dt, smokingpreference, rtc) {
	
	var panelObj  = jSolare.jQueryObj(linkObj).closest('div.dayratepanel');
	var panelPos  = (panelObj.data('position')!=undefined)? panelObj.data('position') : 0;
	var panelDate = (panelObj.data('dtright')!=undefined)? panelObj.data('dtright') : dt;
	var panelTbl  = jSolare.jQueryObj(panelObj).find('.tableMask');
	
	var isOtherHotel = (jSolare.jQueryObj(panelObj).closest('#rateplans_otherhotels').length>0);
	
	jSolare.jQueryObj(panelObj).find('.roomMod01B').removeClass('roomMod01B_inactive');
	
	if(!isOtherHotel) {
		
		jSolare.loadRateplanDetails(ratecode, roomcode, smokingpreference, dt, jSolare.currentdata.nights);
		return false;
		
	}
	
	
	var isOnTriggerWork = jSolare.jQueryObj(linkObj).hasClass('donottrigger');
	
	if(isOnTriggerWork == false) {
		// Trigger other scrollers:
		if(isOtherHotel) {
			
			// Other hotels: only trigger this link, not all:
			/*
			jSolare.jQueryObj('#rateplans_otherhotels div.rateplans_otherhotels_item p.roomMod01P a').each(function(i,el) {
				
				jSolare.jQueryObj(el).addClass('donottrigger');
				jSolare.jQueryObj(el).click();
			});
			*/
			jSolare.jQueryObj(linkObj).addClass('donottrigger');
			jSolare.jQueryObj(linkObj).click();
						
		} else {
			jSolare.jQueryObj('#planRTabsContents .roomcategory_'+rtc+' p.roomMod01P a').each(function(i,el) {
				jSolare.jQueryObj(el).addClass('donottrigger');
				jSolare.jQueryObj(el).click();
			});
		}
	}
	
	if(jSolare.jQueryObj(linkObj).hasClass('donottrigger')) {
		
		jSolare.jQueryObj(linkObj).removeClass('donottrigger');
	
		// set position as element data
		if(panelObj.data('position')==undefined) {
			jSolare.jQueryObj(panelObj).data('position', 0);
		}
		
		// set date as element data
		if(panelObj.data('dtright')==undefined  || panelObj.data('dtright').length<1) {
			var dt2 = new Date(Date.parse(dt));
			jSolare.jQueryObj(panelObj).data('dtright', dt2);
		} else {
			var dt2 = panelDate;
		}
		
		// set position as element data
		if(panelObj.data('datesloaded')==undefined) {
			if(isOtherHotel) {
				// No data shown on btnLoad-click
				jSolare.jQueryObj(panelObj).data('datesloaded', []);
			} else {
				var dt3 = new Date(Date.parse(dt));
				var dtarrival = new Date(dt3.getFullYear(), dt3.getMonth(), dt3.getDate()-7, 0, 0, 0);
				jSolare.jQueryObj(panelObj).data('datesloaded', [dtarrival.getTime()]);
			}
		}
		
		if (panelPos < 6) {
		
			// Allow Scrolling to left (backwards)
			jSolare.jQueryObj(panelObj).find('.roomMod01B').removeClass('roomMod01B_inactive');
			
			jSolare.jQueryObj(panelObj).data('position', panelPos + 1);
			
			// have boxes to be loaded?
			var tds = jSolare.jQueryObj(panelObj).find('.tableMask td').length;
			
			if(tds<=0) {
				jSolare.jQueryObj(panelObj).data('position', 0);
			}
			
			// Set dtright
			dtright = new Date(dt2.getFullYear(), dt2.getMonth(), dt2.getDate(), 0, 0, 0);
			jSolare.jQueryObj(panelObj).data('dtright', dtright);
			
			// Set dtleft so that the next click call is correct:
			dtleft = new Date(dt2.getFullYear(), dt2.getMonth(), dt2.getDate()-7, 0, 0, 0);
			jSolare.jQueryObj(panelObj).data('dtleft', dtleft);
			
			// Check if have to load AJAX data or if we only have to scroll
			var datesloaded = jSolare.jQueryObj(panelObj).data('datesloaded');
			//if (panelPos + 1 >= Math.round(tds / 7)) {
			if(jSolare.jQueryObj.inArray(dt2.getTime(), datesloaded)<0) {
				// Load AJAX Data
				
				var dt = panelObj.data('dtright');
				
				datesloaded.push(dt2.getTime());
				jSolare.jQueryObj(panelObj).data('datesloaded', datesloaded);
				
				var thisdt = dt.getFullYear() + "-" + (dt.getMonth() + 1) + "-" + dt.getDate();
				var urlpath = '/includes/steps/rateplans/';
				var url = (isOtherHotel) ? 'ajax_rateplans_oh_dayrate.cfm' : 'ajax_rateplans_dayrate.cfm';
				jSolare.ajax({
					url: urlpath + url,
					context: panelObj,
					data: "hotelcode=" + hotelcode + "&ratecode=" + ratecode + "&roomcode=" + roomcode + "&date=" + thisdt + "&smokingpreference=" + smokingpreference,
					success: function(data, textstatus, request){
						var panelTbl = jSolare.jQueryObj(this).find('.tableMask');
						var panelPos = (jSolare.jQueryObj(this).data('position') != undefined) ? jSolare.jQueryObj(this).data('position') : 1;
						var tds      = jSolare.jQueryObj(this).find('.tableMask td').length;
						try {
							var width = 498 * (Math.round(tds / 7)+1);
						} 
						catch (e) {
							var width = 498;
						}
						try {
							jSolare.jQueryObj(panelTbl).width(width);
						} 
						catch (e) {
						}
						try {
							jSolare.jQueryObj(this).find('.tableMaskLoader').hide();
							jSolare.jQueryObj(this).find('.tableMaskLoaderBtn').hide();
							jSolare.jQueryObj(panelTbl).find('tr:last').append(data);
						} 
						catch (e) {
						}
					}
				});
			
				// hide loader button
				jSolare.jQueryObj(panelObj).find('.tableMaskLoaderBtn').hide();
				// show loader
				jSolare.jQueryObj(panelObj).find('.tableMaskLoader').show();
			
			}
			
			// Set dtright
			dtright = new Date(dt2.getFullYear(), dt2.getMonth(), dt2.getDate()+7, 0, 0, 0);
			jSolare.jQueryObj(panelObj).data('dtright', dtright);
			
			// scroll table to the right
			if(tds>0) {
				jSolare.jQueryObj(panelTbl).css('left', $(panelTbl).position().left - 497);
			}
			
		}
	}
}

/*
* Layout A2_1: load rate plan details from AJAX into content section
* @param	ratecode			Rate code from selected items (list to the left) 
* @param	smokingpreference	Smoking preference selected: [NOPREF|SMOKING|NONSMOKING]
*/
jSolare.loadRateplanDetails = function(ratecode, roomcode, smokingpreference, startDate, nights) {
	
	jSolare.jQueryObj('#planDetails').html('<div class="rateplandetails_loader">Please wait...</div>');
	
	// Do two requests here: a) load roomdetails directy, b) load plan details
	if(startDate != undefined) {
		jSolare.loadRoomDetails(ratecode, roomcode, smokingpreference, startDate, nights);
	}
	
	// Load Plan
	var fullurl = '/includes/steps/rateplans/ajax_rateplans_plandetail.cfm';
	jSolare.ajax({
		url: fullurl,
		data: "hotelcode="+jSolare.currentdata.hotel+"&ratecode="+ratecode+"&roomcode="+roomcode+"&smokingpreference="+smokingpreference,
		success: function(data, textstatus, request) {
			jSolare.jQueryObj('#planDetails').html(data);
		}
	});
}

/*
* Layout A2_1: loads first rate plan details (first item)
*/
jSolare.loadRateplanDetails_first = function() {
	// Check if there is just content:
	var plandetails = jSolare.jQueryObj('#planDetails').html();
	if(jSolare.jQueryObj.trim(plandetails).length == 0) {
		var first_item = jSolare.jQueryObj('#rateplanlist li.rateplanlist_item').first();
		if (first_item) {
			jSolare.jQueryObj(first_item).click();
		}
	}
}

jSolare.loadRateplanDetails_specific = function(rel) {
	var specific_item = jSolare.jQueryObj('#rateplanlist li[rel="'+rel+'"]').first();
	if (specific_item) {
		jSolare.jQueryObj(specific_item).click();
	}
}


/*
* Layout A2_1: sets field values and submit PLP form (another hotel selected!)
* @param	hotelcode			Hotel code from selected item (there could be different hotels, not using std here!)
* @param	ratecode			Rate code from selected item
* @param	roomcode			Room code from selected item
* @param	dt					Date to select - new arrival date (with given nights -> new departure date)
*/
jSolare.submitHotelRoomRate = function(hotelcode, ratecode, roomcode, startdateY, startdateM, startdateD) {
	document.forms["rateplans"].elements["rateplans.hotelcode"].value = hotelcode;
	document.forms["rateplans"].elements["rateplans.checkinY"].value = startdateY;
	document.forms["rateplans"].elements["rateplans.checkinM"].value = startdateM;
	document.forms["rateplans"].elements["rateplans.checkinD"].value = startdateD;
	var d=document.getElementById('cfaemptyevent');
	d.value=ratecode + "_" + roomcode;
	d.name='rateplans.btnOtherHotelSelect';
	d.form.submit(); 
}


jSolare.toggleRoomForms = function(o) {
	var max = o[o.selectedIndex].value;
	for (var i = 1; i <= o.options.length; i++) {
		if (i <= max) 
			document.getElementById('room'+String(i)+'_container').style.display = '';
		else 
			document.getElementById('room'+String(i)+'_container').style.display = 'none';
	}
}
