(function (window, $) {
	//таймлайн в поисковой форме
	$(function () {
		var jSearch = $('div.js-search-form'), jTime = jSearch.find('div.time'),
			jShort = jTime.find('div.time_short'), jLinks = jShort.find('a'), curTimeVal,
			getValue, startVal;
			if (jTime.length) {
				getValue = function (jLink) {
					var oValue = jLink.data('value');
					if (typeof oValue == 'string') {
						oValue = oValue.split(',');
						oValue = {from: oValue[0], to: oValue[1]};
						jLink.data('value', oValue);
					}
					return oValue;
				}
				startVal = jTime.attr('data-start');
				if (startVal) {
					if (startVal == 'from-now') {
						curTimeVal = new Date();
						curTimeVal = curTimeVal.getHours() * 4 + Math.floor(curTimeVal.getMinutes()/15)
					} else if (!isNaN(startVal)) {
						curTimeVal = startVal;
					}
				};
				jTime.goSliderControl({
					minVal : 0,
					maxVal : 108,
					stepSize : 1,
					valType : 'Time',
					cssSelectors : {Line : 'div.js_line'},
					changeHandler : function () {
						var oSliderControl = this;
						jLinks.removeClass('on').each(function () {
							var jLink = $(this), linkValue = getValue(jLink);
							if (linkValue.from == oSliderControl.rValues.from && linkValue.to == oSliderControl.rValues.to) {
								jLink.addClass('on');
							}
						});
					},
					defVal: {
						from: curTimeVal
					}
				});
				if (jShort.length) {
					jShort.find('a').bind('click.sliderControlAd', function (e) {
						e.preventDefault();
						var jLink = $(this); oValue = getValue(jLink);
						jTime.data('sliderCObj').setValues(oValue, false, false);
					});
				};
			}
	});
	//\таймлайн в поисковой форме
	//селекты в поисковой форме
	var csHandlers = {
			onDraw : function () {
				var oCustomSelect = this;
				this.jOptionsList.find('a.close').add(this.jOptionsList.find('input.but_av')).bind('click.cSelectAd', function () {
					oCustomSelect.Hide();
					return false;
				});
			},
			/*onOptDraw : function (valNo) {
				var oOption = this.Values[valNo], chkId = this.Name + '_chk_' + valNo;
				oOption.jOption.attr({id: chkId}).removeAttr('name');
				oOption.jOptionParent.find('label').attr({'for': chkId});
			},*/
			onOptChange : function (oOption) {
				if (!oOption.Selected) {
					oOption.jOption.removeAttr('checked');
				}
			}
		},
		csOptions = {
			/*cssSelectors: {
				Inner : {
					optionsCont : 'div.js-opt-cont'
				}
			},*/
			bySelectors : true,
			onDraw : csHandlers.onDraw,
			onOptDraw : csHandlers.onOptDraw,
			onOptChange : csHandlers.onOptChange,
			chEvent : 'change'
		}, 
		getDateFromStr = function (strDate) {
			var aDate = strDate.split('-'), dDate;
			if (aDate.length) {
				return new Date(aDate[0], aDate[1] ? aDate[1] - 1 : 0, aDate[2] ? aDate[2] : 1);
			}
		};
	$(function () {
		var jSearch = $('div.js-search-form'), jDateSel = jSearch.find('select.js-date'),
			jRubricSel = jSearch.find('select[name=rubric]'), jSubwaySel = jSearch.find('select[name=subway]'),
			jJenreSel = jSearch.find('select[name=jenre]'), jTheatreSel = jSearch.find('select[name=theatre]'),
			jFeatureSel = jSearch.find('select[name=feature]'), jKitchenSel = jSearch.find('select[name=kitchen]'),
			jCountrySel = jSearch.find('select[name=country]'), jActorSel = jSearch.find('select[name=actor]'), 
			jShopSel = jSearch.find('select[name=shop]'), jSelects = jActorSel.add(jTheatreSel).add(jJenreSel),
			oCalendar, jDateValue = jSearch.find('input:hidden[name=date]'), selDate, oSelected = {}, oCSelect,
			getObjFromVal = function (val) {
				var oObj = {}, aVal;
				if (val && val.length) {
					aVal = val.split('-');
					oObj[(aVal[0] + '-' + aVal[1])] = [aVal[2]*1];
				}
				return oObj;
			}, jTime = jSearch.find('div.time'), oTimeline = jTime.data('sliderCObj'),
			setTimilineState = function (val) {
				var aDate, dDate, dToday = new Date(), oTimeValues = {},
					startVal, curTimeVal;
				if (!(oTimeline && val && val.length)) {
					return;
				}
				aDate = val.split('-');
				dDate = new Date(aDate[0], aDate[1] - 1, aDate[2]);
				dToday = new Date(dToday.getFullYear(), dToday.getMonth(), dToday.getDate());
				window.SliderControlHandlers.Time.startDate = dDate.getTime();
				oTimeValues['to'] = oTimeline.optValues.maxVal;
				startVal = jTime.attr('data-start');
				if (startVal) {
					if (startVal == 'from-now') {
						curTimeVal = new Date();
						curTimeVal = curTimeVal.getHours() * 4 + Math.floor(curTimeVal.getMinutes()/15)
					} else if (!isNaN(startVal)) {
						curTimeVal = startVal;
					}
				};
				if (dDate.getTime() == dToday.getTime() && curTimeVal) {
					oTimeValues['from'] = curTimeVal;
				} else {
					oTimeValues['from'] = oTimeline.optValues.minVal;
				}
				oTimeline.setValues(oTimeValues);
			};
		if (jDateSel.length) {
			selDate = jDateValue.val();
			if (selDate) {
				jDateSel.find('option').each(function () {
					var jOption = $(this);
					if (jOption.val() == selDate) {
						jOption.attr('selected', 'selected');
					} else {
						jOption.removeAttr('selected');
					}
				});
				oSelected = getObjFromVal(selDate);
			}
			jDateSel.bind('change', function () {
				var curVal = jDateSel.val(), oSelDate = getObjFromVal(curVal);
				if (oCalendar) {
					oCalendar.Dates.Selected = oSelDate;
					oCalendar.setCurMonth(new Date(oCalendar.Year, oCalendar.Month), false);
				}
				setTimilineState(curVal);
				jDateValue.val(curVal);
			});
			oCSelect = jDateSel.goCustomSelect({
				cssSelectors: {
					Wrapper : 'div.js-search-form div.js-date-sel',
					Inner : {
						optionsCont : 'div.open_div_prel'
					},
					optTemplate : {
						Text : 'a',
						Option : 'a'
					}
				},
				bySelectors : true,
				onDraw : csHandlers.onDraw,
				onOptDraw: function (oOption, aOptClasses) {
					var dDate = getDateFromStr(oOption.Value), dToday = new Date(), wDay = dDate.getDay(),
						optText = oOption.Text;
					dDate = new Date(dDate.getFullYear(), dDate.getMonth(), dDate.getDate());
					dToday = new Date(dToday.getFullYear(), dToday.getMonth(), dToday.getDate());
					if (wDay > 5 || wDay < 1) {
						aOptClasses.push('vyh');
					}
					//console.log(new Date(dToday.getFullYear(), dToday.getMonth(), dToday.getDate() - 1).toString());
					if (dDate.getTime() == dToday.getTime()) {
						aOptClasses.push('tod');
						optText = '<span>сегодня</span><br>' + optText;
						oOption.Text = 'Сегодня';
						//this.Values[valNo].isToday = true;
					} else if (new Date(dToday.getFullYear(), dToday.getMonth(), dToday.getDate() + 1).getTime() == dDate.getTime()) {
						aOptClasses.push('tom');
						optText = '<span>завтра</span><br>' + optText;
						oOption.Text = 'Завтра';
					}
					return optText;
				}
			}).data('cSelectObj');
			//календарь в поисковой форме
			var jCalendar = jSearch.find('div#js-calendar'), aMonthNames, aWeekDays, selText,
				oDates = {
					min: {value: oCSelect.Values[0].Value},
					max: {value: oCSelect.Values[oCSelect.Values.length - 1].Value}
				};
			//console.log(minDate);
			if (jCalendar.length) {
				aMonthNames = ['января', 'февраля', 'мартф', 'фпреля', 'мая', 'июня', 'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря'];
				aWeekDays = ['ВС', 'ПН', 'ВТ', 'СР', 'ЧТ', 'ПТ', 'СБ'];
				oDates.max.date = getDateFromStr(oDates.max.value);
				oDates.min.date = getDateFromStr(oDates.min.value);
				if (oDates.min.date <= oDates.max.date || (oDates.max.date.getMonth() == oDates.min.date.getMonth() && oDates.max.date.getFullYear() == oDates.min.date.getFullYear())) {
					oDates.max.date = new Date(oDates.min.date.getFullYear(), oDates.min.date.getMonth() + 1);
				}
				for (var dateType in oDates) {
					if (oDates.hasOwnProperty(dateType)) {
						var oDate = oDates[dateType];
						oDate.month = (oDate.date.getMonth() + 1);
						if (oDate.month < 10) {
							oDate.month = '0' + oDate.month;
						}
						oDate.month = oDate.date.getFullYear() + '-' + oDate.month;
					}
				}
				oCalendar = jCalendar.find('div.js-select').goCalendar({
					monthsRange: {min: oDates.min.month, max: oDates.max.month},
					avalibleRange: {min: oDates.min.value},
					selectedDates: oSelected,
					maxSel: 1,
					cssClasses: {
						Disabled: 'hidden'
					},
					onDateSelect: function () {
						var isAlreadySel = arguments[0], valId,
							dateId = arguments[3] + '-' + (arguments[4] < 10 ? '0' : '') + arguments[4],
							dDate = arguments[1];
						for (var valNo = 0, valsLength = oCSelect.Values.length; valNo < valsLength; valNo += 1) {
							if (oCSelect.Values[valNo].Value == dateId) {
								valId = valNo;
							}
						}
						if (typeof valId != 'undefined') {
							oCSelect.setOptState(valId, !isAlreadySel);
							oCSelect.onChange(false);
						} else {
							oCSelect.getVals(true, true); //сбрасываем выбранное в селекте
							if (!isAlreadySel) {
								selText = aWeekDays[dDate.getDay()] + ', ' + dDate.getDate() + ' ' + aMonthNames[dDate.getMonth()];
							} else {
								selText = oCSelect.getDefaultText();
							}
							oCSelect.jViewText.text(selText);
						}
						jDateValue.val(dateId);
						setTimilineState(dateId);
						jCalendar.hide();
					}
				}).data('calendarObj');
				jSearch.find('a.js-open_calendar').bind('click.calOpen', function (e) {
					e.preventDefault();
					jCalendar.show();
				});
				$(document).bind('mousedown keydown', function (e) {
					if(!($(e.target).is(jCalendar) || $(e.target).parents().filter(jCalendar).length)) {
						jCalendar.hide();
					}
				});
				jCalendar.find('a.close').bind('click.calClose', function (e) {
					e.preventDefault();
					jCalendar.hide();
				});
			}
			//\календарь
		}
		
		if (jRubricSel.length) {
			jRubricSel.goCustomSelect($.extend(true, csOptions, {
					cssSelectors: {
						Wrapper: 'div.js-search-form div.js-rubric-sel'
					}
				})
			);
		}
		
		if (jJenreSel.length) {
			jJenreSel.goCustomSelect($.extend(true, csOptions, {
					cssSelectors: {
						Wrapper: 'div.js-search-form div.js-jenre-sel'
					}
				})
			);
		}
		
		if (jTheatreSel.length) {
			jTheatreSel.goCustomSelect($.extend(true, csOptions, {
					cssSelectors: {
						Wrapper : 'div.js-search-form div.js-theatre-sel'
					}
				})
			);
		}
			
		if (jFeatureSel.length) {
			jFeatureSel.goCustomSelect($.extend(true, csOptions, {
					cssSelectors: {
						Wrapper : 'div.js-search-form div.js-feature-sel'
					}
				})
			);
		}
			
		if (jKitchenSel.length) {
			jKitchenSel.goCustomSelect($.extend(true, csOptions, {
					cssSelectors: {
						Wrapper : 'div.js-search-form div.js-kitchen-sel'
					}
				})
			);
		}
			
		if (jCountrySel.length) {
			jCountrySel.goCustomSelect($.extend(true, csOptions, {
					cssSelectors: {
						Wrapper : 'div.js-search-form div.js-country-sel'
					}
				})
			);
		}
			
		if (jActorSel.length) {
			jActorSel.goCustomSelect($.extend(true, csOptions, {
					cssSelectors: {
						Wrapper : 'div.js-search-form div.js-actor-sel'
					}
				})
			);
		}
			
		if (jShopSel.length) {
			jShopSel.goCustomSelect($.extend(true, csOptions, {
					cssSelectors: {
						Wrapper : 'div.js-search-form div.js-shop-sel'
					}
				})
			);
		}
		
		if (jSubwaySel.length) {
			$('div.js-search-form select[name=subway]').goCustomSelect({
				cssSelectors: {
					Wrapper : 'div.js-search-form div.subway'
				},
				bySelectors : true,
				onDraw : csHandlers.onDraw,
				onOptDraw : csHandlers.onOptDraw,
				onOptChange : csHandlers.onOptChange,
				chEvent : 'change'
			});		
		}
		
		jSelects.bind('change.cSelectAd', function () {
			var jCurSelect = $(this), isSel = !!jCurSelect.find('option[selected]').length;
			jSelects.not(jCurSelect).each(function () {
				$(this).data('cSelectObj').Switch(!isSel);
			});
		});
	});
	//\селекты в поисковой форме
	//----- диапазон цен ---/
	$(function () {
		var jSCContainer = $('div.b_search div.resto_price'), lineSelector = 'div.line';
		if (jSCContainer.length) {
			jSCContainer.goSliderControl({
				minVal : 0,
				maxVal : 3500,
				stepSize : 100,
				calculateResult : function (val) {
					if (val > 3499) {
						val = '+∞';
					}
					return val;
				},
				cssSelectors : {
					Line : lineSelector,
					Fields : {
						from : 'div.b_search div.account input:first',
						to : 'div.b_search div.account input:last'
					}
				}
			});
		}
	});
	//\----- диапазон цен ---/
	//----- алфавитный указатель ---/
	$(function () {
		var jSearch = $('div.js-search-form'), jCont = jSearch.find('.js-letters'),
			jLetterBlocks, jInput, curBlock, curClass = 'on';
		if (jCont.length) {
			jLetterBlocks = jCont.find('> span');
			jInput = jSearch.find('input:hidden[name=letter]');
			curBlock = jInput.val();
			if (typeof curBlock !=='undefined') {
				curBlock -= 1;
			}
			jLetterBlocks.bind('click', function (e) {
				var jBlock = $(this), blockNo = jLetterBlocks.index(jBlock);
				e.preventDefault();
				if (blockNo == curBlock) {
					return;
				}
				curBlock = blockNo;
				jLetterBlocks.removeClass(curClass);
				jBlock.addClass(curClass);
				jInput.val(curBlock + 1);
			});
		}
	});
	//\----- алфавитный указатель ---/
})(self, jQuery);

