/**
 * Отображает или прячет выбранный блок.
 * 
 * @param {String} blockID
 */
function toggleBlockDisplay( blockID )
{
	$( "#" + blockID ).toggle();
}

/**
 * Устанавливает все флажки в соответствии с выбором в заголовке. 
 * 
 * @param {HTMLInputElement} box
 */
function toggleSelection( box )
{
	var checked = box.checked;
	$( "input.checkbox" ).attr( "checked", checked );
}

/**
 * Показывает всплывающий слой с выбором значений в фильтре.
 * 
 * @param {String} filterID
 */
function showFilterSelection( filterID )
{
	$( "#" + filterID + "Filter" ).modal({
		closeHTML: "",
		minWidth: 250,
		opacity: 80,
		overlayClose: true
	});
	return false;
}

/**
 * Показывает всплывающую форму для отправки информации о найденной ошибке на странице.
 */
function showOrthographyError()
{
	// Получаем текст выделенный на странице
	var markedText = getSelectedText();
	
	if ( markedText === false || markedText.length == 0 )
	{
		alert( "Пожалуйста, выделите текст, который содержит ошибку!" );
	}
	else 
	{
		// Обрезаем выделенный текст и ...
		if ( markedText.length > 300 )
		{
			markedText = markedText.substring( 0, 300 ) + " ...";
		}
		
		// показываем его во всплывающем окне
		$( "#MarkedText" ).text( markedText );
		$( 'input[name="MarkedText"]' ).val( markedText );
	
		$( "#OrthographyErrorBlock" ).modal({
			closeHTML: "",
			minWidth: 250,
			opacity: 80,
			overlayClose: true
		});
	}
	return false;	
}

/**
 * Собирает информацию о найденной ошибке из формы и отправляет серверу.
 */
function saveOrthographyErrorInfo()
{	
	// соберем все необходимые параметры формы в массив
	var outData = [];
	var fields = new Object();
	fields = "input:text, input:hidden, textarea";
	$( fields, "#OrthographyErrorForm" ).each(
		function()
		{
			outData.push({ 
				name: this.name, 
				value: this.value 
			});
		}
	);

	// Добавлем в параметры url страницы на которой была найдена ошибка
	var current_url = window.location.href;
	outData.push({ 
		name: "URL", 
		value: current_url
	});
	
	// Выполняем запрос к серверу
	var request_url = "/ezjscore/call/pb::saveOrthographyErrorInfo";
	if ( outData ) {
		outData = $.param( outData );
	}
	
	$( "#OrthographyErrorBlockClose" ).css( "display", "none" );
	$( "#OrthographyErrorBlockCloseAjaxLoader" ).css( "display", "block" );
	
 	$.post(
		request_url, 
		outData,
		onSendComplaintSuccess
	);
	
	function onSendComplaintSuccess( data )
	{
		$( "#OrthographyErrorBlockClose" ).css( "display", "block" );
		$( "#OrthographyErrorBlockCloseAjaxLoader" ).css( "display", "none" );		
		
		var result = eval( "(" + data + ")" );
		try
		{
			if ( result.statusCode == "OK" )
			{
				$.modal.close();
			}		
			alert( result.statusMessage );
		}
		catch (e) {}
	}	
}

/**
 * Возвращает выделенный текст на странице.
 * 
 * @return {String}
 */
function getSelectedText() 
{ 
    var selText = ""; 
	if ( window.getSelection ) {
		selText = window.getSelection().toString();
	} else if ( document.getSelection ) {
	   	selText = document.getSelection();                
	} else if ( document.selection ) {
	    selText = document.selection.createRange().text;
	}  
	
	return selText;
}

/**
 * Показывает скрытый блок для варианта ответа "Другое".
 * 
 * @param {Object} selectObject
 * @param {String} optionValue
 */
function showOtherField( objectSelect, optionValue )
{
	var objectField  = $( objectSelect ).parent().parent();
	var fieldID      = objectField.attr( "id" );
	var fieldOtherID = fieldID + "_other";
	
	// Если выбран вариант other показываем дополнительное поле
	if( optionValue == "other" )
	{
		$( "#" + fieldOtherID ).slideDown( "slow" );	
	}	
	else
	{
		$( "#" + fieldOtherID ).slideUp( "slow" );
	}
}

/**
 * Очищает форму с указанным идентификатором.
 * 
 * @param {String} formID
 */
function clearForm( formID )
{
	$( formID ).get(0).reset();
}

$(document).ready(function(){   
    // Значение элемента когда он получил фокус
    var valueFocusedElement = "";
    // Значение элемента когда он потерял фокус    
    var valueBlurElement = "";
    // Уникальный идентификатор элемента
    var elementID = 0;    
    // Содержит ID элементов, которые были отредактированы
    var editedFields = new Array();
    
    // ------------------------------------------------------------
    // Добавление подсветки поля ввода при получении им фокуса
    // ------------------------------------------------------------
    $( ".field .section-control input, .field .section-control select, .field .section-control textarea" ).focus(
        function () {
            valueFocusedElement = $(this).val();
            
            var objectField = $(this).parent().parent();
            var classNameField  = $( objectField ).attr( "class");
    
            // Получаем обьект секции которая содержит описание поля, а также её содержимое.
            var objectSectionTip  = $( objectField ).children( ".section-tip" );
            var contentSectionTip = $( objectSectionTip ).children( ".section-tip_inner" ).html();
            contentSectionTip = $.trim( contentSectionTip );
            
            var reg = /^<div[^>]+>/i;
            var containTextTip = contentSectionTip.search( reg ) == -1;
            var containWarning = classNameField.indexOf( "field-warning" ) != -1;
            
            // Блок с описанием не содержит текст, поэтому удаляем его, 
            // чтобы подсветка произошла только в текстовоем поле.  
            if ( containTextTip === false )
            {
                objectSectionTip.html( "" );       
            }            
            
            // При заполнении поля в нем была допущена ошибка.
            // Для применения подсветки при получении фокуса,
            // css-класс ошибки нужно убрать.
            if ( containWarning === true )
            {
                $(objectField).removeClass( "field-warning" );
            }
            
            $(objectField).addClass( "field-focused" );         
        }
    );
    
    // ------------------------------------------------------------
    // Удаление подсветки поля ввода если он теряет фокус
    // ------------------------------------------------------------    
    $( ".field .section-control input, .field .section-control select, .field .section-control textarea").blur(
        function() {
            valueBlurElement = $(this).val();   
                         
            var tagName      = $(this).get(0).tagName.toLowerCase();                         
            var objectField  = $(this).parent().parent();              
            var containSectionWarning = $( objectField ).children( ".section-warning" ).length;           
         
            // Получаем уникальный идентификатор элемента
            switch ( tagName )
            {
                case "input":
                case "textarea":
                    elementID = $(this).attr( "id" );
                break;
                    
                case "select":
                    elementID = $(this).attr( "name" );
                break;                    
            }         
          
            // Если поле содержало ошибку, не было отредактировано, а также не отмечено 
            // как ранее отредактированное значит снова применяем к нему класс ошибки. 
            // Иначе запоминаем что поле было отредактировано.
            if ( containSectionWarning == 1 && ( valueBlurElement == valueFocusedElement ) && editedFields[elementID] === undefined )
            {
                $(objectField).addClass( "field-warning" );
            }
            else
            {
                editedFields[elementID] = true;
            }
                    
            $(objectField).removeClass( "field-focused" );
        }
    ); 
    
    // ------------------------------------------------------------
    // Отображение кнопки "Мне нравится" Вконтакте
    // ------------------------------------------------------------      
    if( window.VK !== undefined && $('#dashboard-share-vkontakte').length ) 
    {
    	$('#dashboard-share-vkontakte').html( VK.Share.button(false,{type: "round", text: "Рекомендовать"}) );
    }     
    
    // ------------------------------------------------------------
    // При первом заходе на страницу отправки feedback, referrer записывается с помощью javascript
    // ------------------------------------------------------------      
	if( $( '#Referrer' ).val() == '' )
	{
		$( '#Referrer' ).val( document.referrer );
	} 
	
    // ------------------------------------------------------------
    // Обработчик на показ всплывающего блока
	// Подвешиваем через live, так как это событие должно отрабатывать на динамическом содержимом,
	// конкретнее, во всплывающей форме авторизации
	// 
	// mouseover - при наведнии подвешиваем обработчик
	// click - по клику уже можно отработать подвешенный тултип
    // ------------------------------------------------------------  	
	$("#linkProjectTotalRegistrationListBlock").live('mouseover', function(){
		$(this).qtip({
			// Показываем тултип по клику на ссылке.
			// Запрещаем показ нескольких тултипов одновременно.
			show: {
				when: 'click',
				solo: true
			},
			// Зафиксировать тултип 
			// и закрывать только при щелчке на крестике
			hide: { 
				fixed: true,
				when: { 
					target: $('a.tooltip-close'),
					event: 'click'
				}
			},	
			content: $('#ProjectTotalRegistrationList').html(),
			style: {
				width: { min: 400 },
				background: '#FFFAAA',
				border: {
					width: 1,
					color: '#FFF000'
				},				
				classes: {
					tooltip: 'tooltip'
				}
			}	
		});
	});
	
	// Подвешиваем обработчики для трекинга социальных кнопок в Google Analytics
	if ( typeof _ga != 'undefined' )
	{
		var currentPage = window.location.href;
		_ga.trackSocial( currentPage );
	}
});

// Обработчик нажатия Ctrl+Enter
$(document).bind( 
	"keystrokes", 
	{ keys: ["ctrl+enter"] }, 
	function( event ) {
		var displayBlock = $( "#OrthographyErrorBlock" ).css( "display" );
		if ( displayBlock == "none" ) {
			showOrthographyError();
		}
	}
);

/**
 * Инициализирует модальное окно с формой авторизации.
 * 
 * @param {String} contentUserLoginBlock
 */
function initUserLoginBlock( contentUserLoginBlock )
{
	$.modal( contentUserLoginBlock, {
		containerId: "UserLoginBlock",
		opacity: 90,
		minWidth: 682,
		minHeight: 494,						
		onShow: function(dialog)
		{
			$('#UserLoginBlock #Login, #UserLoginBlock #Password, #UserLoginBlock input[name="Cookie"]').live('keypress', function (e) {
				if ( e.keyCode == 13 ) 
				{
					$('#UserLoginBlock input[name="LoginButton"]').trigger('click');
				}
			});				
		}
	});		
}

/**
 * Показывает всплывающий слой c формой авторизации.
 */
function showUserLoginBlock()
{
	outData = [];
	outData.push({ 
		name: "RedirectUri", 
		value: window.location.href
	});
	outData = $.param( outData );
	
	$.modal( '<img src="/design/generic/images/loading.gif" alt="Подождите, идет загрузка формы ..." title="Подождите, идет загрузка формы ..." border="0" />', {
		containerId: "UserLoginBlock",
		opacity: 90,
		onShow: function (dialog)
		{
		 	$.post( "/ezjscore/call/pb::getContentUserLoginBlock", outData, function( contentUserLoginBlock ){
		 		$.modal.close();
		 		
		 		setTimeout(function () {
			 		// Пересоздаем окно с формой авторизации.
			 		// Для того, чтобы работали tabindex на элементах формы авторизации,
					// нужно переинициализировать модальное окно с новым содержимым. 		 			
		 			initUserLoginBlock( contentUserLoginBlock );
		 		}, 60);
		 	});		
		}
	});
}

/**
 * Авторизирует пользователя на сайте.
 * 
 * @param {Object} form
 */
function authorizeUser( form )
{
	var cookie = '';
	if( form.Cookie !== undefined )
	{
		cookie = form.Cookie.value;
	}
	var userLogin = form.Login.value;
	var userPassword = form.Password.value;
	var redirectURI = form.RedirectURI.value;
	var loginButtonObject = $('#UserLoginBlock input.button[name="LoginButton"]'); 
	
	if ( userLogin.length > 0 && userPassword.length > 0 )
	{
		loginButtonObject.attr( 'disabled', 'disabled' );
		$( "#UserLoginBlockClose" ).css( "display", "none" );
		$( "#UserLoginBlockCloseAjaxLoader" ).css( "display", "block" );
		
		var outData = [];
		outData.push(
			{name: "Cookie", value: cookie},				
			{name: "UserLogin", value: userLogin},
			{name: "UserPassword", value: userPassword},
			{name: "RedirectURI", value: redirectURI}
		);
		outData = $.param( outData );	
		
	 	$.post( "/ezjscore/call/pb::authorizeUser", outData, function( data ){
			var result = eval( "(" + data + ")" );
			try
			{
				// Если нет ошибок, перезагружаем текущую страницу
				if ( !result.loginWarning )
				{
					window.location.reload();
				}		
				else
				{
			 		// Пересоздаем окно с формой авторизации.
			 		// Для того, чтобы работали tabindex на элементах формы авторизации,
					// нужно переинициализировать модальное окно с новым содержимым. 
			 		$.modal.close();
			 		
			 		setTimeout(function () {
			 			initUserLoginBlock( result.contentUserLoginBlock );
			 		}, 60);
				}
			}
			catch (e) {}			
	 	});
	}
}

/**
 * Handler на событие выбора ответа форума для переноса в другую тему.
 * 
 * @param {Object} checkboxObject
 */
function checkedConvertForumReply( checkboxObject )
{
	if ( $(checkboxObject).is(':checked'))
	{
		$(checkboxObject).parent().parent().css( 'background-color', '#F6F7EF' );		
	}
	else
	{
		$(checkboxObject).parent().parent().css( 'background-color', '#FFFFFF' );	
	}
}

/**
 * Отображение виджета likebox Вконтакте.
 * 
 * @param {Integer} vkontakteClubID
 */
function showVkontakteLikebox( vkontakteClubID )
{
	if ( window.VK !== undefined && $("#block-likebox-vkontakte").length )
	{
		VK.Widgets.Group("block-likebox-vkontakte", {mode: 0, width: "240", height: "290"}, vkontakteClubID );
	} 
}


/**
 * Заполняет заданный выпадающий список элементами из json-объекта.
 * 
 * @param {String} comboBoxID - html-селектор списка
 * @param {Object} data - json-объект с элементами списка
 */
function fillComboBox( comboBoxID, data )
{
	var comboBox = $(comboBoxID + ' select').get(0);
	
	// Если нет данных для выбранного варианта, скрываем комбобокс
	if ( data == undefined )
	{
		$(comboBoxID).hide();
		return true;
	}
	
	if ( comboBox != undefined )
	{
		$(comboBoxID).show();
		
		var comboBoxSelectedID = comboBox.value;
		comboBox.options.length = 0;
		for ( id in data )
		{
			comboBox.add( new Option( data[id], id, comboBoxSelectedID == id, comboBoxSelectedID == id ) );
		}
	}
}

/**
 * Обновляет поле данных поиска на основании массива зависимостей между полями данных.
 * 
 * @param {Array} combinationData - Массив зависимостей между полями данных
 * @param {String} dataFieldId - Идентификатор поля данных в выборке
 * @param {String} htmlPrefix - Префикс идентификатора поля данных в HTML
 */
function updateDataField( combinationData, dataFieldId, htmlPrefix )
{
	var dataFieldValue = $('#' + htmlPrefix + dataFieldId + ' select').get(0).value;
	var dependentDataFieldId =  combinationData[dataFieldId]['dependent'];
	var statePath = combinationData[dataFieldId]['state_path'];
	if ( dependentDataFieldId != null )
	{
		var dependentStatePath = statePath + '/' + dataFieldId + '=' + dataFieldValue;
		combinationData[dependentDataFieldId]['state_path'] = dependentStatePath;
		fillComboBox( '#' + htmlPrefix + dependentDataFieldId, combinationData[dependentDataFieldId]['values'][dependentStatePath] );
		// @coderev: es->aa 2011-12-06 Добавить условие выхода из рекурсии (защиту от бесконечной рекурсии из-за ошибки программиста при формировании зависимостей)
		updateDataField( combinationData, dependentDataFieldId, htmlPrefix );
	}
}

