(function( $ ) {
	$.widget("ui.qsf", {
		options: {
			qsfType: 'horizontal',
			psgrsMax : 9,
			agentUrl : 'https://www.travelstoremaker.com/ibe/sambookia/',
			displayLevel: 'advanced',
			useAnalyticsTracker: true,
			acLang: 'ru',
			advancePurchase: 0,
			advancePurchaseTypes : {
				flight:1,
				hotel:1,
				flHl:1,
				car:1,
				flCar:1
			},
			minResPeriod : {
				flight:3,
				hotels:3,
				car:3,
				flHl:3,
				flCar:3
			},
			useAirSuggestions: true,
			useHotelSuggestions: true,
			useCarSuggestions: true,
			hotelProviders: [],
			showToolTips: true
		},
		_create: function(){
			this.option( this.options );
			var self = this,
				o = this.options,
				qsf = this.widget();
			var tabsEl = qsf.find('div[id^=tab]');
			var formUrl = "https://www.sambookia.com/reservation/";
			self._createTabs(qsf);
			self._fixRoundCorners(qsf);
			tabsEl.each(function(index, tab){
				var $tab = $(tab);
				var tabId = $tab.attr('id');
				var $form = $('form', $tab);
				var $advSearchLink = $('a.advanced-search-link', $tab);
				var advSearchLinkHref = "#";
				var $retDateTimeSelectors = $tab.find('#retDateTimeSelectors');
				var minReservation = 0;
				o.advancePurchase = 0;
				
				$form.attr('action', formUrl);
				if('simple' == o.displayLevel) {
					$tab.find('.advanced').hide();
					$tab.find('.full').hide();
				} else if('advanced' == o.displayLevel) {
					$tab.find('.full').hide();
				}
				self._selectMenuBeautifier($tab);
				
				
				if(tabId == 'tabFlights') {
					minReservation = o.minResPeriod.flight;
					o.advancePurchase = o.advancePurchaseTypes.flight;
					if(o.useAirSuggestions) {
						self._initAirAc($tab);
					}
					advSearchLinkHref = "porch/?command=flights&agentid=sambookia&show_adv_search=1&loclanguage=ru";
					$tab.find("select[name='triptype']").change(function(event) {
						if('ONEWAY' == event.target.value) {
							$retDateTimeSelectors.hide();
						} else if('MULTIPLE' == event.target.value) {
							location=formUrl + "porch/?command=flights&agentid=sambookia&do_multiprefs=yes&externalprefs=y&loclanguage=ru&show_adv_search=1";
                        }
                        else {
							$retDateTimeSelectors.show();
						}
					});
				}				
				if(tabId == 'tabFlightsHotel') {
					o.advancePurchase = o.advancePurchaseTypes.flHl;
					minReservation = o.minResPeriod.flHl;
					if(o.useAirSuggestions) {
						self._initAirAc($tab);
					}
					advSearchLinkHref = "porch/?command=dynpkgs&agentid=sambookia&show_adv_search=1&loclanguage=ru";
				}
				
				if(tabId == 'tabFlightsCar') {
					o.advancePurchase = o.advancePurchaseTypes.flCar;
					minReservation = o.minResPeriod.flCar;
					if(o.useAirSuggestions) {
						self._initAirAc($tab);
					}
					advSearchLinkHref = "porch/?command=dynpkgs&subcommand=flights&subcommand=cars&agentid=sambookia&show_adv_search=1&loclanguage=ru";
				}
				
				if(tabId == 'tabHotels') {
					o.advancePurchase = o.advancePurchaseTypes.hotel;
					minReservation = o.minResPeriod.hotels;
					if(o.useHotelSuggestions) {
						self._initHotelAc($tab);
					}
					advSearchLinkHref = "porch/?command=hotels&agentid=sambookia&show_adv_search=1&loclanguage=ru";
				}

				if(tabId == 'tabCars') {
					o.advancePurchase = o.advancePurchaseTypes.car;
					minReservation = o.minResPeriod.car;
					if(o.useCarSuggestions) {
						self._initCarAc($tab);
					}
					advSearchLinkHref = "porch/?command=cars&agentid=sambookia&show_adv_search=1&loclanguage=ru";
				}
				
			
				
			
				$advSearchLink.attr("href", (formUrl + advSearchLinkHref));

				self._initDatePickerField($tab, minReservation);

				if(o.showToolTips){
					self._addTooltips($tab);
				}

				if(tabId != 'tabHotels' && tabId != 'tabCars') {
					self._initPassengersCountCheck($tab);
				}

				//if(tabId == 'tabFlights' && o.useAnalyticsTracker){
					self._addTrackerParamsField($form);
					self._addRegularTracker($form);
				//}
			});
		},

		_init: function(){

			var self = this,
			o = this.options,
			qsf = this.widget();

			var tabsEl = qsf.find('div[id^=tab]');

			tabsEl.each(function(index, tab){
				var $tab = $(tab);
				var tabId = $tab.attr('id');
				var form = $tab.find('form:first');

				switch(tabId){
					case 'tabFlights':
						self._addOnSubmit(form);
						self._addFlightsValidation(form, self._errorMsgs.flights);
						break;
					
					case 'tabHotels':
						self._addHotelsValidation(form, self._errorMsgs.hotels);
						break;
					
					case 'tabCars':
						self._addCarsValidation(form, self._errorMsgs.cars);
						break;
					
					case 'tabFlightsHotel':
						self._addOnSubmit(form);
						self._addFlightsHotelsValidation(form, self._errorMsgs.flights);
						break;
					
					case 'tabFlightsCar':
						self._addFlightsCarsValidation(form, self._errorMsgs.flightscars)
						break;
					
					case 'tabFlightHotelCar':
						break;
						
				}
			});
		},
		_errorMsgs: {
			hotels: {
				invalidPickUpCity: "Не выбран город/аэропорт.\n",
				invalidPickUpDate: "Вы выбрали недействительную дату заезда.\n",
				invalidDropOffDate: "Вы выбрали недействительную дату выезда.\n",
				invalidPickUpMore11: "Дата заезда не может быть позднее 11 месяцев от текущего момента.\n",
				invalidDropOffMore11: "Дата выезда не может быть позднее 11 месяцев от текущего момента.\n",
				invalidDropOffBeforePickUp: "Дата обратного перелета должна быть позднее.\n",
				invalidSelectRoom: "Пожалуйста, выберите тип номера.\n",
				invalidRoomFirst: "Пожалуйста, укажите кол-во номеров!\n",
				invalidGeonameId: "Мы не можем предложить отели в этом районе. Пожалуйста, выберите местоположение из списка.\n"
			},
			cars: {
				invalidPickUpCity: "Вы выбрали несуществующий город/аэропорт .\n",
				invalidPickUpDate: "Вы выбрали недействительную дату получения автомобиля.",
				invalidDropOffDate: "Вы выбрали недействительную дату возврата автомобиля.\n",
				invalidPickUpMore11: "Дата получения автомобиля не может быть позже, чем 11 месяцев с этого момента.\n",
				invalidDropOffMore11: "Дата возврата автомобиля не может быть позже, чем 11 месяцев с этого момента.\n",
				invalidDropOffBeforePickUp: "Дата получения автомобиля должна предшествовать дате возврата.\n"
			},
			flights : {
				invalidPickUpCity: "Не указан город вылета. Пожалуйста, укажите город или аэропорт. \n",
				invalidDropOffCity: "Не указан город прилета. Пожалуйста, укажите город или аэропорт. \n",
				invalidDropOffBeforePickUp: "Дата обратного перелета должна быть позднее даты вылета \n",
				invalidPickUpMore11: "Дата вылета должна быть не позднее 11 месяцев от текущего момента. \n",
				invalidDropOffMore11: "Дата возврата должна быть не позднее 11 месяцев от текущего момента. \n",
				invalidTripType: "Выберите тип поездки.\n"
			},
			flightscars: {
				invalidPickUpCity: "Не указан город вылета. Пожалуйста, укажите город или аэропорт.\n",
				invalidDropOffCity: "Не указан город прилета. Пожалуйста, укажите город или аэропорт. \n",
				invalidPickUpDate: "Вы выбрали недействительную дату получения автомобиля.",
				invalidDropOffDate: "Вы выбрали недействительную дату возврата автомобиля.\n",
				invalidPickUpMore11: "Дата получения автомобиля не может быть позже, чем 11 месяцев с этого момента.\n",
				invalidDropOffMore11: "Дата возврата автомобиля не может быть позже, чем 11 месяцев с этого момента.\n",
				invalidDropOffBeforePickUp: "Дата получения автомобиля должна предшествовать дате возврата.\n"
			}
		},
		/**
		 * @param jQueryDomObj A collection with input elements
		 * @param Function Provides advanced markup for an item
		 * @param Function 
		 * @param Function Extra parameters for the backend.
		 * @param Function Handle the result of a search event.
		 * @param Object A collection with addtional events
		 * @param Boolean Activates and deactivates autofill option
		 */
		_initAc: function(acFields, formatItemFunc, parseFunc, 
							extraParamsObj, resultFunc, events, autofill) {
			var o = this.options,
				self = this;
			var fieldName;
			var url;
			if(extraParamsObj.type=='air') {
				url = o.agentUrl + 'airsearchlocation';
			}
			if(extraParamsObj.type=='hotel') {
				url = o.agentUrl + 'hotsearchlocation';
			}

			acFields.autocomplete(url, {
				autoFill: (autofill)?true:false,
				scroll: false,
				clearCustomInput: false,
				delay: 15,
				width: 280,
				max:10,
				minChars: 2,
				formatItem: formatItemFunc,
				parse: parseFunc,
				extraParams: extraParamsObj,
				dataType: 'jsonp',
				resultsClass: "ui-autocomplete ui-menu ui-widget ui-widget-content ui-corner-all"
			} )
			.result( function(e, item, formated, check){
				self._putTxtCursorBeforeTextIE(this);
				resultFunc(e, item, formated, check);
			} );
			
			if(events){
				$.each(events, function (eventName, action){
					acFields.bind(eventName, action);
				});
			}
		},
		
		_initAirAc: function ($tab){
			var self = this,
				o = this.options;
			var toSendFields = $tab.find('#fromcityH, #tocityH');
			var acFields = $tab.find('#fromcityAc, #tocityAc');
			
			var formatItem = function (data, i, n, value) {
				return data.displayname;
			};
			
			var parse = function (data) {
				return $.map(data, function(row) {
					return {
						data:  row,
						value: row.displayname,
						result:row.displayname
					};
				} );
			};

			var extraParams = {'lang' : o.acLang, 'type' : 'air'}

			var resultFunc = function(e, item, formated, check) {
				if('fromcityAc' == e.target.id) {
					$tab.find('#fromcityH').val(item.code);
					$tab.find('#from_iata_code_is_used').val('Y');
					$tab.find('#from_iata_code_is_used').attr('name', 'from_iata_code_is_used');
					
				} else if('tocityAc' == e.target.id) {
					$tab.find('#tocityH').val(item.code);
					$tab.find('#to_iata_code_is_used').val('Y');
					$tab.find('#to_iata_code_is_used').attr('name', 'to_iata_code_is_used');
				}
			};
			self._initAc(acFields, formatItem, parse, extraParams, resultFunc);
		},
		
		_initHotelAc: function($tab){
			var self = this,
				o = this.options;

			var geoname_id = self._addGeonameIdHotelField($tab.find('form:first'));
			var formatItem = function (data, i, n, value){
				return data.name+((data.area_name)?', '+data.area_name:'')
					+', '+((data.country)? data.country : data.countrycode)
				};
			
			var parse = function(data) {
				return $.map(data, function(row) {	
					return {
						data: row,
						value: row.name,
						result:row.name+((row.area_name)?', '+row.area_name:'')+', '
								+((row.country)? row.country : row.countrycode)
					}
				} );
			  };
			  
			var extraParams = {'lang' : o.acLang, provider: o.hotelProviders,'type' : 'hotel'}
			
			var resultFunc = function(e, item, formated, check){
				geoname_id.val(item.geoname_id);
			};

			var acFields = $tab.find('#hotcity');
			var keyUpFunc = function(evt, request, settings){
				if((evt.keyCode>=48 && evt.keyCode<=90) || evt.keyCode== 0){
					geoname_id.val("");
				}
				
				if(evt.keyCode == 8){
					if(!this.value.length){
						geoname_id.val("");
					}
				}
			}
			var blurFunc = function(){
				if(!geoname_id.val()){
					this.value = '';
				}
			}
			var events = {
					'keyup': keyUpFunc,
					'blur' : blurFunc
			};
			self._initAc(acFields, formatItem, parse, extraParams, resultFunc, events, true);
		},
		_initCarAc: function ($tab) {
			var self = this,
				o = this.options;
			var toSendFields = $tab.find('#pupcityH');
			var acFields = $tab.find('#pupcityAc');
			
			var formatItem = function (data, i, n, value) {
				return data.displayname;
			};
			
			var parse = function (data) {
				return $.map(data, function(row) {
					return {
						data:  row,
						value: row.displayname,
						result:row.displayname
					};
				} );
			};

			var extraParams = {'lang' : o.acLang, 'type' : 'air'}

			var resultFunc = function(e, item, formated, check) {
				if('pupcityAc' == e.target.id) {
					$tab.find('#pupcityH').val(item.code);
					$tab.find('#from_iata_code_is_used').val('Y');
					$tab.find('#from_iata_code_is_used').attr('name', 'from_iata_code_is_used');
					
				}
			};
			self._initAc(acFields, formatItem, parse, extraParams, resultFunc);
		},
		_createTabs: function(qsfConteiner) {
			var self = this,
				tabs = qsfConteiner.tabs({
					select: function(event, ui) {
						var url = $.data(ui.tab, 'load.tabs');
						if( url ) {
							window.open(url);
							return false;
						}
						return true;
					}
				});
			
			if(self.options.qsfType == 'vertical'){
				var tabs_lenght = tabs.tabs('length');

				var tabs_ul;

				tabs_ul = tabs.find('ul:first');
				tabs_ul.addClass('qsf-tabs-nav');
				tabs_ul.find('li:lt('+(tabs_lenght-1)+')').addClass('qsf-two-columns-tabs');

				if(tabs_lenght%2){
					tabs_ul.find('li:last').width('98%');		  
				}
			}
			
			self._addCustomTabsSelectIvents(tabs);
		},
		 _elevenMonthsPeriod: function (dateObj) {
			var tmpDate = new Date();
			tmpDate.setMonth(tmpDate.getMonth() + 11);
			return (dateObj < tmpDate);
		},

		 _exportToDateObject: function(form, dateInput) {
			var o = this.options;
			var dateForm = form.find('input[id="' + dateInput + '"]').val().split('.');

			var day=dateForm[0],
			    month=dateForm[1],
			    year = dateForm[2];

			if (0 == month.indexOf('0')) {
				month = month.substr(1,2);
			}
			if (0 == day.indexOf('0')) {
				day = day.substr(1,2);
			}
			month = parseInt(month) - 1 ;
			day = parseInt(day);

			var advPurchDate = new Date();
			advPurchDate.setDate(advPurchDate.getDate() + o.advancePurchase);

			var date =  new Date();
			date.setFullYear(year, month, day)

			var currDate = new Date();
	
			if (day != date.getDate() || month != date.getMonth()) {
				return null;
			}
			else
			{
				if( (date < advPurchDate) && (date < currDate) ) {
					date.setFullYear(advPurchDate.getFullYear() + 1);
				}
				return date;
			}
		},

		_importFromDateObject: function() {
			var dateObj,
				dateInput,
				dayHidden,
				monthHidden;
			var jsMonth;

			if(arguments.length > 2){
				dateObj = arguments[2];
				dayHidden = arguments[0];
				monthHidden = arguments[1];
			}
			else{
				dateObj = arguments[1];
				dateInput = arguments[0];
			}

			//dateInput.val(dateObj.getDate());

			var day = dateObj.getDate(),
				month = dateObj.getMonth();
				year = dateObj.getFullYear();

				jsMonth = month;
				month = month+1;
				if(month<10){
					month = '0'+month;
				}
				if(day<10){
					day = '0'+day;
				}

				if(dateInput){
					dateInput.val(day+'.'+month+'.'+year);
				}
				else {
					dayHidden.value = day;
					monthHidden.value = jsMonth;
				}
		},
		_setDateInput: function (dateInput) {
			var self = this,
				o = this.options;
			var date = new Date();

			date.setDate(date.getDate() + o.advancePurchase);
			self._importFromDateObject($(dateInput[0]), date);

			date.setDate(date.getDate() + (o.advancePurchase + 2));
			self._importFromDateObject($(dateInput[1]), date);
		},
		_setDateSelectors: function (daySelectoName, monthSelectorName) {
			var self = this,
				o = this.options;
			var date = new Date();
			var outNameFields = 'dp_RetDayFH, dp_RetDayH, dp_doffdayC, dp_retdayFH';

			if(outNameFields.indexOf(daySelectoName.id, 0) != -1)
			{
			    date.setDate(date.getDate() + (o.advancePurchase + 3 ));
			}
			else 
			{
			date.setDate(date.getDate() + o.advancePurchase);
			}
			
			self._importFromDateObject(daySelectoName, monthSelectorName, date);
		},
		_initDatePickerField: function ($tab, minReservation) {
			var self = this,
				o = this.options;

			var dpPlaceHolders = $tab.find('input[id^=datepicker]');
			var ddDayMonthFields = $tab.find('input[id^="dp_"]');

			var retMon = $(ddDayMonthFields[2]),
				retDay = $(ddDayMonthFields[3]);
			var daysObjs = self._getDaysObjs();
			var k=0;
			dpPlaceHolders.each(function (i, element) {
				$(element).datepicker( {
					showAnim: false,
					inline: true,
					dateFormat: 'dd.mm.yy',
					minDate: new Date(),
					onSelect: function(dateText, inst) {
						var j = (dpPlaceHolders.index(inst.input))?2:0;
						ddDayMonthFields.get(j).value = inst.selectedMonth;
						ddDayMonthFields.get(j+1).value = inst.selectedDay;

						if(!i) {
							rDate = new Date();
							
							rDate.setFullYear(inst.selectedYear);
							rDate.setMonth(inst.selectedMonth, parseInt(inst.selectedDay) +  minReservation);

							retMon.val(rDate.getMonth());
							retDay.val(parseInt(rDate.getDate()));
							
							rday = String(retDay.val());
							rday = rday.length < 2 ? '0'+ rday : rday;
							
							rmon = String(parseInt(retMon.val()) + 1);
							rmon = rmon.length < 2 ? '0'+ rmon : rmon;
							v = rday+'.'+ rmon +'.'+rDate.getFullYear();
							$(dpPlaceHolders[1]).val(v);
						}
					}
				});
				$.datepicker.setDefaults($.datepicker.regional['ru']);
				self._setDateInput(dpPlaceHolders);
				self._setDateSelectors(ddDayMonthFields.get(k+1),
											 ddDayMonthFields.get(k));
				k+=2;
			});
			$tab.find('.ui-datepicker-trigger').addClass('ui-corner-all ui-icon');
		},
		_initPassengersCountCheck: function ($tabFlights) {

			var o = this.options;
			var numptcDropDown = $tabFlights.find("select[name^='numptc']");

			numptcDropDown.change(function(event) {
				var passengersNum = 0;
				numptcDropDown.find("option:selected").each(function(index, option) {
					passengersNum += parseInt($(option).val());
				});
				if (o.psgrsMax < passengersNum) {
					alert('Too many passengers. The maximum number is: '+ o.psgrsMax);
					$(event.target).val('0');
				}
			});
		},

		_addHotelsValidation: function(form, hotelErrorMsgs) {
			var self = this,
				o = this.options,
				qsf = this.widget();
			
			var rTypeOk;
			
			var roomNumsTypesHotel = form.find('#roomNumsTypesHotel');
			var roomTypes = self._getRoomTypes(roomNumsTypesHotel);
			var roomNums =  self._getRoomNums(roomNumsTypesHotel);
			
			form.submit(function(event){			
				var errorMsg = self._addFormValidationDefRulls(form, 'hotcity', 'datepicker_cinH', 
						'datepicker_cotH', hotelErrorMsgs);
				roomTypes.each(function(i, roomType){
					if(roomType.value != ''){
						rTypeOk = 'ok';
					}
				});
				
				if(rTypeOk != 'ok'){
					errorMsg += hotelErrorMsgs.invalidSelectRoom;
				}
				
				if(o.useHotelSuggestions && !form.find('#geonameid').val()){
					errorMsg += hotelErrorMsgs.invalidGeonameId;
				}
				
				if (errorMsg != "") {
					alert(errorMsg);
					return false;
				}
				else {
					return true;
				}
			});
			roomTypes.change(function(){
				var index = roomTypes.index(this);
				var numSelector = roomNums.eq(index);
				var num_rooms = parseInt(numSelector.val());
				
				if(!num_rooms){
					if($(this).val() != ""){
						alert(hotelErrorMsgs.invalidRoomFirst);
						numSelector.focus();
					}
				}
			});
		},
		_getRoomTypes: function(parent){
			return parent
			.find("select[name^='roomtype']:not([name^='roomtypenum'])");
		},
		
		_getRoomNums: function(parent){
			return parent
			.find("select[name^='roomtypenum']");
		},
		
		_addCarsValidation: function(form, hotelErrorMsgs){
			var self = this;
			
			form.submit(function(event) {
				var errorMsg = self._addFormValidationDefRulls(form, 'pupcity', 'datepicker_pup', 
						'datepicker_doff', hotelErrorMsgs);

				if (errorMsg != "") {
					alert(errorMsg);
					return false;
				}
				else {
					return true;
				}
			});
		},
		
		_addFlightsValidation: function(form, flightsErrorMsgs) {
			var self = this;
			
			form.submit(function(event) {

				var errorMsg = self._addFormValidationDefRulls(form, 'fromcity', 'datepicker_arr', 
						'datepicker_dep', flightsErrorMsgs);
				
				if(form.find('input[name="tocity"]').val() == "") {
					errorMsg+=flightsErrorMsgs.invalidDropOffCity;
				}

				if(form.find('select[name="triptype"]').val() == "") {
					errorMsg+=flightsErrorMsgs.invalidTripType;
				}
				if (errorMsg != "") {
					alert(errorMsg);
					return false;
				}
				else {
					return true;
				}
			});
		},
		
		_addFlightsCarsValidation: function(form, flightcarsErrorMsgs){
			var self = this;

			form.submit(function(event) {
				var errorMsg = self._addFormValidationDefRulls(form, 'fromcity', 'outday', 
									'outmonth', 'retday', 'retmonth', flightcarsErrorMsgs);
				
				if(form.find('input[name="tocity"]').val() == "") {
					errorMsg+=flightcarsErrorMsgs.invalidDropOffCity;
				}

				if (errorMsg != "") {
					alert(errorMsg);
					return false;
				}
				else {
					return true;
				}
			});
		},
		
		_addFlightsHotelsValidation: function(form, flightsErrorMsgs) {
			var self = this;
			
			form.submit(function(event) {

				var errorMsg = self._addFormValidationDefRulls(form, 'fromcity', 'datepicker_arr_fh', 
						'datepicker_ret_fh', flightsErrorMsgs);
				
				if(form.find('input[name="tocity"]').val() == "") {
					errorMsg+=flightsErrorMsgs.invalidDropOffCity;
				}

				if (errorMsg != "") {
					alert(errorMsg);
					return false;
				}
				else {
					return true;
				}
			});
		},

		_addFormValidationDefRulls: function(form, from, arrDate, deptDate, eMsgs){
			var self = this;
			var errorMsg = "";
			var from = form.find('input[name="'+from+'"]');
			
			if (from.val() == "") {
				errorMsg += eMsgs.invalidPickUpCity;
				from.focus();
			}

			var pupDate = self._exportToDateObject(form, arrDate);
			if (!pupDate) {
				errorMsg += eMsgs.invalidPickUpDate;
			}
			var doffDate = self._exportToDateObject(form, deptDate);
			
			if (!doffDate) {
				errorMsg += eMsgs.invalidDropOffDate;
			}
			if(pupDate && doffDate) {
				
				if (!self._elevenMonthsPeriod(pupDate)) {
					errorMsg += eMsgs.invalidPickUpMore11;
				}

				if (!self._elevenMonthsPeriod(doffDate)) {
					errorMsg += eMsgs.invalidDropOffMore11;
				}

				if (pupDate > doffDate) {
					errorMsg += eMsgs.invalidDropOffBeforePickUp;
				}
			}
			return errorMsg;
		},

		_addGeonameIdHotelField: function(form){
			var geoname_id = $('<input/>', {type:"hidden", name: "geoname_id", id:"geonameid"});
			form.append(geoname_id);
			
			return geoname_id;
		},
		_addRegularTracker : function($form) {
			var $regTracker = $('<input type="hidden" name="tracker">');
			var trackData;
			trackData = document.referrer;

			$regTracker.val(escape(trackData));
			$form.append($regTracker); 
		},
		_addTrackerParamsField : function($form) {
            var newTrackerUrl = '';
            var trackerParams = 'test=test';
            var $hiddenField = $('<input type="hidden" name="keytrack">');
            
            $(document).ready(function() {
				var pageTracker;
                if( _gaq && (typeof _gaq === "object" ) ){
                    
                    _gaq.push(function() {
                        pageTracker = _gat._getTrackerByName();
                    });
                }
				if(pageTracker){
					newTrackerUrl = pageTracker._getLinkerUrl('https://sandbox.travelstoremaker.com/');
				}
                if(newTrackerUrl && (typeof newTrackerUrl === 'string')){
                    trackerParams = newTrackerUrl.split('?')[1];
                }
				
                $hiddenField.val(escape(trackerParams));
                $form.append($hiddenField); 
            });
        },
		_addTooltips : function($tab) {
			$tab.find('.info').tooltip({
			track: true,
			extraClass: 'ui-corner-all ui-state-highlight',
			delay: 20,
			top: -5,
			left: 20
			})
		},
		_addOnSubmit : function(form) {
			form.submit(function(event) {
				var fromC = form.find('#fromcityH');
				var toC = form.find('#tocityH');

				var fromAc = form.find('#fromcityAc');
				var toAc = form.find('#tocityAc');
				
				if(fromAc.val().slice(0,3) != fromC.val()) {
					fromC.val(fromAc.val());
					form.find('#from_iata_code_is_used').removeAttr('name');
					
				}
				if(toAc.val().slice(0,3) != toC.val()) {
					toC.val(toAc.val());
					form.find('#to_iata_code_is_used').removeAttr('name');
				}
				
				fromAc.removeAttr('name');
				toAc.removeAttr('name');
			});
		},
		
		_putTxtCursorBeforeTextIE: function (txtInputObj){
			if(txtInputObj.createTextRange){
				var range = txtInputObj.createTextRange();
				range.move("character", 0);
				range.select();  
			}
		},
		
		_getDaysObjs: function(){
			var daysArr = new Array();
			
			for(i=1; i<=31; i++){
				daysArr.push('<option value="'+ i +'">'+ i +'</option>');
			}
			
			return $(daysArr.join(''));
		},
		
		_setMonthDaysNumber: function (selMonthNum, daySelObj, daysList){
			var self = this;
			
			var februaryDays = (new Date().getFullYear() % 4)? 29:28;
			var monthsDaysArr = [31, februaryDays, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
	 		var daysToAdd = monthsDaysArr[selMonthNum];
	 		var $slicedDays = $(daysList.slice(0, daysToAdd));
	 		var tmpDay = daySelObj.val();			
	 		
			daySelObj.children().remove();
			daySelObj.append($slicedDays.clone());
			daySelObj.val(tmpDay);
		},
		_selectMenuBeautifier: function ($tab){
			$tab.find('select').each(function (i, selectMenu){
				var $selectMenu = $(selectMenu);
				var width;
				
				switch($selectMenu.attr('name')){
					case 'triptype':
					case 'serviceclass':
					case 'cccardcurrency':
						$selectMenu.selectmenu({
							style: 'dropdown',
							width: 230
						});
						break;
					case 'ptc1':
					case 'ptc2':
					case 'roomtype1':
						$selectMenu.selectmenu({
							style: 'dropdown',
							width: 220
						});
						break;
					case 'numptc1':
					case 'numptc2':
					case 'roomtypenum1':
						$selectMenu.selectmenu({
							style: 'dropdown',
							width: 50
						});
						break;
					case 'minstarrating':
						$selectMenu.selectmenu({
							style: 'dropdown',
							width: 230
						});
						break;
					case 'puphour':
					case 'doffhour':
					case 'outhour':
					case 'rethour':
						$selectMenu.selectmenu({
							style: 'dropdown',
							width: 115
						});
						break;						
                    case 'loccurrency':
						$selectMenu.selectmenu({
							style: 'dropdown',
							width: 122
						});
						break; 
					case 'loccurrency2':
						$selectMenu.selectmenu({
							style: 'dropdown',
							width: 122
						});
						break;
				}
			});
		},
		_addCustomTabsSelectIvents: function($tabsObj) {
			var self = this;
			
			$tabsObj.bind('tabsselect', function(e, ui){
				var eventName = ui.panel.id.toLowerCase();
				$tabsObj.trigger(eventName+'.qsf');
			});

		},
		_fixRoundCorners: function(qsf){
			var selTabNum = qsf.tabs( 'option', 'selected' );
			var firstTopTab = qsf.find('#topTab'+selTabNum);
			
			firstTopTab.removeClass('topTab'+selTabNum);
			firstTopTab.addClass('topTab'+selTabNum+'H');
			
			qsf.bind('tabsselect', function(e, ui){
				var lastTab = qsf.find('#topTab'+selTabNum); 

				$(ui.tab).parent().addClass('topTab'+ui.index+'H');
				lastTab.removeClass('topTab'+selTabNum+'H');
				lastTab.addClass('topTab'+selTabNum);
				selTabNum = ui.index;
			});
			
			var lis = qsf.find('#ieCornersTabs li');

			lis.hover(function(e){
					var realTarger = $(e.target); 
					var tabNum = lis.index($(this));
					var className = 'topTab'+tabNum+'H';
					if(tabNum != selTabNum)
						$(this).addClass(className);
						
				},
				function(e){
					var realTarger = $(e.target); 
					var tabNum = lis.index($(this));
					var className = 'topTab'+tabNum+'H';
					if(tabNum != selTabNum)
						$(this).removeClass(className)
				}
			);
		}
	})
}(jQuery));
