$(document).ready( function() {
	var $searchDiv = $('#search');
	var $noScriptTable = $searchDiv.children('table.noscript');
	var $actionElement = $noScriptTable.find('select[name="action[]"]');
	var $musicElement = $noScriptTable.find('select[name="music[]"]');
	var $periodElement = $noScriptTable.find('select[name="period[]"]');
	var $dateElement = $noScriptTable.find('input[name="date"]');
	var $searchTerms = $('#search-terms');

	$('div.event-tmp').live('mouseover mouseout', function(event) {
		if (event.type == 'mouseover') {
			$(this).addClass('hover');
		} else {
			$(this).removeClass('hover');
		}
	});

	// закрытия popup-окна по клику на кнопке "Отменить"
	/*$('#reset-choice').live('click', function() {
		$('#elements, #period-elements').find('a.pushed').click();
	});*/

	$('img.trash').live('click', function() {
		$(this).parent('div.event-tmp').remove();
		$title.keyup();
	});

	// добавление события
	if ( $('#event-add').length ) {
		var $type = $('#event-add').find('input:radio[name="type"]');
		var $time_hour_start = $('#event-add').find('select[name="time_hour_start"]');
		var $time_hour_end = $('#event-add').find('select[name="time_hour_end"]');
		var $title = $('#event-add').find('input[name="title"]');
		var $submit = $('#event-add').find('input:submit');
		var $sxe = $('#sxe');
		var $multiple = $('#multiple');
		var $dow = $('#event-add').find('input:checkbox[name="dow[]"]');

		$title.keyup( function() {
			isOk = true;
			if ( $(this).val().length == 0 ) {
				isOk = false;
			} else {
				if ( $sxe.hasClass('hidden') && $multiple.hasClass('hidden') ) {
					isOk = false;
				} else {
					if ( !$multiple.hasClass('hidden') && $('#event-add').find('input:checkbox:checked[name="dow[]"]').length == 0 ) {
						isOk = false;
					} else if ( !$sxe.hasClass('hidden') && $('#sxe').find('input:hidden[name="date_many[]"]').length == 0 ) {
						isOk = false;
					}
				}
			}

			if ( isOk )
				$submit.removeClass('disabled').removeAttr('disabled');
			else
				$submit.addClass('disabled').attr('disabled', 'disabled');
		});

		$('#pick_sxe').datepicker({
			buttonImage: assetsDomain + '/pic/calendar.gif',
			showOtherMonths : true,
			selectOtherMonths: true,
			showOn: 'both',
			buttonImageOnly: true,
			onClose: function(dateText, inst) {
				if ( dateText.length == 0 )
					return;

				$para = $(this).parent();

				// проверяем на повторную дату
				var isOk = true;
				$para.find( 'input:hidden[name="date_many[]"]' ).each( function() {
					if ( $(this).val() == dateText ) {
						isOk = false;
						return false;
					}
				});

				if ( isOk ) {
					parts = dateText.split('.');

					date = new Date( parts[2], parseInt( parts[1] )-1, parts[0], 12, 0, 0 );
					dateDow = date.getUTCDay();

					title = parts[0] + ' ' + monthes[ parts[1] ] + ' ' + parts[2];
					input = '<input type="hidden" name="date_many[]" value="' + dateText + '">';
					unlink = '<img title="удалить" class="floatLeft trash" width="16" height="16" alt="удалить" src="/s/pic/icons/16/trash.png">';

					content = '<div class="event-tmp">' + unlink + input + title + ', ' + dow[ dateDow ] + '</div>';
						
					if ( $para.children('div.event-tmp').length > 0 )
						$(this).before(content);
					else
						$para.prepend(content);

					$title.keyup();
				}

				$(this).val( '' );
			}
		});

		// выполняем проверку на возможность сохранения события
		$dow.click( function() {
			$title.keyup();
		});

		// скрываем или открываем соответствующий вариант добавления события
		$type.click( function() {
			if ( $(this).val() == 'sxe' ) {
				$sxe.removeClass('hidden');
				$multiple.addClass('hidden');

				$('#time').show();
			} else {
				$sxe.addClass('hidden');
				$multiple.removeClass('hidden');

				$('#time').show();
			}

			$title.keyup();
		});

		// задаем связи между временем начала и временем окончания события
		compareDates( $time_hour_start, $time_hour_end );

		var dates = $('#from, #to').datepicker({
			buttonImage: assetsDomain + '/pic/calendar.gif',
			showOtherMonths : true,
			selectOtherMonths: true,
			showOn: 'both',
			buttonImageOnly: true,
			defaultDate: "+1w",
			changeMonth: true,
			numberOfMonths: 3,
			onSelect: function(selectedDate) {
				var option = this.id == "from" ? "minDate" : "maxDate";
				var instance = $(this).data("datepicker");
				var date = $.datepicker.parseDate(instance.settings.dateFormat || $.datepicker._defaults.dateFormat, selectedDate, instance.settings);
				dates.not(this).datepicker("option", option, date);
			}
		});
	}

	// изменение события
	if ( $('#event-edit').length ) {
		var $title = $('#event-edit').find('input[name="title"]');
		var $submit = $('#event-edit').find('input:submit');
		var $sxe = $('#sxe');

		$title.keyup( function() {
			isOk = true;
			if ( $(this).val().length == 0 ) {
				isOk = false;
			} else if ( $('#sxe').find('input:hidden[name="date_many[]"]').length == 0 ) {
				isOk = false;
			}

			if ( isOk )
				$submit.removeClass('disabled').removeAttr('disabled');
			else
				$submit.addClass('disabled').attr('disabled', 'disabled');
		});

		$('#pick_sxe').datepicker({
			buttonImage: assetsDomain + '/pic/calendar.gif',
			showOtherMonths : true,
			selectOtherMonths: true,
			showOn: 'both',
			buttonImageOnly: true,
			onClose: function(dateText, inst) {
				if ( dateText.length == 0 )
					return;

				$para = $(this).parent();

				// проверяем на повторную дату
				var isOk = true;
				$sxe.find( 'input:hidden[name="date_many[]"]' ).each( function() {
					if ( $(this).val() == dateText ) {
						isOk = false;
						return false;
					}
				});

				if ( isOk ) {
					parts = dateText.split('.');

					date = new Date( parts[2], parts[1]-1, parts[0], 12, 0, 0 );
					dateDow = date.getUTCDay();

					title = parts[0] + ' ' + monthes[ parts[1] ] + ' ' + parts[2];
					input = '<input type="hidden" name="date_many[]" value="' + dateText + '">';
					unlink = '<img title="удалить" class="floatLeft trash" width="16" height="16" alt="удалить" src="/s/pic/icons/16/trash.png">';

					time = ' <select name="time_hour_start[]">';
					for ( i=0; i<24; i++ ) {
						if ( i >= 6 && i < 8 ) {
							if ( i == 6 )
								time += '<option disabled="disabled" title="новый день">-</option>';

							continue;
						}

						text = i.toString();
						if ( text.length == 1 )
							text = '0' + text;

						selected = '';
						if ( i == 19 )
							selected = ' selected="selected"';

						time += '<option' + selected + ' value="' + i + '">' + text + '</option>';
					}
					
					time += '</select> : <select name="time_minute_start[]">';
					for ( i=0; i<60; i+=5 ) {
						text = i.toString();
						if ( text.length == 1 )
							text = '0' + text;

						time += '<option value="' + i + '">' + text + '</option>';
					}

					time += '</select> &nbsp;&mdash;&nbsp; <select name="time_hour_end[]">';
					for ( i=0; i<24; i++ ) {
						if ( i >= 7 && i < 9 ) {
							if ( i == 7 )
								time += '<option disabled="disabled" title="новый день">-</option>';

							continue;
						}

						text = i.toString();
						if ( text.length == 1 )
							text = '0' + text;

						selected = '';
						if ( i == 23 )
							selected = ' selected="selected"';

						time += '<option' + selected + ' value="' + i + '">' + text + '</option>';
					}
					
					time += '</select> : <select name="time_minute_end[]">';
					for ( i=0; i<60; i+=5 ) {
						text = i.toString();
						if ( text.length == 1 )
							text = '0' + text;

						time += '<option value="' + i + '">' + text + '</option>';
					}

					time += '</select>';

					content = '<div class="event-tmp"><div class="floatRight">' + time + '</div>' + unlink + input + title + ', ' + dow[ dateDow ] + '<div class="clear"></div></div>';

					if ( $sxe.children('div.event-tmp').length > 0 )
						$sxe.children(':last').before(content);
					else
						$sxe.prepend(content);

					// добавляем проверку времени
					$newDiv = $sxe.children('div.event-tmp:last');
					$start = $newDiv.find('select[name="time_hour_start[]"]');
					$end = $start.parent().children('select[name="time_hour_end[]"]');
					compareDates( $start, $end );

					$title.keyup();
				}

				$(this).val( '' );
			}
		});

		$sxe.find('select[name="time_hour_start[]"]').each( function() {
			$start = $(this);
			$end = $start.parent().children('select[name="time_hour_end[]"]');

			compareDates( $start, $end );
		});
	}

	/* поиск событий */
	if ( $('#search').length > 0 ) {
		$noScriptTable.addClass('hidden');

		coolSelects = '';
		coolSelects += '<a rel="date" title="Выберите дату" class="block item" href="javascript:;"><span>Дата &#x25be;</span></a>';
		coolSelects += '<a rel="period" title="Выберите время суток" class="block item" href="javascript:;"><span>Время суток &#x25be;</span></a>';
		coolSelects += '<a rel="action" title="Выберите программу" class="block item" href="javascript:;"><span>В программе &#x25be;</span></a>';
		coolSelects += '<div class="clear"></div>';
		$searchDiv.prepend(coolSelects);

		// выбор элементов в popup-окне
		createSearchEventQuery( false );

		// создание поисковой строки
		$('#save-choice').die().live('click', function() {
			createSearchEventQuery( true );
			$.fancybox.close();
		});

		$searchDiv.find('a.item[rel="date"]').live('click', openDateFB );
		$searchTerms.find('a.item.seval[rel="date"]').live('click', openDateFB );

		// время суток
		$searchDiv.find('a.item[rel="period"]').live('click', openPeriodFB );
		$searchTerms.find('a.item.seval[rel="period[]"]').live('click', openPeriodFB );

		$('a.period-choice').live('click', function() {
			$anchor = $(this);
			$periodElement = $noScriptTable.find('select[name="period[]"]');

			if ( $anchor.hasClass('pushed') ) {
				$anchor.removeClass('pushed');
				$anchor.attr('title', 'Нажмите, чтобы выделить');

				$periodElement.children('option[value="' + $anchor.attr('rel') + '"]').removeAttr('selected');
			} else {
				$anchor.addClass('pushed');
				$anchor.attr('title', 'Нажмите, чтобы снять выделение');

				$periodElement.children('option[value="' + $anchor.attr('rel') + '"]').attr('selected', 'selected');
			}
		});

		// в программе и музыка
		$searchDiv.find('a.item[rel="action"]').live('click', openActionMusicFB );
		$searchTerms.find('a.item.seval[rel="action[]"]').live('click', openActionMusicFB );

		$('a.actmusic-choice').live('click', function() {
			$anchor = $(this);
			$actionElement = $noScriptTable.find('select[name="action[]"]');
			$musicElement = $noScriptTable.find('select[name="music[]"]');

			if ( $anchor.hasClass('pushed') ) {
				$anchor.removeClass('pushed');
				$anchor.attr('title', 'Нажмите, чтобы выделить');

				rel = $anchor.attr('rel');
				if ( rel.indexOf('music') == -1 )
					$actionElement.children('option[value="' + rel.substr(7) + '"]').removeAttr('selected');
				else
					$musicElement.children('option[value="' + rel.substr(6) + '"]').removeAttr('selected');
			} else {
				$anchor.addClass('pushed');
				$anchor.attr('title', 'Нажмите, чтобы снять выделение');

				rel = $anchor.attr('rel');
				if ( rel.indexOf('music') == -1 )
					$actionElement.children('option[value="' + rel.substr(7) + '"]').attr('selected', 'selected');
				else
					$musicElement.children('option[value="' + rel.substr(6) + '"]').attr('selected', 'selected');
			}
		});
	}
});

function compareDates( $startSelect, $endSelect ) {
	$startSelect.change( function() {
	val = $(this).children('option:selected').val();
		endVal = $endSelect.children('option:selected').val();

		$endSelect.children('option[title!="новый день"]').removeAttr('disabled');

		if ( val < 6 && val >= 0 ) {
			for ( i=0; i<24; i++ ) {
				if ( i >= 8 || i <= val ) {
					// если время окончания попало в запрещенный промежуток, меняем его
					if ( i == endVal ) {
						newEndVal = parseInt(val) + 1;
						$endSelect.children('option[value="' + newEndVal + '"]').attr('selected', 'selected');
					}

					$endSelect.children('option[value="' + i + '"]').attr('disabled', 'disabled');
				}
			}

			return;
		}

		for ( i=val; i>=8; i-- ) {
			$endSelect.children('option[value="' + i + '"]').attr('disabled', 'disabled');

			// если время окончания попало в запрещенный промежуток, меняем его
			if ( i == endVal ) {
				newEndVal = parseInt(val) + 1;
				$endSelect.children('option[value="' + newEndVal + '"]').attr('selected', 'selected');
			}
		}
	});

	$endSelect.change( function() {
		val = $(this).children('option:selected').val();
		startVal = $startSelect.children('option:selected').val();

		$startSelect.children('option[title!="новый день"]').removeAttr('disabled');

		if ( val > 8 ) {
			for ( i=0; i<24; i++ ) {
				if ( i >= val || i <= 5 ) {
					$startSelect.children('option[value="' + i + '"]').attr('disabled', 'disabled');

					// если время начала попало в запрещенный промежуток, меняем его
					if ( i == startVal ) {
						newStartVal = parseInt(val) - 1;
						$startSelect.children('option[value="' + newStartVal + '"]').attr('selected', 'selected');
					}
				}
			}

			return;
		}

		for ( i=val; i<=5; i++ ) {
			$startSelect.children('option[value="' + i + '"]').attr('disabled', 'disabled');

			// если время начала попало в запрещенный промежуток, меняем его
			if ( i == startVal ) {
				newStartVal = parseInt(val) - 1;
				$startSelect.children('option[value="' + newStartVal + '"]').attr('selected', 'selected');
			}
		}
	});
}

function createSearchEventQuery( performJsonReq ) {
	var $searchDiv = $('#search');
	var $noScriptTable = $searchDiv.children('table.noscript');
	var $actionElement = $noScriptTable.find('select[name="action[]"]');
	var $musicElement = $noScriptTable.find('select[name="music[]"]');
	var $periodElement = $noScriptTable.find('select[name="period[]"]');
	var $dateElement = $noScriptTable.find('input[name="date"]');
	var $searchTerms = $('#search-terms');

	/* итоговая строка */
	query = new Array();

	// время
	$selectedOptions = $periodElement.children('option:selected');
	if ( $selectedOptions.length > 0 ) {
		periods = new Array();
		$selectedOptions.each( function() {
			if ( $(this).val() == 'morning' )
				periods.push('<a class="item seval" rel="period[]" href="javascript:;"><span>утренние</span></a>');
			else if ( $(this).val() == 'day' )
				periods.push('<a class="item seval" rel="period[]" href="javascript:;"><span>дневные</span></a>');
			else if ( $(this).val() == 'evening' )
				periods.push('<a class="item seval" rel="period[]" href="javascript:;"><span>вечерние</span></a>');
			else if ( $(this).val() == 'night' )
				periods.push('<a class="item seval" rel="period[]" href="javascript:;"><span>ночные</span></a>');
		});

		query.push( getAwesomeString(periods) + ' события');
	} else {
		query.push('События');
	}

	// дата
	dateVal = $dateElement.val();
	dateParts = dateVal.split('.');
	query.push('за <a class="item seval" rel="date" href="javascript:;"><span>' + dateParts[0] + ' ' + monthes[ dateParts[1] ] + ' ' + dateParts[2] + ' года</span></a>' );

	// музыка
	$selectedMusicOptions = $musicElement.children('option:selected');
	if ( $selectedMusicOptions.length > 0 ) {
		musicStyles = new Array();
		$selectedMusicOptions.each( function() {
			musicStyles.push( '<a class="item seval" rel="music[]" href="javascript:;"><span>' + $(this).text() + '</span></a>' );
		});

		query.push( ', где играет ' + getAwesomeString(musicStyles) );
	}

	// в программе
	$selectedActionOptions = $actionElement.children('option:selected');
	if ( $selectedActionOptions.length > 0 ) {
		actions = new Array();
		$selectedActionOptions.each( function() {
			actions.push( '<a class="item seval" rel="action[]" href="javascript:;"><span>' + $(this).text() + '</span></a>' );
		});

		query.push( ', а также есть ' + getAwesomeString(actions) );
	}

	$('#search-terms').removeClass('hidden').html( '<span>Вы ищете:</span> ' + query.join(' ') );

	if ( performJsonReq ) {
		$('#search-results').html( loadingImg );
		$.getJSON( '/restaurants/posters?' + $('#search-event').serialize(), function( data ) {
			$('#search-results').replaceWith(data.content);
			$('#search-results').find('table.data tr:even').addClass('odd');
		});
	}
}

function openDateFB() {
	var $noScriptTable = $('#search').children('table.noscript');

	$.fancybox(
		'<h2>Выберите дату</h2><div id="placepicker"></div>', {
			'autoDimensions' : false,
			'width' : 251,
			'height' : 290,
			'transitionIn' : 'none',
			'transitionOut' : 'none'
		}
	);

	$('#placepicker').datepicker({
		showOtherMonths : true,
		selectOtherMonths: true,
		onSelect: function(dateText, inst) {
			$noScriptTable.find('input[name="date"]').val( dateText );
			$.fancybox.close();

			createSearchEventQuery( true );
		}
	});
}

function openPeriodFB() {
	var $noScriptTable = $('#search').children('table.noscript');
	
	$periodElement = $noScriptTable.find('select[name="period[]"]');

	var options = new Array();
	$periodElement.children().each( function() {
		if ( $(this).attr('selected') ) {
			selected = ' pushed';
			title = 'Нажмите, чтобы снять выделение';
		} else {
			selected = '';
			title = 'Нажмите, чтобы выделить';
		}

		options.push('<a title="' + title + '" class="block period-choice' + selected + '" rel="' + $(this).val() + '" href="javascript:;"><span>' + $(this).html() + '</span></a>');
	});

	$.fancybox(
		'<h2>Выберите время суток</h2><div id="period-elements">' + options.join('') + '</div><input type="button" id="save-choice" value="Сохранить"> или <input type="button" id="reset-choice" value="Очистить все">', {
			'autoDimensions' : false,
			'width' : 340,
			'height' : 150,
			'transitionIn' : 'none',
			'transitionOut' : 'none'
		}
	);
}

function openActionMusicFB() {
	var $noScriptTable = $('#search').children('table.noscript');
	var $actionElement = $noScriptTable.find('select[name="action[]"]');
	var $musicElement = $noScriptTable.find('select[name="music[]"]');

	var actionOptions = new Array();
	$actionElement.children().each( function() {
		if ( $(this).attr('selected') ) {
			selected = ' pushed';
			title = 'Нажмите, чтобы снять выделение';
		} else {
			selected = '';
			title = 'Нажмите, чтобы выделить';
		}

		actionOptions.push('<a title="' + title + '" class="block actmusic-choice' + selected + '" rel="action-' + $(this).val() + '" href="javascript:;"><span>' + $(this).html() + '</span></a>');
	});

	var musicOptions = new Array();
	$musicElement.children().each( function() {
		if ( $(this).attr('selected') ) {
			selected = ' pushed';
			title = 'Нажмите, чтобы снять выделение';
		} else {
			selected = '';
			title = 'Нажмите, чтобы выделить';
		}

		musicOptions.push('<a title="' + title + '" class="block actmusic-choice' + selected + '" rel="music-' + $(this).val() + '" href="javascript:;"><span>' + $(this).html() + '</span></a>');
	});

	var options = new Array();
	for ( i=0, len=Math.max( actionOptions.length, musicOptions.length ); i<len; i++ ) {
		if ( typeof actionOptions[i] == 'undefined' )
			options.push('<div class="blank-item"></div>');
		else
			options.push( actionOptions[i] );

		if ( typeof musicOptions[i] == 'undefined' )
			options.push('<div class="blank-item"></div>');
		else
			options.push( musicOptions[i] );
	}

	$.fancybox(
		'<h2>Выберите муз. стиль и программу</h2><div id="elements">' + options.join('') + '</div><input type="button" id="save-choice" value="Сохранить"> или <input type="button" id="reset-choice" value="Очистить все">', {
			'autoDimensions' : false,
			'width' : 500,
			'height' : 382,
			'transitionIn' : 'none',
			'transitionOut' : 'none'
		}
	);
}

