// APP ESKY
/* ---------- VARIABLES ---------- */
var TXT_HIDE_DETAILS = 'ukryj szczegó³y';
var cl_OK = 'form-input-ok';
var cl_Error = 'form-input-error';
var cl_OmitError = 'form-error-omit';
var autocomplete_url = "/wyszukaj/miasto/lotnisko";

/* ---------- FUNCTIONS ---------- */
function pause(millisecondi)
{
		var now = new Date();
		var exitTime = now.getTime() + millisecondi;

		while(true)
		{
				now = new Date();
				if(now.getTime() > exitTime) return;
		}
}

/**
 * Function for creating a cookie
 * @param {Object} name
 * @param {Object} value
 * @param {Object} days
 */
function createCookie(name,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+escape(value)+expires+"; path=/";
}
/**
 * Function for reading a cookie.
 * @param {Object} name
 */
function readCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return unescape(c.substring(nameEQ.length,c.length));
	}
	return null;
}
function eraseCookie(name) {
	createCookie(name,"",-1);
}
/**
 * Special function for spliting form element name/id
 * into 2 pieces: name (letters) and number (digits).
 * This function is used by hotels/flights ASF
 */
function splitValue(value) {
	if(typeof value != "string") value = value.toString();
	var objectName = value.match(/(\.|\#)?[\/\?\.=a-z_]+/g);
	var objectId = value.match(/\d+/g);
	return {
		name:objectName,
		id:objectId,
		array:( objectId != parseInt(objectId) && objectId != null )?true:false
	}
}
var flyTripControlQSF = function() {
	var DISABLE = false;
	var o = ($(this).val()) ? $(this) : $('input[type=radio]:checked','#tab_qsfFlights');
	var inputs = $('.out-date','#tab_qsfFlights');

	$('#esky_calendar,#esky_cities').remove();

	switch(o.val()){
		case 'roundtrip':
			if (DISABLE) {
				inputs.removeAttr('disabled');
				inputs.next().removeClass('btn-calendar-disabled');
			}
			else {
				inputs.show();
			}
		break;
		case 'onewaytrip':
			if(DISABLE){
				inputs.attr('disabled','disabled').val('');
				inputs.next().addClass('btn-calendar-disabled');
			}
			else{
				inputs.hide().find('#fly_to_date_0').val('');
			}
//			inputs.find('label').removeClass(cl_Error);
		break;
	}
	$('a.pop-calendar').unbind().not('.btn-calendar-disabled').click(function(){
		var o = $(this);
		o.esky_calendar({thisInput:o.attr('rel'),linkedInput:o.attr('rev'),loop:2,blockedDays:3,allowSameDay:true});
		return false;
	});
	$('#fly_from_date_0,#fly_to_date_0').click(function(){
		var o = $(this);
		var l = $('#'+o.attr('rel')).val();
		o.esky_calendar({thisInput:o.attr('rel'),linkedInput:o.attr('rev'),loop:2,blockedDays:3,allowSameDay:true});
	});
	$('#fly_from_0,#fly_to_0').autocomplete(ibeConfig.autocomplete,{
		delay: 300,
		minChars: 3,
		matchSubset: 1,
		matchContains: 1,
		cacheLength: 10,
		autoFill: false,
		maxItemsToShow: 15,
		formatItem: formatItem
	})
}
/**
 * Special function for changing hotel checkout date
 * This function is used by hotels ASF
 */
var calculateCheckoutDate = function(input){
	switch(input){
		case 'hotel_checkout_date':
			var i = new Date.fromString($('#hotel_checkin_date').val());
			var o = new Date.fromString($('#hotel_checkout_date').val());
			$('#hotel_nights').val(parseInt((o-i)/(24*60*60*1000),10));
		break;
		default:
			var d = $('#hotel_checkin_date').val();
			var n = (isValidDateFormat(d)) ? new Date.fromString(d) : new Date();
			var d = n.addDays(parseInt($('#hotel_nights').val()),10).asString();
			$('#hotel_checkout_date').val(d);
		break;
	}
}
/**
 * Control numer of fields with children age in hotels ASF
 * depending on children number field selection (none,1,2)
 */
var hotelChildrenNumberControl = function() {
	var age = '';
	for(i=2;i<=12;i++){age+='<option value="'+i+'">'+i+'</option>';}
	var n = splitValue($(this).attr('id'));

	var selects_to_render = $(this).val();
	var selects_div_id = 'hotel_children_age_' + n.id;

	if(!document.getElementById(selects_div_id) && selects_to_render > 0) {
		$(this).after($('<div></div>').attr('id',selects_div_id).addClass('form-line inside-line').append($('<label></label>').text(txt_children)));
	}
	var selects_div = $('#' + selects_div_id);
	if ( selects_to_render == 0 ) {
		selects_div.remove();
	}

	$('select:gt('+(selects_to_render-1)+')',selects_div).remove();

	var i = 0;
	while ($('select',selects_div).size() < selects_to_render) {
		selects_div.append($('<select></select>').attr('name','children_age_'+n.id+'_'+(i++)).html(age));
	}
}
/**
 *  Control availibility of children in hotels ASF
 *  depending on room type selection
 */
var hotelChildrenControl = function() {
	var v = $(this).val();
	var n = splitValue($(this).attr('id'));
	var c = $('#hotnumchildren_' + n.id);
	if(v=='DB'||v=='TB') {
		c.removeAttr('disabled')
	} else {
		c.val('0').attr('disabled','disabled');
		$('#hotel_children_age_' + n.id).remove();
	}
}
/**
 * Control number of room fields for hotels ASF
 * depending on numer of rooms field selection
 */
var hotelRoomsControl = function() {
	var v = $('#number-of-rooms').val();
	$('.rooms:gt('+(v-1)+')').remove();
	while ($('.rooms').size() < v) {
		$('.rooms:first').clone().insertAfter('.rooms:last');
		//$('.rooms:last').fieldReset('input,select').fieldNumberControl({'label':'for','select':'name,id'},$('.rooms').size()-1);
		$('.rooms:last').fieldNumberControl({'label':'for','select':'name,id'},$('.rooms').size()-1);
		$('div.inside-line:last','.rooms:last').remove();
		//$('#hotel_children_age_'+i).remove();
	}
	//$('select:first','.rooms').change(hotelChildrenControl).each(hotelChildrenControl);
	//$('select:last','.rooms').change(hotelChildrenNumberControl).each(hotelChildrenNumberControl);
}
/**
 * Formating function for autocomplete plugin
 * @param {Object} row
 */
var formatItem = function(row) {
	return "<div class=\"ac_line\"><strong>"+row[1]+"</strong>, "+row[2]+" - "+row[3]+" ("+row[4]+")</div>";
}
var formatItemHotel = function(row) {
	return "<div class=\"ac_line\"><strong>"+row[1]+"</strong>, "+row[2]+"</div>";
}
/**
 * Airport selector for citySelector plugin
 * @param {Object} code
 * @param {Object} field
 */
var selectAirportBack = function(code,field,fieldCode) {
	$('#'+field).prev('.hidden').val(code);
	$('#'+field).val(code);
	$('#'+field).focus();
	closeCitySelector();
}
/**
 * Little function for closing city selector box
 */
var closeCitySelector = function() {
	$('#esky_cities').empty().remove();
	$(document).blur();
}


/* ---------- VALIDATION FUNCTIONS ------------- */
/**
 * errorBox displays list of error messages
 * or displays alert window
 */
var errorBoxStickers = function(errors,options) {
	$('div#msg-box').remove();
	$('div#msg-balloon').remove();
	//$('body').append( $('<div></div>').hide().attr('id','msg-box').addClass('errors-list').addClass('error-sticker').append($('<strong></strong>').text(FS_ERRORS_Title)).append($('<p></p>')).append($('<a></a>').text('OK').click(function(){$('div#msg-box').fadeOut('slow')})));
	$('body').append(
		$('<div></div>')
			.attr('id','msg-balloon')
			.append(
				$('<div></div>')
					.attr('id','msg-content')
					.append($('<h6></h6>').text(FS_ERROR_Title))
					.append(
						$('<p></p>')
							.append($('<span></span>'))
							.append(
								$('<a></a>')
									.attr('href','javascript:void(0);')
									.text(TXT_CLOSE)
							)
					)
					.append($('<div></div>').attr('id','msg-arrow'))
			)
			.bgIframe()
	);

	var firstError = $('label[class*="' + cl_Error + '"]:first');
	var xy = firstError.offset();

	$('#msg-balloon span').text(firstError.attr('title'));
	$('#msg-balloon a').click(function(){
		$('div#msg-balloon').remove();
	})
	$('div#msg-balloon').css({'left':xy.left,'top':xy.top-$('div#msg-balloon').height(),'margin':'0px'}).fadeIn('slow').bgIframe();
}
var isValidDateFormat = function(s,startFromYear){
	if(!s||s=='') return false;
	var reFormat =  /^([0-9]{2,4}[\.\-/]{1}){2}([0-9]{2,4})$/i.test(s);

	var f = Date.format; f.toLowerCase();

	var reSeparator = false;
	if(/^\d+\-\d+\-\d+$/i.test(s) && /^\w+\-\w+\-\w+$/i.test(f)) reSeparator = true;
	if(/^\d+\.\d+\.\d+$/i.test(s) && /^\w+\.\w+\.\w+$/i.test(f)) reSeparator = true;
	if(/^\d+\/\d+\/\d+$/i.test(s) && /^\w+\/\w+\/\w+$/i.test(f)) reSeparator = true;

	var y = parseInt(s.substr(f.indexOf('RRRR'),4),10);
	var m = parseInt(s.substr(f.indexOf('MM'),2),10);
	var d = parseInt(s.substr(f.indexOf('DD'),2),10);

	return ( !reFormat || !reSeparator || y<0 || m<1 || m>12 || d<1 || d>31 ) ? false : true ;
}
var isValidDOB = function(object){
	var this_date = Date.fromString(object.val());
	var today = new Date;

	if(this_date==false || jQuery.trim(object.val())=='' || !isValidDateFormat(object.val()) || this_date.zeroTime() >= today.zeroTime() ){
		return false;
	}
	return true;
}
var isValidDOBInfant = function(object){
	var dob = Date.fromString(object.val());
	var today = new Date;

	if(isValidDOB(object)){
		// Age 0 - 2
		return (dob.addYears(2) < today) ? F_OF_ERROR_BadInfantAge : true;
	}else{
		return false;
	}
}
var isValidDOBChild = function(object){
	var dob = Date.fromString(object.val());
	var today = new Date;

	if(isValidDOB(object)){
		// Age 2 - 12(2+10)
		return (dob.addYears(2) > today || dob.addYears(10) < today) ? F_OF_ERROR_BadInfantAge : true;
	}else{
		return false;
	}
}
var isValidDOBYought = function(object){
	var dob = Date.fromString(object.val());
	var today = new Date;

	if(isValidDOB(object)){
		// Age 12 - 18(12+6)
		return (dob.addYears(12) > today || dob.addYears(6) < today) ? F_OF_ERROR_BadYoughtAge : true;
	}else{
		return false;
	}
}
/**
 * Checks if date is valid (F-ASF)
 */
var isValidDate = function(object){
	var pair_date = object.parent().children('input').not(object);
	var this_date = Date.fromString(object.val());
	var today = new Date().zeroTime();

	if(this_date==false || jQuery.trim(object.val())=='' || !isValidDateFormat(object.val())) return F_SF_ERROR_BadDateFormat;

	if( object.attr('name').indexOf('_from_')!=-1 ){
		var fly_from = this_date;
		var fly_to = Date.fromString(pair_date.val());

		if(fly_to>new Date().addDays(364)) return F_SF_ERROR_DateOutOfRange;
		if(fly_from < today.addDays(F_SF_MinStartDate)) return F_SF_ERROR_OutDateToCloseToCurrentDate;
	} else {
		var fly_from = Date.fromString(pair_date.val());
		var fly_to = this_date;

		if (object.not(':disabled')) {
			if (fly_from > fly_to)	return F_SF_ERROR_OutDateIsGraterThenReturnDate;
			//if (parseInt((fly_to - fly_from) / 86400000) > F_SF_MaxDateRange) return F_SF_ERROR_DatesOutOfRange;
		}
	}
	return true;
}
/**
 * Checks if date is valid (H-ASF)
 */
var isValidDateHotel = function(object){
	var pair_date = object.parent().children('input').not(object);
	var this_date = Date.fromString(object.val());
	var today = new Date().zeroTime();

	if(this_date==false || jQuery.trim(object.val())=='' || !isValidDateFormat(object.val())) return F_SF_ERROR_BadDateFormat;
	if(this_date < today) return H_SF_ERROR_OutDateToCloseToCurrentDate;

	if( object.attr('name').indexOf('_checkin_')!=-1 ){
		var fly_from = this_date;
		var fly_to = Date.fromString(pair_date.val());
		var range = this_date;

		if(fly_to>range.addDays(H_SF_MaxDateRange)) return H_SF_ERROR_DateOutOfRange;
		if(fly_from < today.addDays(H_SF_MinStartDate)) return H_SF_ERROR_OutDateToCloseToCurrentDate;
	} else {
		var fly_from = Date.fromString(pair_date.val());
		var fly_to = this_date;

		if (object.not(':disabled')) {
			if (fly_from >= fly_to)	return H_SF_ERROR_OutDateIsGraterThenReturnDate;
			//if (parseInt((fly_to - fly_from) / 86400000) > F_SF_MaxDateRange) return F_SF_ERROR_DatesOutOfRange;
		}
	}
	return true;
}
/**
 * Checks if date is valid (F-QSF)
 */
var isValidDateFQSF = function(object){
	var this_date = Date.fromString(object.val());
	var today = new Date;

	if(this_date==false || jQuery.trim(object.val())=='' || !isValidDateFormat(object.val())) return F_SF_ERROR_BadDateFormat;

	if( object.attr('name').indexOf('_from_')!=-1 ){
		var fly_from = this_date;
		var fly_to = Date.fromString($('#fly_to_date_0').val());

		if(fly_to>new Date().addDays(364)) return F_SF_ERROR_DateOutOfRange;
		if(fly_from < today.addDays(F_SF_MinStartDate)) return F_SF_ERROR_OutDateToCloseToCurrentDate;
	} else {
		var fly_from = Date.fromString($('#fly_from_date_0').val());
		var fly_to = this_date;

		if (object.not(':disabled')) {
			if (fly_from > fly_to)	return F_SF_ERROR_OutDateIsGraterThenReturnDate;
			//if (parseInt((fly_to - fly_from) / 86400000) > F_SF_MaxDateRange) return F_SF_ERROR_DatesOutOfRange;
		}
	}
	return true;
}
/**
 * Checks if city is valid (F-ASF & F-QSF)
 */
var isValidCity = function(object){
	var city = object.val();
	if ((city == txt_pick_flight_destination) || (city == txt_pick_hotel_destination)) {
		return false
	}
	else {
		return /^.{3,}$/i.test(city);
	}
}
/**
 * Checks if city is valid (F-ASF when multiple trip is selected)
 */
var isValidCityMultiple = function(object){
	var pair_city = object.parent().children('input').not(object);
	var test = /^([ \w\-\(\)\.,êó±¶³¿¼æñ]{3,})?$/i.test(object.val());
	if(test) {
		if (/^.{0}$/i.test(pair_city.val()) && /^.{0}$/i.test(object.val())) {
			return true;
		} else if (/^.+$/i.test(pair_city.val()) && /^.{3,}$/i.test(object.val())) {
			return true;
		} else {
			return F_SF_ERROR_PairCityCantBeEmpty;
		}
	}
	return test;
}
/**
 * Checks if date is valid (F-ASF when multiple trip is selected)
 */
var isValidDateMultiple = function(object){
	var name = splitValue(object.attr('id'));

	var this_date = Date.fromString(object.val());
	if(jQuery.trim(object.val())=='') return true;
	if(this_date==false) return F_SF_ERROR_BadDateFormat;

	var inputs = $('input[id^="fly_from_date"]');//.not(':first');

	if(!inputs.get(name.id-1)) return true;

	var previous = Date.fromString(inputs.get(name.id-1).value);
	var current = Date.fromString(inputs.get(name.id).value);

	if (previous==false || jQuery.trim(inputs.get(name.id-1).value)=='') return F_SF_ERROR_BadPreviousDate;
	if (previous >= current)	return F_SF_ERROR_StDateIsGraterThenNdDate;
	if (parseInt((previous - current) / 86400000) > F_SF_MaxDateRange) return F_SF_ERROR_DatesOutOfRange;

	return true;
}
/**
 * Checks if passengers are valid (F-ASF)
 */
var isPassanger = function(object){

	var passengers = 0;
	for(i=1;i<=$('#fly_passenger_1 option').size();i++) {
		var p = parseInt($('#fly_passenger_no_'+i).val());
		passengers += ( !isNaN(p) && p != 'undefined' ) ? p : 0;
	}

	if (passengers == 0) return F_SF_ERROR_MinPassangersViolation;
	if (passengers > 9) return F_SF_ERROR_MaxPassangersExceeded;

	var passengers_adults = 0;
	$('select[id^="fly_passenger"].passenger-type').each(function(){
		var id = parseInt($(this).val());
		if(id==1||id==3) {
			passengers_adults += parseInt($(this).siblings('select[id^="fly_passenger_no"]').val());
		}
	});

	if (passengers_adults == 0) return F_SF_ERROR_MinPassangersAdultsViolation;

	var passengers_infants = 0;
	$('select[id^="fly_passenger"].passenger-type').each(function(){
		var id = parseInt($(this).val());
		if(id==4) {
			passengers_infants += parseInt($(this).siblings('select[id^="fly_passenger_no"]').val());
		}
	});

	if (passengers_infants > passengers_adults) return F_SF_ERROR_ToManyInfants;

	return true;
}
/**
 * Checks if passengers are valid (F-QSF)
 */
var isPassangerFQSF = function(object){

	var passengers = 0;
	for(i=1;i<=4;i++) {
		var p = parseInt($('#fly_passenger_no_'+i).val());
		passengers += ( !isNaN(p) && p != 'undefined' ) ? p : 0;
	}

	if (passengers == 0) return F_SF_ERROR_MinPassangersViolation;
	if (passengers > 9) return F_SF_ERROR_MaxPassangersExceeded;

	var passengers_adults = parseInt($('#fly_passenger_no_1').val()) + parseInt($('#fly_passenger_no_3').val());
	if (passengers_adults == 0) return F_SF_ERROR_MinPassangersAdultsViolation;

	//return isInfant(object);
	return true;
}
var notEmpty = function(object){
	return /^.+$/i.test(object.val());
}
var isInfant = function(object){
	var passengers_adults = parseInt($('#fly_passenger_no_1').val()) + parseInt($('#fly_passenger_no_3').val());
	var passengers_infants = parseInt($('#fly_passenger_no_4').val());
	if (passengers_infants > passengers_adults) return F_SF_ERROR_ToManyInfants;
	return true;
}
var isValidNameLatin = function(object){
	return /^[a-z]{3,64}$/i.test(object.val());
}
var isValidNamePassanger = function(object){
	return (/^[a-z]{3,64}$/i.test(object.val()) && /^[a-z]{3,64}$/i.test(object.next().val()));
}
var isValidName = function(object){
	return /^[_\w\-\. êó±¶³¿¼æñ]{3,64}$/i.test(object.val());
}
var isValidStreet = function(object){
	return /^[_\w\-\. êó±¶³¿¼æñ]{3,64}$/i.test(object.val());
}
var isValidStreetNo = function(dumy,f1,f2){
	var no1 = $(f1).val();
	var no2 = $(f2).val();
	if($.trim(no1)=='')	return false;
	if(!/^\w{1,5}$/i.test(no1)) return false;
	if(!/^\w{0,5}$/i.test(no2)) return false;
	return true;
}
var isValidStrretNoPayer = function(object,f1,f2){
	return isValidStreetNo(object,'#payer_streetno','#payer_streetno2');
}
var isValidStrretNoInvoice = function(object,f1,f2){
	return isValidStreetNo(object,'#fly_invoice_streetno','#fly_invoice_streetno2');
}
var isValidZipCode = function(object,f1,f2){
	return /^\d{2}-\d{3}$/.test($(f1).val()+'-'+$(f2).val());
}
/*
var isValidZipCodePayer = function(object){
	return isValidZipCode(object,'#payer_code1','#payer_code2');
}
var isValidZipCodeInvoice = function(object){
	return isValidZipCode(object,'#fly_invoice_code1','#fly_invoice_code2');
}
*/
var isValidZipCodePayer = function(object){
	return ($('#payer_country').val() != 'PL') ? /^.+$/.test(object.val()) : /^\d{2}-\d{3}$/.test(object.val());
}
var isValidZipCodeInvoice = function(object){
	return ($('#fly_invoice_country').val() != 'PL') ? /^.+$/.test(object.val()) : /^\d{2}-\d{3}$/.test(object.val());
}
var isValidPhone = function(object){
	return /^\+?[0-9 -]+$/i.test(object.val());
}
var isValidMobilePhone = function(object){
	return /^(\+?[0-9 -]+)?$/i.test(object.val());
}
var isValidEmail = function(object){
	return /^([_\w\-]+\.?[_\w\-]+)+@([_\w\-]+\.?[_\w\-]+)+\.[a-z]{2,4}$/i.test(object.val());
}
var isValidEmailCheck = function(object){
	return (object.val()==$('#payer_email').val());
}
var isValidNIP = function(object){
	if ($('#fly_invoice_country').val() != 'PL') {
		return true;
	} // Don't check NIP when selected country is different then Poland
	var nip = $.trim(object.val());
	if(!/^\d{10}$/.test(nip)) return F_OF_ERROR_BadNIPLenghtOrFormat;
	var ratio = new Array(6,5,7,2,3,4,5,6,7);
	var checksum = 0;
	for(i=0;i<9;i++) {
		checksum += parseInt(nip.substring(i,(i+1))*ratio[i]);
	}
	if((checksum%11)!=nip.substring(9,10)) return F_OF_ERROR_BadNIPChecksum;
	return true;
}
var isValidVisa = function(cc){
	return /^4(\d{12}|\d{15})$/.test(cc);
}
var isValidVisaE = function(cc){
	return /^4((917|913|508|844)\d{12}|17500\d{10})$/.test(cc);
}
var isValidMC = function(cc){
	return /^5[1-5]\d{14}$/.test(cc);
}
var isValidAmEx = function(cc){
	return /^(34|34)\d{13}$/.test(cc);
}
var isValidDinersClub = function(cc){
	return /^(36\d{12}|55\d{14})$/.test(cc);
}
var isValidCC = function(object){
	var cc = $.trim(object.val());
	switch(parseInt($('#payment_card_cc_type').val())){
		case 1: //VISA
			if(!isValidVisa(cc)) return F_PF_ERROR_BadCCFormat;
		break;
		case 4: //VISA Electron
			if(!isValidVisaE(cc)) return F_PF_ERROR_BadCCFormat;
		break;
		case 2: //MasterCard
			if(!isValidMC(cc)) return F_PF_ERROR_BadCCFormat;
		break;
		case 3: //AmericanExpress
			if(!isValidAmEx(cc)) return F_PF_ERROR_BadCCFormat;
		break;
		case 5: //DinersClub
			if(!isValidDinersClub(cc)) return F_PF_ERROR_BadCCFormat;
		break;
	}
	if(!Luhn(cc)) return F_PF_ERROR_BadCCChecksum;
	return true;
}
var isValidCVV = function(object){
	var cvv = $.trim(object.val());
	switch(parseInt($('#payment_card_cc_type').val())){
		case 3: //AmericanExpress
			if(!/^\d{4}$/.test(cvv)) return false;
		break;
		default:
			if(!/^\d{3}$/.test(cvv)) return false;
		break;
	}
	return true;
}
var isValidCCDate = function(object){
	var m = parseInt($('#payment_card_cc_month').val())-1;
	var y = parseInt($('#payment_card_cc_year').val());

	var today = new Date();

	var selected = new Date();
	selected.zeroTime();

	selected.setFullYear(y);
	selected.setMonth(m);
	selected.setDate(selected.getDaysInMonth());

	return (today < selected);
}
var isNumeric = function(object){
	var num = object.val();
	var reg = object.attr('rel');
	var reg = reg.split('_');

	if( parseInt(num.length) == 0) {
		return true;
	}
	if ( parseInt(num.length) == parseInt(reg[1])) {
		return /^\d+$/.test(num);
	} else {
		return F_OF_ERROR_FFNumbers + reg[1];
	}
}
var checkbox = function(object){
	return (object.is(':checked'));
}


/* ---------- VALIDATION SETS ---------- */
var qsf_settings = {
	'#fly_from_0,#fly_to_0' : {'validator':isValidCity,'error':F_SF_ERROR_BadCityName},
	'#fly_from_date_0,#fly_to_date_0': {'validator': isValidDateFQSF},
	//'fly_passenger' : {'validator':isPassangerFQSF,'label':'#qsf-passengers legend'}
	'#fly_passenger_no_1,#fly_passenger_no_2,#fly_passenger_no_3' : {'validator':isPassangerFQSF,'label':'label[for="fly_passenger_no_1"]'},
	'#fly_passenger_no_4' : {'validator':isInfant}
};
var promo_qsf_settings = {
		'#fly_to_0' : {'validator':isValidCity,'error':F_SF_ERROR_BadCityName},
		'#fly_from_date_0,#fly_to_date_0': {'validator': isValidDateFQSF},
		//'fly_passenger' : {'validator':isPassangerFQSF,'label':'#qsf-passengers legend'}
		'#fly_passenger_no_1,#fly_passenger_no_2,#fly_passenger_no_3' : {'validator':isPassangerFQSF,'label':'label[for="fly_passenger_no_1"]'},
		'#fly_passenger_no_4' : {'validator':isInfant}
};


var hotels_qsf_settings = {
	'#hotel_city' : {'validator':isValidCity,'error':F_SF_ERROR_BadCityNameHotel},
	'#hotel_checkin_date,#hotel_checkout_date': {'validator': isValidDateHotel,'error':F_SF_ERROR_BadDateFormat}
};


/* ---------- DESTINATOR FUNCTIONS ----------- */
var closeDestinator = function() {
	try {
		$('#destinator').remove();
	}catch(e){void(e);}
}
var setDestination = function(target, value) {
	$('#' + target).attr('value', value).unbind('focus').removeClass('virgin');
	closeDestinator();
}


/* ---------- JQUERY EXTENSIONS ---------- */
jQuery.fn.extend({
	/*
	 * FIELD DUPLICATION UTILITIES
	 */
	fieldNumberControl: function(o,i) {
		$this = $(this);
		for(f in o) {
			$(f,$this).each(function(){
				var attr = o[f].split(',');
				for (a in attr) {
					if (typeof $(this).attr(attr[a]) != 'undefined') {
						var attrFullName = $(this).attr(attr[a]);
						var attrName = splitValue(attrFullName)
						$(this).attr(attr[a], (attrName.name == null) ? parseInt(attrName.id) + i : attrName.name + parseInt(parseInt(attrName.id) + i));
						//$(this).attr(attr[a], attrName.name + parseInt(attrName.id + i));
					}
				}
			});
		}
		return $this;
	},
	fieldReset: function(o) {
		$this = $(this);
		var fields = o.split(',');
		for(f in fields) {
			switch(fields[f]) {
				case 'input':
				case 'select':
					$(fields[f],$this).val('');
				break;
				case 'label':
					$(fields[f],$this).text('').removeClass(cl_Error);
				break;
			}
		}
		return $this;
	},
	/*
	 * VALIDATION EXTENSIONS
	 */
	getLabel: function(label){
		var o = $(this);
		if (label && $(label).size()>0){
			return $(label);
		} else if ($('label[for="'+o.attr('id')+'"]').size()>0) {
			return $('label[for="'+o.attr('id')+'"]');
		} else if (o.prevAll('label:first').size()>0) {
			return o.prevAll('label:first');
		} else {
			return o;
		}
	},
	toggleError: function(test){
		var o = $(this);
		var l = o.getLabel(test.label);

		test_result = test.validator(o);
		if( ( test_result == false || test_result.length > 0 ) && l.not($('.'+cl_OmitError)).size() > 0 ){
			var error_msg = (test_result.length > 0) ? test_result : test.error
			l.removeClass(cl_OK);
			l.addClass(cl_Error).attr('title',error_msg);
		} else {
			l.removeClass(cl_Error).removeAttr('title');
			l.addClass(cl_OK);
		}
	},
	checkInput: function(options,bind){
		$this = $(this);
		$this.each(function(){
			if(bind){
				switch($(this).attr('type'))
				{
					case 'text':
						$(this).keyup(function(){ $(this).toggleError(options); });
						break;
					default:
						$(this).change(function(){ $(this).toggleError(options); });
						break;
				}
				$(this).blur(function(){ $(this).toggleError(options); });
			}else{
				$(this).toggleError(options);
			}
		});
	},
	attachValidation: function(name,options,bind) {
		switch(name.substring(0,1)){
			case '#':
			case '.':
				$(name+':enabled').checkInput(options, bind);
				break;
			default:
				$('textarea[id^="' + name + '"]:enabled').checkInput(options, bind);
				$('input[type="text"][id^="' + name + '"]:enabled').checkInput(options, bind);
				$('select[id^="' + name + '"]:enabled').checkInput(options, bind);
				break;
		}
	},
	checkAll: function(options,bind) {
		if($(this).size()==0) return $(this);

		for(o in options) {
			var filelds = o.split(',');
			for (f in filelds) {
				range = splitValue(filelds[f]);
				if (range.array == false) {
					this.attachValidation(filelds[f],options[o], bind);
				} else {
					for(r=range.id[0];r<=range.id[1];r++) {
						this.attachValidation(range.name + r,options[o], bind);
					}
				}
			}
		}
		return $(this);
	},
	saveQuery: function(formId){
		var cookieId = (formId) ? formId : $(this).attr('id');
		var queryString = cookieId;
		$('input[type="text"],input[type="hidden"].hidden,select,input[type="radio"]:checked,input[type="checkbox"]:checked',$(this))
		.not(':disabled').each(function(){
			var val = $(this).val();
			if (typeof val != 'undefined' && val != '') {
				queryString += '|' + $(this).attr('type') + ':' + $(this).attr('name') + '=' + val;
			}
		});
		createCookie(cookieId,queryString,7);
	},
	loadQuery: function(formId){
		var cookieId = (formId) ? formId : $(this).attr('id');
		var cookie = readCookie(cookieId);
		if (cookie) {
			var fields = cookie.split('|');
			for (i in fields) {
				var a = fields[i].split(':'); if(a[1]) var b = a[1].split('='); else continue;
				switch(a[0]) {
					case 'radio':
					case 'checkbox':
					if($('*[@name=' + b[0] + '][@value=' + b[1] + ']', $(this)).get(0)) $('*[@name=' + b[0] + '][@value=' + b[1] + ']', $(this)).get(0).checked = true;
					break;
					default:
					$('*[@name=' + b[0] + ']', $(this)).val(b[1]).removeClass('virgin');
					break;
				}
			}
		}
	},
	checkForm: function(options,errorbox,memorizeFormFields,onlyFirstError){
		if(memorizeFormFields) $(this).loadQuery(memorizeFormFields);
		$(this).submit(function(){
			$(this).checkAll(options);
			if (onlyFirstError) {
				var n_Error = $('*[class*="' + cl_Error + '"]:first', $(this)).filter(function(index){
					// Don't check fields which are not visible
					return ($(this).parents(":hidden").size() == 0 && $(this).is(':visible') );
				});
			}
			else {
				var n_Error = $('*[class*="' + cl_Error + '"]', $(this)).filter(function(index){
					// Don't check fields which are not visible
					return ($(this).parents(":hidden").size() == 0 && $(this).is(':visible') );
				});
			}
			if(n_Error.size()>0){
				if(errorbox) errorbox(n_Error,options);
				return false;
			}else{
				if(memorizeFormFields) $(this).saveQuery(memorizeFormFields);
				return true;
			}
		});
	},
	/*
	 * CITY SELECTOR
	 */
/*	citySelector: function() {
		$(this).each(function(){
			$this = $(this);

			var url = $this.attr('href');
			var title = $this.attr('title');
			var scrolling = ($.browser.msie) ? 'no' : 'auto';

			$this.unbind().click(function(){
				closeCitySelector();
				var c = $(this).siblings('.ac_input').offset();
				$('body')
				.append(
					$('<div></div>')
						.attr('id','esky_cities')
						.css({
							'position':'absolute',
							'top':c.top + $(this).prev().height()+8,
							'left':c.left
						})//css
						.append(
							$('<h3></h3>')
								.text(title)
								.append($('<a></a>')
									.attr('href','javascript:void(0);')
									.text(TXT_CLOSE)
									.click(closeCitySelector)
								)
						)
						.append(
							$('<iframe>')
								.attr('src',url)
								.attr('width',300)
								.attr('height',300)
								.attr('frameborder',0)
								.attr('scrolling',scrolling)
								.attr('marginwidth',0)
								.attr('marginheight',0)
								.attr('allowTransparency','true')
								.css({
									'border':'none',

									'background':'transparent'
								})
						)
						.bgIframe()
				);//append
				return false;
			}); //onclick
		}); //each
	},*/
	/*
	 * DESTINATOR - select destination from flash map
	 */
	destinator: function() {
		if ($('#destinator').size() > 0) {
			closeDestinator();
			return false;
		}

		var $this = $(this);
		var input = $('#' + $this.attr('rel'));
		var xy = input.offset();

		$('body').append(
			$('<div></div>')
			.attr('id', 'destinator')
			.css({top: xy.top + input.height() + 8, left: xy.left})
			.append(
				$('<div></div>')
				.attr('id', 'destinatorContent')
			)
		);
		swfobject.embedSWF("http://www.esky.pl/swf/destinator.swf", "destinatorContent", "750", "500", "9.0.0", "", {input:$this.attr('rel')});
	}	
});

/* ---------- ACTIONS ---------- */
$(document).ready(function(){

	$('#tab_qsfFlights')
		.find('#fly_from_0').val(txt_pick_flight_destination).end()
		.find('#fly_to_0').val(txt_pick_flight_destination).end();
	$('#hotel_city').val(txt_pick_hotel_destination);

	$('a.external').attr({target: "_blank"});

	/**
	 * Enable Flights ASF Validation
	 * Remove checkAll(asf,true) to disable live evaluation - it's not very usefull with multiple flights
	 * $('#flight-asf').checkAll(asf_settings,true).checkForm(asf_settings,errorBox,true);
	 */
	//$('#flight-asf').checkForm(asf_settings,errorBoxStickers,false,true);
	/**
	 * Enable Flights QSF Validation
	 * Remove checkAll(asf,true) to disable live evaluation - it's not very usefull with multiple flights
	 * $('#flight-qsf').checkAll(qsf_settings,true).checkForm(qsf_settings,errorBoxLayer);
	 */
	$('#tab_qsfFlights').checkForm(qsf_settings,errorBoxStickers,true);
	$('#promo_qsfFlights').checkForm(promo_qsf_settings,errorBoxStickers,false);







	/**
	 *  Flights QSF
	 */
	flyTripControlQSF();
	$('input[type=radio]','#tab_qsfFlights').click(flyTripControlQSF);

	var hash_raw = window.location.hash;
	var hash = (hash_raw) ? hash_raw.substr(1,parseInt(hash_raw.length)) : 'qsfFlights';

	$('#qsf-tabs li a').each(function(){
		$(this).click(function(){
			closeDestinator();
			$('#esky_calendar').remove();
			$('#qsf-tabs li a').removeClass('selected');
			$(this).addClass('selected');
			$('.qsfBox').hide();

			var rel = $(this).attr('rel');
			$('#tab_'+rel).show();

			return false;
		});
	});

















	/*
	 * HOTELS
	 */

	$.esky_calender_translate = {
		'OutGreaterThenReturn' : H_SF_ERROR_OutDateIsGraterThenReturnDate,
		'OutDateToClose' : H_SF_ERROR_OutDateToCloseToCurrentDate,
		'DateOutOfRange' : H_SF_ERROR_DateOutOfRange
	};
	$('a.pop-calendar','#tab_qsfHotels').unbind().not('.btn-calendar-disabled').click(function(){
		var o = $(this);
		var l = $('#'+o.attr('rev')).val();
		o.esky_calendar({thisInput:o.attr('rel'),linkedInput:o.attr('rev'),loop:2,inBlock:new Date(new Date.fromString(l)).zeroTime().addDays(31)});
		return false;
	});
	$('#hotel_checkin_date,#hotel_checkout_date').click(function(){
		var o = $(this);
		var l = $('#'+o.attr('rev')).val();
		o.esky_calendar({thisInput:o.attr('rel'),linkedInput:o.attr('rev'),loop:2,inBlock:new Date(new Date.fromString(l)).zeroTime().addDays(31)});
	});

	/**
	 *  Hotels ASF
	 */
	$('#tab_qsfHotels').checkForm(hotels_qsf_settings,errorBoxStickers,true);



	//$('.rooms,.rooms-no').fieldReset('select');
	$('#number-of-rooms').change(hotelRoomsControl).each(hotelRoomsControl);
	$('#hotel_city').autocomplete(ibeConfig.cityAutocomplete,{
		delay: 300,
		minChars: 3,
		matchSubset: 1,
		matchContains: 1,
		cacheLength: 10,
		autoFill: false,
		maxItemsToShow: 15,
		formatItem: formatItemHotel
	})

	$('#hotel_nights').change(calculateCheckoutDate);
	$('#hotel_checkin_date').blur(calculateCheckoutDate);
	$('#hotel_checkout_date').blur(calculateCheckoutDate('hotel_checkout_date'));



	$('input.virgin').one('focus',function(){
		$(this).val('').removeClass('virgin');
	});
	
	$('a.btn-city').unbind().click(function(){
		var $this = $(this);
		$this.destinator();
		return false;
	});

	$('#fly_from_0,#fly_to_0').focus(function(){
		closeDestinator();
	})

});
