/**
 * @author demon
 */

var active_field = -1;
var active_component = -1;

var clr;

var ctx_count = 0; // Общее количество контекстов

function projectBlockEventHandlers()
{
	$('#btnCreateContext').click(function()
		{
			createContext($('#new_context_name').val(), '');
			$('#new_context_name').val('');
		}
	);
	
	$('#btnCreateContext2').click(function()
		{
			createContext($('#new_context_name2').val(), '', function(id) 
				{
					if($('#copy_all_metadata').attr('checked'))
						jQuery.post('server/Main/CopyMetaDataBetweenContexts.php', { id_from: document.current_context_id, id_to: id, sess_id: document.session_id }); // CopyMetaDataBetweenContexts 
				}
			);
			
			$('#new_context_name2').val('');
		}
	);
	
	$('#btnDecomposeContext').click(function()
		{
			var d = $('#context_delimeter').val().trim();
			if(d == '') {
				alert('Разделитель не должен быть пустым!');
				return;
			}
			
			var t = $('#context_text').val().split(d);
			
			for(var i = 1; i < t.length; i++) {
				createContext($('#context_name').val()+'-'+i, t[i], function(id) 
					{
						if($('#copy_all_metadata').attr('checked'))
							jQuery.post('server/Main/CopyMetaDataBetweenContexts.php', { id_from: document.current_context_id, id_to: id, sess_id: document.session_id }); // CopyMetaDataBetweenContexts 
					},
					true
				);
			}
			
			$('#context_text').val(t[0]);
			
			saveContext();
		}
	);
	
	$('#export_cl').click(function() {
		window.open('server/Main/GetContextsList.php?format=txt');
	});
	
	$('#New_Project_Comment_btn').click(function() { addComment(0); });
	$('#New_Context_Comment_btn').click(function() { addCommentContext(0); });
}

function assignComponentToField(what,to,comp_tr)
{
	// to = 1 значит, что будем привязывать/отвязывать поле к компоненту (нажали на поле)
	// to = 2 значит, что будем привязывать/отвязывать компонент к полю (нажали на компоненту)

	var Fields = $('#Fields #fields *');
    var exists;
	if(to == 1)
	{
		var field = what;

		if( $("#components2_table .row_selected").length== 0)
		{
			if(active_field == field) // Это поле уже активно, деактивируем
			{
                Fields.filter('#field_'+field+' td').eq(1).removeClass('field_selected');
				active_field = -1;
			}
			else // Делаем поле активным
			{
				Fields.filter('#field_'+active_field+' td').eq(1).removeClass('field_selected');
				active_field = field;
                Fields.filter('#field_'+field+' td').eq(1).addClass('field_selected');
			}
		}
		else
		{
			exists = false;
            var uu=0;
            var comp_id='';
            $("#components2_table .row_selected").each(//просматриваем все выделенные компоненты
                    function(i,tr) {
                        var component_id = cpmTable.fnGetData(this)[3];

                        var Exist1 = false;
                        $("#sp_fields_" + component_id + " span").each(
                                function(i) {
                                    if ($(this).html() == Fields.filter('#field_' + field + ' a').html() + ', ') // Поле уже есть в списке привязанных полей
                                    {
                                        Exist1 = true;
                                        uu++;
                                    }
                                }
                        );
                        //если в текущем компоненте нету выбренного поля, то добавляем выбренное поле к этому компоненту
                        if (!Exist1) {
                            $("#sp_fields_" + component_id).append('<span class=field_a'+what+'>' + Fields.filter('#field_' + field + ' a').html() + ', </span>'); // Добавляем поле в список привязанных
                            Fields.filter('#field_' + field + ' div').append('<span  class=component_a'+component_id+'>' + cpmTable.fnGetData(this)[4] + ', </span>'); // Добавляем компонент в список привязанных
                            comp_id = comp_id + '\0' + component_id;
                            exists = true;
                            tr.children[1].innerHTML=$("#sp_fields_" + component_id + " span").length;
                        }
                    }
            );
            if (comp_id.length!=0)
                jQuery.post('server/Field/AssignComponentToField.php', { comp : comp_id, field : field, sess_id: document.session_id }); // AssignComponentToField(active_component, what);
            comp_id='';

            //если ни в одну из выделенных компоненты небыло добавлено поле, то удаляем поле из всех выделенных компонент
            if (!exists)
			{
                $("#components2_table .row_selected").each(
                        function(i,tr) {
                             var component_id = cpmTable.fnGetData(this)[3];
                            var component_n=cpmTable.fnGetData(this)[4];
                            comp_id = comp_id + '\0' + component_id;
                            exists = true;
                            Fields.filter('#field_' + field + ' span').each(
                                    function(i) {
                                        if ($(this).html() == component_n + ', ') {
                                            $(this).remove();
                                        }
                                    }
                            );
                            $("#sp_fields_" + component_id + " span").each(
                                    function(i) {
                                        if ($(this).html() == Fields.filter('#field_' + field + ' a').html() + ', ') // Поле уже есть в списке привязанных полей
                                        {
                                            $(this).remove();
                                        }
                                    }
                            );
                            $("#sp_fields_count_"+component_id).html($("#sp_fields_" + component_id + " span").length);
                            tr.children[1].innerHTML=$("#sp_fields_" + component_id + " span").length;
                        }
                );
            }
            if (comp_id.length!=0)
                jQuery.post('server/Field/DeleteAssignment.php', {comp : comp_id, field : field, sess_id: document.session_id }); // DeleteAssignment(active_component, what);

		}
	}
	else if(to == 2)
	{
        var comp = what;
        exists = false;

        $("#sp_fields_" + comp + " span").each(
                function(i) {
                    if ($(this).html() == Fields.filter('#field_' + active_field + ' a').html() + ', ') // Поле уже есть в списке привязанных полей
                    {
                        jQuery.post('server/Field/DeleteAssignment.php', { comp : "\0"+comp, field : active_field, sess_id: document.session_id }); // DeleteAssignment(what, active_field);
                        $(this).remove();
                        exists = true;
                    }
                }
        );

        Fields.filter('#field_' + active_field + ' span').each(
                function(i) {
                    if ($(this).html() == comp_tr[4] + ', ') {
                        $(this).remove();
                    }
                }
        );

        if (!exists) {
            $("#sp_fields_" + comp).append('<span class=field_a'+active_field+'>' + Fields.filter('#field_' + active_field + ' a').html() + ', </span>');
            Fields.filter('#field_' + active_field + ' div').append('<span class=component_a'+what+'>' + comp_tr[4] + ', </span>'); // Добавляем компонент в список привязанных
            jQuery.post('server/Field/AssignComponentToField.php', { comp : "\0"+comp, field : active_field, sess_id: document.session_id }); // AssignComponentToField(what, active_field);

        }
        $("#components2_table tr:not(:first)").each(
                function(i, tr) {
                    tr.children[1].innerHTML = $("#sp_fields_" + cpmTable.fnGetData(this)[3] + " span").length;

                }
        );
    }

}

function slideComponents(id) // Сворачивание/разворачивание списка компонент, привязанных к полю
{
	var i = $('#Fields #'+id+' .field_eye');
	if($('#Fields #'+id+' div').is(':hidden')) 
	{
		i.attr('src', 'images/icons/eye_close.png'); // Разворачиваем список, вставляем иконку закрытого глаза
		i.attr('title', 'Скрыть список компонентов');
	}
	else
	{
		i.attr('src', 'images/icons/eye.png'); // Сворачиваем список, вставляем иконку открытого глаза
		i.attr('title', 'Показать список компонентов');
	}
	i.tooltip({showURL: false});
	$('#Fields #'+id+' div').slideToggle();
}
function addField()
{
	var e = $('#Fields #fields #new_field');
	var field = e.val();

	e.val('');
	
	 // Проверяем: вдруг поле с таким именем уже добавлено в этом проекте?
	
	if(is_added($('#Fields #fields a'), htmlspecialchars(field)))
	{
		alert('Поле "'+field+'" уже добавлено!');
		return;
	}
	
	if(field != '') // Не добавляем пустые поля (возможно, условие будет более строгим)
	{
		$('#loader').show(); // Индикатор загрузки
		
		jQuery.post('server/Field/AddField.php', { name : field, sess_id: document.session_id }, // AddField
			function(id) 
			{
				var info = '<font color="red">Описание отсуствует. Для редактирования нажмите на эту кнопку.</font>';
                $('#Fields #fields tr:last').before("<tr id='field_" + id + "' valign='top'><td width='1'></td><td width='*'><a id='fieldName_" + id + "' class='field_a' href='#'>" + htmlspecialchars(field) + "</a><div></div></td><td width='10'>" +
                        "<td width='10'><img class='field_eye' src='images/icons/eye_close.png' title='Спрятать список компонентов'></td>" +
                        "<td><img class='field_info' src='images/icons/information.png' title='" + info + "'></td><td width='10'><img class='field_delete' src='images/icons/delete.png'></td><td width='10'><img class='field_rename' src='images/icons/edit.png'></td></tr>");


                var e = $('#Fields #field_'+id+' td');

				e.children('.field_a').click( (function(id) { return function() { assignComponentToField(id, 1); return false; }; })(id) );

				e.children('.field_eye').click( (function(id) { return function() { slideComponents('field_'+id); }; })(id) );
				e.children('.field_info').click( (function(id, info) { return function() { editFieldInfo(id, info); }; })(id, '') );
				e.children('.field_delete').click( (function(id) { return function() { deleteField(id); }; })(id) );
				e.children('.field_rename').click( (function(id) { return function() { renameField(id); }; })(id) );
				
				e.children('.field_eye, .field_info').tooltip({showURL: false});
				
				$('#loader').hide(); // Спрятать индикатор загрузки
			},
			"json"
		);
	}					
}

function renameFields()
{
	alert('Переименовывайте конкретное поле');
}

function editFieldInfo(id, info)
{
	$('#field_info_dialog #field_info').val(info);
	
	$('#field_info_dialog #fid_cancel').click( // Отмена
		function()
		{
			$('#field_info_dialog').dialog('close');
		}
	);
	
	// Очистим старые события			
	$('#field_info_dialog #fid_save').unbind('click');
	
	$('#field_info_dialog #fid_save').click( // Сохранить
		function()
		{
			var info = $('#field_info_dialog #field_info').val();
			
			var e =$('#Fields #fields #field_'+id+' .field_info');
			
			e.attr({'title': htmlspecialchars(info)});
			e.tooltip({showURL: false});
			
			e.click(
				function()
				{
					editFieldInfo(id, info);
				}
			);
			
			jQuery.post('server/Field/SaveFieldInfo.php', { field : id, info: info, sess_id: document.session_id }); // SaveFieldInfo
			
			$('#field_info_dialog').dialog('close');
		}
	);
	
	$('#field_info_dialog').dialog('open');
}

function deleteField(id)
{
    //Удалим поле из списков привязки у компонент
    $(".field_a"+id).remove();

	$('#Fields #fields #field_' + id).remove();

	jQuery.post('server/Field/DeleteFieldByID.php', {  id : id, sess_id: document.session_id }); // DeleteField
	
	if('field_'+id == active_field) // Если удаляемое поле активно, то удалим привязку
	{
		active_field = -1;
	}
}

var cpmTable;

//удаляет пробелы с начала
function trimLeading(s) 
{ 
	var leadingSpacesRe = /^\s+/;
	if (s) return s.replace(leadingSpacesRe, "");
	return;
} 

//удаляет пробелы с конца
function trimTrailing(s) 
{ 
	var trailingSpacesRe = /\s+$/;
	if (s) return s.replace(trailingSpacesRe, "");
	return;
} 

function renameField(id)
{
	newName = prompt ("Введите новое имя поля:", defaultText="");	
	// Проверяем: вдруг поле с таким именем уже добавлено в этом проекте?
	
	if(is_added($('#Fields #fields a'), htmlspecialchars(newName)))
	{
		alert('Поле "'+newName+'" уже добавлено!');
		return;
	}
			
	if (trimLeading(trimTrailing(newName)))
	{
	    jQuery.post('server/Main.php', { act : 48, newName: newName, id : id, sess_id: document.session_id },
	            function(idnew)
	            {
	                $('#Fields #field_'+id+' td').children('.field_a').text(newName);
	                $(".field_a"+id).text(newName+", ");
	                $("#field_"+id)[0].id="field_"+idnew;
	                $("#fieldName_"+id)[0].id="fieldName_"+idnew;
	                
	                $(".field_a"+id).each(
	                        function(i) {
	                            $(this).removeClass();
	                            $(this).addClass("field_a"+idnew);
	                        }
	                );
	                
	                
	                $('#Fields #field_'+idnew+' td').children('.field_a').unbind('click');
	                $('#Fields #field_'+idnew+' td').children('.field_a').click( (function(idnew) { return function() { assignComponentToField(idnew, 1); return false; }; })(idnew) );
	                //$("#field_"+idnew+);
	                $("#field_"+idnew+' .field_eye').unbind("click");
	                $("#field_"+idnew+' .field_eye').click( (function(idnew) { return function() { slideComponents('field_'+idnew); }; })(idnew) );
	                
	                $("#field_"+idnew+' .field_info').unbind("click");
	                
	                jQuery.post('server/Field/GetFieldInfo.php',{id : idnew, sess_id: document.session_id},
	                	function(infoNew)
	                	{
	                		$("#field_"+idnew+' .field_info').click( 
	                				(
	                					function(idnew, info)
	                						{
	                							return function() 
	                								{
	                									editFieldInfo(idnew, info);
	                								};
	                						}
	                				)
	                				(idnew, infoNew[0]) 
	                		);
	                	},
	                	"json"
	                );              
	                
	                $("#field_"+idnew+' .field_delete').unbind("click");	                
	                $("#field_"+idnew+' .field_delete').click( (function(idnew) { return function() { deleteField(idnew); }; })(idnew) );
	                $("#field_"+idnew+' .field_rename').unbind("click");
	                $("#field_"+idnew+' .field_rename').click( (function(idnew) { return function() { renameField(idnew); }; })(idnew) );
			},
			"json"
		);
	}
}

function showFields()
{	
	$('#Fields #fields tr:not(:last)').remove(); // Сначала очистим старые поля
	$('#Fields #components2 tr').remove(); // Теперь очистим компоненты
	
	$('#Fields #fields #new_field').val('');
	
	// Удалим выделение поля и компоненты, на всякий случай
	active_field = -1;
	active_component = -1;
	
	$('#Fields #components2 tr').remove(); // Сначала очистим старые компоненты
	
	$('#loader').show(); // Индикатор

	jQuery.post('server/Field/GetComponentsFromProjectWithAssignments.php', { sess_id: document.session_id }, // GetComponentsFromProjectWithAssignments
		function(comps_with_fields) 
		{
			// Заполняем таблицу связей
		
			conn = {}; // Карта связей полей с компонентами
			
			for(var i = 0; i < comps_with_fields.fields.length; i++)
			{
				for(var j = 0; j < comps_with_fields.fields[i].conn.length; j++)
				{
					if(typeof conn[comps_with_fields.fields[i].conn[j]] == 'undefined') // т.к. conn - ассоциативный массив
						conn[comps_with_fields.fields[i].conn[j]] = [];
					
					conn[comps_with_fields.fields[i].conn[j]].push(comps_with_fields.fields[i].n);
				}
			}

			// Связи реальных идентифиакторов компонентов с относительными
			
			conn2 = {};

			for(var i = 0; i < comps_with_fields.components.length; i++)
			{
				conn2[comps_with_fields.components[i].id] = i;
			}
		
			// Поля
		
			var field = '';
			var id = '';
			
			var info = '';
			var s = '';


			for(var i = 0; i < comps_with_fields.fields.length; i++) 
			{
				field = comps_with_fields.fields[i].n;
				id = comps_with_fields.fields[i].id;
				
				info = htmlspecialchars(comps_with_fields.fields[i].i);
				
				if(info == '')
					info = '<font color="red">Описание отсуствует. Для редактирования нажмите на эту кнопку.</font>';

				var sp_comps = '';

				for(var j = 0; j < comps_with_fields.fields[i].conn.length; j++)
				{
					sp_comps += "<span class='component_a" + comps_with_fields.fields[i].conn[j] + "'>"+comps_with_fields.components[conn2[comps_with_fields.fields[i].conn[j]]].n+", </span>";
				}
				
				s += "<tr id='field_" + id + "' valign='top'><td width='1'></td>"+
					 "<td width='*'><a id='fieldName_" + id + "' class='field_a' href='#'>" + field + "</a><br><div>" + sp_comps + "</div></td><td width='10'>"+
					 "<td width='10'><img class='field_eye' src='images/icons/eye_close.png' title='Спрятать список компонентов'></td>"+
					 "<td width='10'><img class='field_info' src='images/icons/information.png' title=\"" + htmlspecialchars(info) + "\"></td>"+
					 "<td width='10'><img class='field_delete' src='images/icons/delete.png' title='удалить'></td>"+
                        "<td width='10'><img class='field_rename' src='images/icons/edit.png' title='Переименовать'></td></tr>";
			}
			
			$('#Fields #fields tr:last').before(s);
			
			for(var i = 0; i < comps_with_fields.fields.length; i++) 
			{
				var id = comps_with_fields.fields[i].id;
				
				var e = $('#Fields #field_'+id+' td');
				
				e.children('.field_a').click( (function(id) { return function() { assignComponentToField(id, 1); return false; }; })(id) );

				e.children('.field_eye').click( (function(id) { return function() { slideComponents('field_'+id); }; })(id) );
				e.children('.field_info').click( (function(id, info) { return function() { editFieldInfo(id, info); }; })(id, comps_with_fields.fields[i].i) );
				e.children('.field_delete').click( (function(id) { return function() { deleteField(id); }; })(id) );
				e.children('.field_rename').click( (function(id) { return function() { renameField(id); }; })(id) );
			}
			
			$('#Fields img').tooltip({showURL: false});
			
			// Компоненты

            var t = '';
            var aaD = [];
            for (var i = 0; i < comps_with_fields.components.length; i++) {
                var sp_fields = '';
                var count = 0;
                for (var j in conn[comps_with_fields.components[i].id]) {
                    sp_fields += "<span class='field_a" + searchIdField(comps_with_fields.fields, conn[comps_with_fields.components[i].id][j]) + "'>" + conn[comps_with_fields.components[i].id][j] + ", </span>";
                    count++;
                }

                var clr = '';

                if (comps_with_fields.free.indexOf(comps_with_fields.components[i].id) != -1) // Идентификатор компонента в списке свободных
                {
                    clr = "style='background-color: red'";
                }
                var rec = new Array();
                id = comps_with_fields.components[i].id;
                rec.push("<a href='#' onclick='return false;' id='componentName_" + id + "' class='component_a'>" + comps_with_fields.components[i].n + "</a><div id='sp_fields_" + comps_with_fields.components[i].id + "'>" + sp_fields + "</div>");
                rec.push(count);
                rec.push("<img class='component_rename' src='images/icons/edit.png' title='Переименовать'>");
                rec.push(comps_with_fields.components[i].id);
                rec.push(comps_with_fields.components[i].n);
                aaD.push(rec);
            }
            var FieldsWidthA = document.cookie.match('(^|;) ?FieldsWidth=([^;]*)(;|$)');
            if (FieldsWidthA != null) {
                var FieldsWidth = FieldsWidthA[2]*1;
                $("#fields_div").width(FieldsWidth);
                $("#components2").width($("body").width() - FieldsWidth - 30);
            }
            var FieldsHeightA = document.cookie.match('(^|;) ?FieldsHeight=([^;]*)(;|$)');
            if (FieldsHeightA != null) {
                var FieldsHeight =FieldsHeightA[2]*1;
                $("#Fields_div").height(FieldsHeight);
                $("#fields_div").css({'max-height': $("#Fields_div").height() - 35});
            }
            $('#components2').html('<table cellpadding="0" cellspacing="0" border="0"  class="display"  id="components2_table"></table>');
            cpmTable = $('#components2_table').dataTable({
                "oLanguage": { "sUrl": "lib/jquery/datatables/language/ru_RU.txt" },
                "aaData": aaD,
                "sDom": 'tf ',
                "sScrollY": $("#Fields_div").height()-80+"px",
                "bAutoWidth": false,
                "aoColumns": [
                    {
                        "sTitle": "Компоненты",
                        "sType":"html"
                    },
                    {
                        "sTitle": "Количество",
                        "sWidth" : "10%"

                    },
                    {
                        "sTitle": "",
                        "sWidth" : "1px",
                        "bSearchable" : false,
                        "bSortable" : false
                    }
                ],
                "bStateSave": true,
                "bPaginate": false,
                "fnDrawCallback": function() {

                    $('#components2_table tbody tr').each(
                            function(i) {
                                $(this).children('td:not(:last-child)').unbind("click");
                                $(this).children('td:not(:last-child)').click(// Воспринимается щелчок по всем ячейкам строки, кроме  последней
                                        function() {
                                            if (active_field == -1) {
                                                $(this.parentNode).toggleClass('row_selected');
                                            }
                                            else {
                                                assignComponentToField(cpmTable.fnGetData(this.parentNode)[3], 2, cpmTable.fnGetData(this.parentNode));
                                            }
                                        }
                                );
                                $($(this).children()[2]).unbind("click");
                                $($(this).children()[2]).click(
                                		function(){
                                			//cpmTable.fnGetData(this.parentNode)[3] id нажатого компонента
                                			renameComponent(cpmTable.fnGetData(this.parentNode)[3],2,this);
                                		}
                                		);                                		
                            }
                    );}       
            });

            $('#inverse_selection_components').unbind('click'); // Удалим старую привязку

            $('#inverse_selection_components').click(
                    function() {
                        $(".field_selected").removeClass('field_selected');
                        active_field = -1;
                        $('#components2_table tbody tr').each(
                                function() {
                                    $(this).toggleClass('row_selected');
                                }
                        );
                    }
            );


            $('#select_only_filtered_components').unbind('click'); // Удалим старую привязку
            $('#select_only_filtered_components').click(
                    function() {
                        $(".field_selected").removeClass('field_selected');
                        active_field = -1;
                        $('#components2_table tbody tr').each(
                                function() {
                                    if (!$(this).hasClass('row_selected'))
                                        $(this).addClass('row_selected');
                                }
                        );
                    }
            );
            $('#unselect_only_filtered_components').click(
                    function() {
                        $(".field_selected").removeClass('field_selected');
                        active_field = -1;
                        $('#components2_table tbody tr').each(
                                function() {
                                    if ($(this).hasClass('row_selected'))
                                        $(this).removeClass('row_selected');
                                }
                        );
                    }
            );


            $('#loader').hide(); // Индикатор
        },
		"json"
	);
	
	changeForm('project','Fields'); // Показываем форму
}

function searchIdField(array,n)
{
	for(var i = 0; i < array.length; i++) 
	if (array[i].n==n) return array[i].id;

	return null;
}

function showContexts(dataLoaded)
{	
	$('#loader').show(); // Индикатор
	
	$('#contexts_list thead tr').html("");
	$('#contexts_list tbody').empty();
	$('#contexts_list tfoot tr').html("");
	
	var ctxTable;
	
	// Добавляем в dataTable
	
	jQuery.post('server/Meta.php', { act : 9, sess_id: document.session_id }, // GetMetaDataForAllContexts();
		function(data) 
		{
			var h = '';
			var ao = [ {"bSearchable" : false, "bSortable" : false, "sWidth" : "1px"}, {"sType" : "natural"} ]; // Не нужно выполнять поиск и сортировку по первому столбцу ("*") 
			
			for(var i = 0; i < data.headers.length; i++)
			{
				h += '<th>'+data.headers[i].n+'</th>';
				
				if(data.headers[i].t == 1)
					ao.push({"sType" : "natural"}); // Натуральная сортировка для строк
				else if(data.headers[i].t == 2)
					ao.push({"sType" : "numeric"}); // Числовая сортировка для чисел
				else if(data.headers[i].t == 3)
					ao.push({"sType" : "ru_date"}); // Натуральная сортировка для дат
				else if(data.headers[i].t == 4)
					ao.push({"sType" : "html"}); // HTML-сортировка для ссылок
				else				
					ao.push(null);
			}
			
			ao.push({"bSearchable" : false, "sWidth" : "1px"}); // Не нужно выполнять поиск и сортировку по предпоследнему последнему столбцу (количество комментариев)
			ao.push({"bSearchable" : false, "bSortable" : false, "sWidth" : "1px"}); // Не нужно выполнять поиск и сортировку по последнему столбцу ("Действия")
			
			$('#contexts_list thead tr').html("<th><input type='checkbox' id='activate_all_contexts' title='Активировать все контексты проекта'></th><th>Контекст</th>"+h+"<th><img src='images/icons/user_comment.png' alt='Комментариев' title='Количество комментариев'></th><th>Действия</th>");
			
			s = '';
			
			for(var i = 0; i < data.headers.length+1; i++)
				s += "<th><input type='text' style='width:100%'></th>";
			
			$('#contexts_list tfoot tr').html("<th><img src='images/icons/search.png' alt='Фильтр:' title='Фильтровать по столбцу' id='local_filter_ctx_img'></th>"+s+"<th>&nbsp;</th><th>&nbsp;</th>");
			
			$('#contexts_list img').tooltip({showURL: false});
			$('#contexts_list #activate_all_contexts').tooltip({showURL: false});
			
			$('#activate_all_contexts').change(
				function()
				{
					$(this).tooltip({showURL: false});
				}
			);
			
			// Формируем сортирующую таблицу
			
			ctxTable = $("#contexts_list").dataTable({
				"oLanguage": { "sUrl": "lib/jquery/datatables/language/ru_RU.txt" },
				"aoColumns": ao,
				"bStateSave": true,
				"sCookiePrefix": "Semograf_project_"+data.p_id+"_",
				"bDestroy": true,
				"bProcessing": true,
				"sDom": '<"H"lfpr>t<"F"ip>',
				"bServerSide": true,
				"sAjaxSource": "server/Main/GetContextsList.php",
				"fnServerData": function(sSource, aoData, fnCallback) 
				{
					if(dataLoaded)
						dataLoaded();
						
					aoData.push({ name: 'sess_id', value: document.session_id });
					
					jQuery.post(sSource, aoData, function(json)
					{
						contexts = json.ctx_ids;
						contexts_names = [];
						
						for(var i = 0; i < json.aaData.length; i++) // Постобработка ответа
						{
							contexts_names.push(json.aaData[i][1]);
							
							var ch = '';
							if(json.act_ctx_ids.indexOf(contexts[i]) != -1)
								ch = ' checked';
							
							json.aaData[i][0] = "<input type='checkbox' class='activate_ctx' id='active_ctx_"+contexts[i]+"'"+ch+">";
							json.aaData[i].push("<img class='ctx_delete' src='images/icons/delete.png' title='удалить'>");
						}
						
						$("#contexts_list #activate_all_contexts").attr('checked', json.is_all_active==1).change();
						
						fnCallback(json);
					},
					'json');
				},
				"fnDrawCallback": function() 
				{
					// Редактирование контекстов
					
					$("#contexts_list tbody tr").each(
						function(i)
						{
							$(this).children('td:not(:first-child,:last-child)').click( // Воспринимается щелчок по всем ячейкам строки, кроме первой и последней
								function()
								{
									window.location.hash = '#Context_'+document.current_project_id+'_'+contexts[i];
								}
							);
						}
					);
					
					// Кнопки удаления контекстов
					
					$("#contexts_list .ctx_delete").each(
						function(i)
						{
							$(this).click(
								function()
								{
									var d=$("#delete_confirm_dialog");
									d.find("#what").html("контекст");
									d.find("#name").html(contexts_names[i]);
									
									d.find("#dcd_yes").click(
										function()
										{
											deleteContext(contexts[i], function() { ctxTable.fnDeleteRow(i); } );

											d.dialog("close");
											d.find("#dcd_yes").unbind('click'); // Нужно удалить привязки от старых контекстов 
											d.find("#dcd_no").unbind('click');
										}
									);
									
									d.find("#dcd_no").click(
										function()
										{
											d.dialog("close");
											d.find("#dcd_yes").unbind('click'); // Нужно удалить привязки от старых контекстов 
											d.find("#dcd_no").unbind('click');
										}
									);
									
									d.dialog("open");
								}
							);
						}
					);
					
					$('.ctx_delete').tooltip({showURL: false});
					
					// Активация/деактивация 1 контекста
					
					$("#contexts_list .activate_ctx").click(
						function()
						{
							jQuery.post('server/Main.php', { act : 42, act2: 1, type: $(this).attr('checked'), ctx : $(this).attr('id').replace('active_ctx_', ''), sess_id: document.session_id }, // SetActiveContexts 
								function(is_all_active)
								{
									$("#contexts_list #activate_all_contexts").attr('checked', is_all_active == 1).change();
								},
								'json'
							);
						}
					);
					
					// Активация/деактивация всех контекстов
					
					$('#activate_all_contexts').unbind('click'); // Удалим старую привязку
					
					$("#activate_all_contexts").click( 
						function()
						{
							var b = $(this).attr('checked');
							
							$("#contexts_list .activate_ctx").attr('checked', b);
							
							jQuery.post('server/Main.php', { act : 42, act2: 2, type: b, ctx : 0, sess_id: document.session_id } ); // SetActiveContexts
						}
					);
					
					// Инвертирование выбора активных контекстов
					
					$('#inverse_selection').unbind('click'); // Удалим старую привязку

					$('#inverse_selection').click(
						function()
						{
							jQuery.post('server/Main.php', { act : 42, act2: 3, type: 0, ctx : 0, sess_id: document.session_id }, // SetActiveContexts
								function(is_all_active)
								{
									$("#contexts_list #activate_all_contexts").attr('checked', is_all_active == 1).change();
								},
								'json'
							);
							
							$("#contexts_list .activate_ctx").each(
								function()
								{
									$(this).attr('checked', !$(this).attr('checked')); 
								}
							);
						}
					);
					
					// Выбор только контекстов, прошедших фильтрацию
					
					$('#select_only_filtered').unbind('click'); // Удалим старую привязку

					$('#select_only_filtered').click(
						function()
						{
							jQuery.post('server/Main.php', { act : 42, act2: 4, type: true, ctx : 0, sess_id: document.session_id }, // SetActiveContexts
								function(is_all_active)
								{
									$("#contexts_list #activate_all_contexts").attr('checked', is_all_active == 1).change();
								},
								'json'
							);
							
							$("#contexts_list .activate_ctx").attr('checked', true); // Все видимые контексты прошли фильтрацию
						}
					);
					
					// Удаление выбора с контекстов, прошедших фильтрацию
					
					$('#unselect_only_filtered').unbind('click'); // Удалим старую привязку

					$('#unselect_only_filtered').click(
						function()
						{
							jQuery.post('server/Main.php', { act : 42, act2: 4, type: false, ctx : 0, sess_id: document.session_id }, // SetActiveContexts
								function(is_all_active)
								{
									$("#contexts_list #activate_all_contexts").attr('checked', is_all_active == 1).change();
								},
								'json'
							);
							
							$("#contexts_list .activate_ctx").attr('checked', false);
						}
					);
				}
			});
			
			var psc = ctxTable.fnSettings().aoPreSearchCols;
			
			for(var i = 0; i < psc.length-2; i++)
				$("#contexts_list tfoot input").eq(i).val(psc[i+1].sSearch);
			
			/*$("#contexts_list tbody tr").click( function () {
				$('tr',ctxTable.fnGetFilteredNodes()).css('background-color','green');
			});*/
			
			$("#contexts_list tfoot input").keyup( 
				function() 
				{
					// Фильтруем столбец по индексу поля ввода
					ctxTable.fnFilter(this.value, $("#contexts_list tfoot input").index(this)+1);
				}
			);
			
			$('#loader').hide();
		},
		"json"
	);
	
	// Покажем мета-поля
	
	$('#meta_fields tr:not(:last)').remove();
		
	jQuery.post('server/Meta.php', { act : 2, sess_id: document.session_id }, // GetMetaFields
		function(meta) 
		{
			var s = "<tr><td>Название</td><td>Тип</td><td align='center'><img src='images/icons/eye.png' alt='Вид' title='Отображать поле в списке контекстов' id='mf_eye_img'></td><td colspan=2 align='center'>Действие</td></tr>";
			
			for(var i = 0; i < meta.length; i++)
			{
				s += "<tr id='metafield_" + meta[i].id + "'><td class='metafield_id'>" + meta[i].name + "</td><td>" + mt[meta[i].type] + "</td><td><input type='checkbox' class='visible' id="+meta[i].id+" checked></td><td><img src='images/icons/delete.png' id="+meta[i].id+" class='mf_delete'></td><td><img src='images/icons/edit.png' title='Переименовать' onclick='renameMetaField("+meta[i].id+")'></td><tr>";
			}
			
			$('#meta_fields tr:last').before(s);
			
			$('#meta_fields .visible').attr('disabled', true);
			
			/*$('#meta_fields .visible').each(
				function(i)
				{
					$(this).click(
						function()
						{
							ctxTable.fnSetColumnVis(i+2, $(this).attr('checked'));
						}
					);
				}
			);*/
			
			$("#meta_fields .mf_delete").each( // Кнопки удаления мета-полей
				function(i)
				{
					$(this).click(
						function()
						{
							var d=$("#delete_confirm_dialog");
							d.find("#what").html("мета-поле");
							d.find("#name").html(meta[i].name);
							d.find("#info").html(" вместе со всей содержащейся в нём мета-информацией");
							
							d.find("#dcd_yes").click(
								function()
								{
									jQuery.post('server/Meta.php', { act : 10, id : meta[i].id, sess_id: document.session_id } ); // DeleteMetaField
									
									d.dialog("close");
									d.find("#dcd_yes").unbind('click'); // Нужно удалить привязки от старых контекстов 
									d.find("#dcd_no").unbind('click');
								}
							);
							
							d.find("#dcd_no").click(
								function()
								{
									d.dialog("close");
									d.find("#dcd_yes").unbind('click'); // Нужно удалить привязки от старых контекстов 
									d.find("#dcd_no").unbind('click');
								}
							);
							
							d.dialog("open");
						}
					);
				}
			);
			
			$('#mf_eye_img').tooltip({showURL: false});
			
			$('#New_Context_Comment_btn').attr('disabled', false);
		},
		"json"
	);
		
	$('#new_activity_name').html('');
	
	changeForm('main','Edit_Project');
	changeForm('project','Contexts');
}

function showContextsSimilarity()
{
	var b = $("#contexts_similarity tbody").html() != "";
	
	var t = $("#contexts_similarity").dataTable({
		"oLanguage": { "sUrl": "lib/jquery/datatables/language/ru_RU.txt" },
		"aoColumns": [ {"bSearchable" : false, "bSortable": false, "sWidth": "40%", "sClass": "csimilarity_cell_context"}, {"bSearchable" : false, "bSortable": false, "sWidth": "40%", "sClass": "csimilarity_cell_context"}, {"bSearchable" : false, "bSortable": false, "sClass": "csimilarity_cell_value"}, {"bSearchable" : false, "bSortable": false, "sClass": "csimilarity_cell_value"} ],
		"bStateSave": false,
		"bRetrieve": true,
		"bProcessing": true,
		"sDom": '<"H"lpr>t<"F"ip>',
		"bServerSide": true,
		"sAjaxSource": "server/Statistic/GetContextsSimilarityList.php",
		"fnServerData": function(sSource, aoData, fnCallback) 
		{
			aoData.push({ name: 'sess_id', value: document.session_id });
			
			jQuery.post(sSource, aoData, function(json)
			{
				for(var i = 0; i < json.aaData.length; i++)
				{
					json.aaData[i][0] = '<a href="#Context_'+json.pid+'_'+json.ctids[2*i]+'">'+json.aaData[i][0]+'</a>';
					json.aaData[i][1] = '<a href="#Context_'+json.pid+'_'+json.ctids[2*i+1]+'">'+json.aaData[i][1]+'</a>';
				}
				
				fnCallback(json);
			},
			'json');
		}
	});
	
	if(b) // Если это не первое открытие вкладки, таблицу нужно перерисовать вручную
		t.fnDraw();
	
	changeForm('project','ContextsSimilarity');
}

function renameMetaField(id)
{
	newName = prompt ("Введите новое имя метаполя:", defaultText="");
	if (trimLeading(trimTrailing(newName)))
	{
		 // Проверяем: вдруг поле с таким именем уже добавлено в этом проекте?
		
		if(is_added($('#meta_fields tr td:first-child'), htmlspecialchars(newName)))
		{
			alert('Мета-поле "'+newName+'" уже добавлено к контекстам этого проекта!');
			return;
		}
		
		jQuery.post('server/Main.php', { act : 50, newName: newName, id : id, sess_id: document.session_id });
		$('#meta_fields #metafield_'+id+' td.metafield_id').text(newName);
	}
}

function createContext(new_context_name, text, callback, doNotSwitchToNewContext)
{
	if(new_context_name == '')
	{
		alert('Введите название контекста!');
	}
	else
	{
		jQuery.post('server/Main/CreateContext.php', { name : new_context_name, text: text, sess_id: document.session_id },
			function(id) 
			{	
				if(typeof callback == 'function')
					callback(id);
				
				if(!doNotSwitchToNewContext)
					window.location.hash = '#Context_'+document.current_project_id+'_'+id;
			}
		);
	}
}

function deleteContext(id, callback)
{
	jQuery.post('server/Main.php', { act : 25, id : id, sess_id: document.session_id }, callback ); // DeleteContext
}

function selectContext(id, callback)
{
	jQuery.post('server/Main.php', { act : 7, id : id, sess_id: document.session_id }, function(res)
		{
			document.current_context_id = id;
		
			if(typeof callback == 'function')
				callback(res);
		},
	'json'
	); // SelectContext
}

function editContext()
{
	$('#Edit_Context #components tr:not(:last)').remove(); // Сначала очистим старые компоненты
	$('#context_name').val('');
	$('#context_text').val('');
	
	$('#loader').show();
	
	// Контекст
	
	jQuery.post('server/Main.php', { act : 15, sess_id: document.session_id }, // GetContext
		function(context) 
		{			
			$('#context_name').val(context.name);
			$('#context_text').val(context.text);
			
			changeForm('project','Edit_Context'); // Показываем форму редактирования контекста
			$('#loader').hide();
		},
		"json"
	);	
	
	// Компоненты
	
	jQuery.post('server/Main.php', { act : 16, sess_id: document.session_id }, // GetComponentsFromContext
		function(components) 
		{
			var s = "";
			for(var i = 0; i < components.length; i++) 
			{
				s += "<tr id='component_" + components[i].id + "'><td class='component_id'>" + components[i].component + "</td><td align='right' width='10'><img src='images/icons/delete.png' onclick='deleteComponent(" + components[i].id + ");'></td>"+
				"<td align='right' width='10'><img src='images/icons/edit.png' title='Переименовать' onclick='renameComponent(" + components[i].id + ");'></td></tr>";
			}
			$('#Edit_Context #components').html(s);
		},
		"json"
	);
	
	// Все компоненты из этого проекта/из всех доступных проектов ("Варианты")
	
	showVariants();
	
	// Мета-данные
	
	$('#meta_data').html('');
	
	jQuery.post('server/Meta.php', { act : 3, sess_id: document.session_id }, // GetMetaData
		function(meta) 
		{			
			var s = "";
			
			for(var i = 0; i < meta.length; i++)
			{
				var z = '';
				
				if(meta[i].type == 1 || meta[i].type == 2 || meta[i].type == 4) // Строка, число, ссылка редактируются одинаково
				{
					z = '<input id="meta_data_'+i+'" type="text" style="width: 100%" onchange="saveMetaData(\'' + meta[i].name + '\', \'meta_data_'+i+'\', ' + meta[i].type + ', ' + meta[i].mtid + ')">';
				}
				else if(meta[i].type == 3) // Дата
				{
					z = '<input class="datepicker_meta" id="meta_data_'+i+'" type="text" value="'+meta[i].data+'" onchange="saveMetaData(\'' + meta[i].name + '\', \'meta_data_'+i+'\', ' + meta[i].type + ', ' + meta[i].mtid + ')"><input type="hidden" id="meta_data_'+i+'_hidden">'; 
				}
				
				s += "<tr><td width='20%'>" + meta[i].name + "</td><td width='5%'>" + mt[meta[i].type] + "</td><td width='*'>" + z + "</td></tr>";
			}
			
			$('#meta_data').append(s);
			
			for(var i = 0; i < meta.length; i++) // Настройка календарей и заполнение полей
			{
				$('#meta_data_'+i).val(meta[i].data);
				
				if(meta[i].type == 3) // Дата
				{
					var e = $("#meta_data_"+i);
					e.datepicker({ dateFormat: "dd.mm.yy", altField: "#meta_data_"+i+"_hidden", altFormat: "yy-mm-dd" });
					if(e.val() != '')
					{
						e.datepicker('setDate', new Date(meta[i].data));
					}
				}
			}
		},
		"json"
	);
	
	// Комментарии
	
	getCommentsContext();

	// Автоматическое имя для нового (возможного) контекста
	
	jQuery.post('server/Main/GetAutoNameForNewContext.php', { sess_id: document.session_id }, // GetAutoNameForNewContext
		function(name) 
		{
			$('#new_context_name2').val(name);
		},
		"json"
	);
}

function renameComponent(id,n,img)
{
	newName = prompt ("Введите новое имя компонента:", defaultText="");
	newName = trimLeading(trimTrailing(newName)); 
	if (newName)
	{
		 // Проверяем: вдруг компонент с таким именем уже добавлено в этом контексте?
		
		if(is_added($('#Edit_Context #components tr td:first-child'), htmlspecialchars(newName)))
		{
			alert('Поле "'+newName+'" уже добавлено!');
			return;
		}
		
		if (n!=2)
		{
			$('#Edit_Context #component_'+id+' td.component_id').text(newName);			
		}
		var ren=function(img)
        {
               jQuery.post('server/Main.php', { act : 49, newName: newName, id : id, sess_id: document.session_id },
                    function(idnew) {
                        if (n == 2) {
                            $('#componentName_' + id + '.component_a').text(newName);
                            $(".component_a" + id).text(newName + ", ");
                            $("#componentName_" + id)[0].id = "componentName_" + idnew;

                            $(".component_a" + id).each(
                                    function(i) {
                                        $(this).removeClass();
                                        $(this).addClass("component_a" + idnew);
                                    }
                            );

                            $('#componentName_' + idnew + '.component_a').unbind('click');
                            $('#componentName_' + idnew + '.component_a').click((function(id) {
                                return function() {
                                    assignComponentToField(idnew, 2);
                                    return false;
                                };
                            })(id));
                            $(img).unbind("click");
                            $(img).click(
                                    function() {
                                        //cpmTable.fnGetData(this.parentNode)[3] id нажатого компонента
                                        renameComponent(idnew, 2, img);
                                    }
                            );
                        }
                    },
                    "json"
            );
        };
        ren(img);
		
	}	
}

function saveContext()
{	
	jQuery.post('server/Main.php', { act : 17, name : $('#context_name').val().replace(/\'/g, "\\'"), text : $('#context_text').val().replace(/\'/g, "\\'"), sess_id: document.session_id }	); // SaveContext
}						

function addComponent(comp)
{	
	 // Проверяем: вдруг компонент с таким именем уже добавлен в этом контексте?
	
	if(is_added($('#Edit_Context #components tr td:first-child'), htmlspecialchars(comp)))
	{
		alert('Компонент "'+comp+'" уже добавлен!');
		return;
	}
	
	if(comp != '') // Не добавляем пустые компоненты (возможно, условие будет более строгим)
	{
		$('#loader').show();
		
		jQuery.post('server/Main.php', { act : 18, comp : comp, sess_id: document.session_id }, // AddComponent 
			function(id)
			{
				$('#Edit_Context #components').append("<tr id='component_" + id + "'><td class='component_id'>" + htmlspecialchars(comp) + "</td><td align='right' width='10'><img src='images/icons/delete.png' onclick='deleteComponent(" + id + ");'></td>"+
				"<td align='right' width='10'><img src='images/icons/edit.png' title='Переименовать' onclick='renameComponent(" + id + ");'></td></tr>");
				$('#loader').hide();
			},
			'json'
		);
	}
}

function deleteComponent(id)
{
	$('#Edit_Context #components #component_'+id).remove();
	jQuery.post('server/Main.php', { act : 19, compid : id, sess_id: document.session_id }); // DeleteComponent
}


function getElementComputedStyle(elem, prop)
{
  if (typeof elem!="object") elem = document.getElementById(elem);
  
  // external stylesheet for Mozilla, Opera 7+ and Safari 1.3+
  if (document.defaultView && document.defaultView.getComputedStyle)
  {
    if (prop.match(/[A-Z]/)) prop = prop.replace(/([A-Z])/g, "-$1").toLowerCase();
    return document.defaultView.getComputedStyle(elem, "").getPropertyValue(prop);
  }
  
  // external stylesheet for Explorer and Opera 9
  if (elem.currentStyle)
  {
    var i;
    while ((i=prop.indexOf("-"))!=-1) prop = prop.substr(0, i) + prop.substr(i+1,1).toUpperCase() + prop.substr(i+2);
    return elem.currentStyle[prop];
  }
  
  return "";
}
function mouseLayerXY(e)
{
  if (!e) {e = window.event; e.target = e.srcElement;}
  var x = 0;
  var y = 0;
  
  if (e.layerX)//Gecko
  {
    x = e.layerX - parseInt(getElementComputedStyle(e.target, "border-left-width"));
    y = e.layerY - parseInt(getElementComputedStyle(e.target, "border-top-width"));
  }
  else if (e.offsetX)//IE, Opera
  {
    x = e.offsetX;
    y = e.offsetY;
  }
  
  return {"x":x, "y":y};
}
function showMap()
{
	$('#Edit_Project #Map #smap tr').remove();
	
	jQuery.post('server/Main.php', { act : 20, activity_id: $('#activity_list').val(), sess_id: document.session_id }, // GetMap
		function(mapt) 
		{			
			var sz = mapt.length;
			
			/*********************************************************************************************/
			// Преобразуем полученную оптимизированную по размеру (треугольную) карту в полную (квадратную)
			
			var map = Array(sz+1);
			
			for(var i = 0; i < sz+1; i++)
				map[i] = Array(sz+1);
				
			map[0][0] = '';
				
			for(var i = 1; i < sz+1; i++)
			{
				map[i][0] = map[0][i] = mapt[i-1][0].replace(/%\-%/g,'"');
			}
				
			for(var i = 1; i < sz+1; i++)
			{
				map[i][i] = 0; // Диагональный элемент всегда = 0
				
				for(var j = 1; j < i; j++)
				{
					map[i][j] = map[j][i] = mapt[i-1][j]; // Матрица симметричная
				}
			}	
			sz = map.length;						
					
			/*********************************************************************************************/
			
			var s = '';
			
			for(var i = 0; i < sz; i++)
			{
				s += '<tr align="center">';
				
				for(var j = 0; j < map[i].length; j++)
				{
					s += '<td>'+map[i][j]+'</td>';
				}
				
				s += '</tr>';
			}
			
			$('#Edit_Project #Map #smap').append(s);
		},
		"json"
	);
	
	changeForm('project','Map');
}

function showUsers()
{
	/*$('#Edit_Project #userlist tr').remove();
	
	var users = GetProjectUsers();
	
	s = '';
	
	for(var i = 0; i < users.length; i++)
	{
		s += '<tr><td>'+users[i].login+'</td><td>';
		
		var img;
		if(users[i].online == '1')
			img = 'images/icons/user_green.png';
		else
			img = 'images/icons/user_red.png';
			
		s += '<img src="'+img+'"></td></tr>';
	}
	
	$('#Edit_Project #userlist').append(s);
	
	changeForm('project','Users');
	*/
	
	alert('Не портировано!');
}

function saveMetaData(name, id, type, mtid)
{
	var data = $('#'+id).val();
	
	if(type < 1)
	{
		alert('Ошибка типа метаданных!');
		return;
	}
	
	if(type == 1)
	{
		data = data.replace(/^\s+|\n|\s+$/g,''); // Удаление пробелов в начале и в конце и переводов строк
		$('#'+id).val(data);
	}
	else if(type == 2)
	{
		// Проверка на Int
		if(!/^-?\d+$/.test(data))
		{
			alert('В этом метаполе должно быть целое число!');
			$('#'+id).val('');
			return;
		}
	}
	else if(type == 3)
	{
		// Дата
		data = $('#'+id+'_hidden').val();
	}
	else if(type == 4)
	{
		data = data.replace(/^\s+|\n|\s+$/g,''); // Удаление пробелов в начале и в конце и переводов строк
		
		// Проверка ссылки
		var re = /^((http|https|ftp)\:\/\/|www\.).+/i;
		if(!re.test(data))
		{
			alert('Ошибочный формат ссылки!');
			return;
		}
	}
	
	jQuery.post('server/Meta.php', { act : 4, name : name, data : data, type : type, mtid: mtid, sess_id: document.session_id } ); // SaveMetaData
}

function shareForUser()
{
	var user = $('#shared_user_name').val();
	
	$('#shared_user_name').val(''); // Очистим поле
	
	// А вдруг пользователь уже имеет доступ к проекту? Нам не нужно дублирование данных!
	
	var exists = is_added($('#shared_users tr td:first-child'), user);
	
	if(exists)
	{
		alert('Пользователь "'+user+'" уже имеет доступ к проекту.');
		return;
	}
	
	jQuery.post('server/Users.php', { act : 1, user : user, sess_id: document.session_id }, // ShareForUser
		function(s) 
		{			
			if(s.res)
			{
				$('#shared_users').append('<tr><td>'+user+'</td></tr>');
			}
			else
			{
				alert('Пользователь "'+user+'" не зарегистрирован!');
			}
		},
		"json"
	);
}

function showProjectInfo(id)
{	
	// Сначала очистим старые данные
	
	$('#Edit_Project #tags').html('');
	$('#project_meta_fields tr:not(:last)').remove();
	$('#shared_users').html(''); // Очищаем список пользователей
	$('#shared_user_name').val(''); // Очищаем поле 'добавления' нового пользователя
	$('#new_project_meta_field_name').val('');
	
	// Покажем мета-поля
	
	jQuery.post('server/Meta.php', { act : 6, sess_id: document.session_id }, // GetProjectMetaFields
		function(meta) 
		{
			var s = "";
			
			for(var i = 0; i < meta.length; i++)
			{
				s += "<tr><td>" + meta[i].name + "</td><td><input class='meta' id='project_meta_field_" + meta[i].name + "'></td><td>" + mt[meta[i].type] + "</td><td><img src='images/icons/delete.png' onclick=''></td><tr>";
			}
			
			$('#project_meta_fields tr:last').before(s);
		},
		"json"
	);
	
	// Пользователи с доступом к проекту
	
	jQuery.post('server/Users.php', { act : 2, sess_id: document.session_id },
		function(users)
		{
			var s = "";
			
			for(var i = 0; i < users.length; i++)
			{
				s += "<tr><td>" + users[i].login + "</td><td>";
			}
			
			$('#shared_users').append(s);
		},
		"json"
	);
	
	// Теги
	
	jQuery.post('server/Main.php', { act : 4, sess_id: document.session_id }, // GetTags
		function(tags) 
		{			
			for(var i = 0; i < tags.length; i++)
			{
				$('#Edit_Project #tags').append('<span id="tag_'+tags[i].id+'"><a href="#" onclick="return false;">'+tags[i].tag+'</a><img src="images/icons/tag_blue_delete.png" onclick="deleteTag('+tags[i].id+')">, </span>');
			}
		},
		"json"
	);
	
	loadActivities();
	
	getComments();
	
	changeForm('main','Edit_Project');
	changeForm('project','Project');
}

function addTag()
{
	var tag = $('#Edit_Project #tag_name').val();
	
	if(is_added($('#Edit_Project #tags a'), htmlspecialchars(tag))) 
	{
		alert('Тег "'+tag+'" уже добавлен к этому проекту!');
	}
	else
	{
		$('#loader').show();
		
		jQuery.post('server/Main.php', { act : 8, tag : tag, sess_id: document.session_id }, // AddTag
			function(id)
			{
				$('#Edit_Project #tags').append('<span id="tag_'+id+'"><a href="#" onclick="return false;">'+htmlspecialchars(tag)+'</a><img src="images/icons/tag_blue_delete.png" onclick="deleteTag('+id+')">, </span>');
				$('#loader').hide();
			},
			'json'
		);
	}
	
	$('#Edit_Project #tag_name').val('');
	
	$('#New_Project_Comment_btn').attr('disabled', false);
}

function deleteTag(id)
{
	$('#Edit_Project #tags #tag_'+id).remove();
	jQuery.post('server/Main.php', { act : 31, tagid : id, sess_id: document.session_id }); // DeleteTag
}

function addProjectMetaField()
{	
	var e = $('#new_project_meta_field_name');
	var e2 = $('#new_project_meta_field');
	$('#project_meta_fields tr:last').before("<tr><td>" + htmlspecialchars(e.val()) + "</td><td><input class='meta' id='project_meta_field_" + e.val() + "'></td><td>" + mt[e2.val()] + "</td><td><img src='images/icons/delete.png' onclick=''></td></tr>"); // TODO: нужно оперировать с идентификаторами метаполей
	
	// Отправим на сервер
	
	jQuery.post('server/Meta.php', { act : 5, name : e.val().trim(), type : e2.val(), sess_id: document.session_id } ); // AddMetaField
	
	e.val('');
}

function addMetaField()
{	
	var e = $('#new_meta_field_name');
	var e2 = $('#new_meta_field');
	
	var name = e.val().trim();
	
	if(is_added($('#meta_fields tr td:first-child'), htmlspecialchars(name)))
	{
		alert('Мета-поле "'+name+'" уже добавлено к контекстам этого проекта!');
	}
	else if(name == '')
	{
		alert('Название мета-поля не может быть пустым!');
	}
	else
	{
		$('#loader').show();
		// Отправим на сервер		
		jQuery.post('server/Meta.php', { act : 1, name : name, type : e2.val(), sess_id: document.session_id },// AddMetaField
			function(id)
			{			
				$('#meta_fields tr:last').before("<tr id='metafield_" + id + "'><td class='metafield_id'>" + htmlspecialchars(name) + "</td><td>" + mt[e2.val()] + "<td><input type='checkbox' class='visible' id="+id+" checked disabled></td></td><td><img src='images/icons/delete.png' onclick=''></td><td><img src='images/icons/edit.png' title='Переименовать' onclick='renameMetaField("+id+")'></td></tr>");
				$('#loader').hide();
			}
		);
	}
	
	e.val('');
}

function showReport()
{
	// Очистка
	
	$('#Report #report_fields tr:not(:first)').remove();
	$('#Report a').hide();
	
	// Сначала получим контексты
	
	jQuery.post('server/Main.php', { act : 5, sess_id: document.session_id }, // GetProjectContexts();
		function(cont) 
		{
			// Поля
			
			jQuery.post('server/Field/GetFieldsWithContexts', { activity_id: $('#activity_list').val(), sess_id: document.session_id }, // GetFieldsWithContexts
				function(fields) 
				{
					for(var i = 0; i < fields.length; i++) 
					{				
						$('#Report #report_fields').append("<tr id='rf_"+fields[i].id+"'><td>"+fields[i].name+"</td><td><select></select></td></tr>");
						
						for(var j = 0; j < fields[i].contexts.length; j++)
						{
							$('#Report #report_fields #rf_'+fields[i].id+' select').append("<option value='"+fields[i].contexts[j].id+"'>"+fields[i].contexts[j].name+"</option>");
						}
					}
				},
				"json"
			);	
		},
		"json"
	);
	
	changeForm('project','Report'); // Показываем форму
}

function createReport()
{
	$('#loader').show(); // Индикатор загрузки

	var ctxid = '';
	
	$('#Report #report_fields select').each(
		function(i)
		{
			ctxid += $(this).val() + '%,%';
		}
	);

	addslashes = function(str)
	{
		str=str.replace(/\\/g,'\\\\');
		str=str.replace(/\'/g,'\\\'');
		str=str.replace(/\"/g,'\\"');
		str=str.replace(/\0/g,'\\0');
		return str;
	};
	
	var g = addslashes($('#sp_graph').html());
	
	jQuery.post('server/Users.php', { act : 3, graph : g, contexts : ctxid, activity_id: $('#activity_list').val(), sess_id: document.session_id },  // CreateReport
		function(ids) 
		{
			$('#Report a').attr('href','users/'+ids[0]+'/'+ids[1]+'/report.html');
			$('#Report a').show();

			$('#loader').hide(); // Спрятать индикатор загрузки
		},
		"json"
	);
}

function joinFields()
{
	alert('Функция пока не реализована!');
}

function loadFieldsForImport(proj_id)
{
	$('#fid_fields').html('');
	
	jQuery.post('server/Field/LoadFieldsForImport', {id : proj_id, sess_id: document.session_id },  // LoadFieldsForImport
		function(fields)
		{
			var s = '';
			for(var i = 0; i < fields.length; i++)
			{
				s += '<tr><td><a href="#" onclick="doFieldsImport(\'' + fields[i].id + '\', ' + proj_id + ')">' + fields[i].name + '</a></td></tr>';
			}
			$('#fid_fields').append(s);
		},
		"json"
	);
}

function doFieldsImport(id, from)
{
	jQuery.post('server/Field/DoFieldsImport.php', {id : id, from : from, sess_id: document.session_id }); // DoFieldsImport
	showFields(); // Обновим форму
}

function importFields()
{
	$('#fid_projects').html('');
	$('#field_import_dialog').dialog('open');
	
	jQuery.post('server/Main.php', { act : 39, sess_id: document.session_id },  // GetProjectsWithTags
		function(projs)
		{
			var s = '';
			for(var i = 0; i < projs.length; i++)
			{
				s += '<tr><td><a href="#" onclick="loadFieldsForImport(' + projs[i].id + '); return false;">' + projs[i].name + '</a></td></tr>';
			}
			$('#fid_projects').append(s);
		},
		"json"
	);
}

function deleteFields()
{
	alert('Функция пока не реализована!');
}

function createActivity()
{
	jQuery.post('server/Main.php', { act : 44, name: $('#new_activity_name').val(), sess_id: document.session_id }, // CreateActivity
		function(id) 
		{
			$('#activity_list').append('<option value="'+id+'">'+htmlspecialchars($('#new_activity_name').val())+'</option>');
			$('#new_activity_name').val('');
		},
		"json"
	);
}

function activityChange()
{	
	$('.activity_list_span').html($('#activity_list option:selected').html());
	
	jQuery.post('server/Activity/SelectActivity.php', { id: $('#activity_list').val(), sess_id: document.session_id }, // Выбор набора активности
		function(res) 
		{
			if(!res)
			{
				alert("Не удалось выбрать набор активности! Обратитесь в тех. поддержку.");
				return;
			}
			
			if(typeof contexts != 'undefined')
			{
				var s = '';
				for(var i = 0; i < contexts.length; i++)
					s += contexts[i]+",";
				
				jQuery.post('server/Main.php', { act : 45, contexts:  s, sess_id: document.session_id }, // GetActivityContexts
					function(active) 
					{
						$('.activate_ctx').attr('checked', false); // Сначала обнулим все флажки
						
						for(var i = 0; i < active.a.length; i++)
							$('#active_ctx_'+active.a[i]).attr('checked', true);
						
						$("#contexts_list #activate_all_contexts").attr('checked', active.is_all_active==1);
					},
					"json"
				);
			}
		},
		"json"
	);
}

function showVariants()
{	
	makeTable = function(components)
	{
		var s = "<table width='100%' style='margin-right:15px'><thead><tr><th>Компонент</th><th>Ссылок</th></tr></thead><tbody>";
		
		for(var i = 0; i < components.length; i++) 
		{
			s += "<tr id='comp_variants_"+components[i].id+"'><td><a href='#' onclick='addComponent(\"" + components[i].c + "\"); $(\"#comp_variants_"+components[i].id+"\").remove(); return false;'>" + components[i].c + "</a></td><td>" + components[i].cnt + "</td></tr>";
		}
		
		s += "</tbody></table>";
		
		$('#component_vars').html(s);
		
		cvarTable = $("#component_vars table").dataTable({
			"oLanguage": { "sUrl": "lib/jquery/datatables/language/ru_RU.txt" },
			"sDom": 'tp',
			"iDisplayLength": 25,
			"aaSorting": [[1,'desc']],
			"aoColumns": [
				{ "sWidth": "10", "sType" : "natural" },
				{"sType" : "numeric"}
			]
	  	});
		
		$('#Edit_Context #new').keyup(function() 
			{
				cvarTable.fnFilter(this.value, 0); // Фильтрация вариантов компонентов
			}
		);

	};
	
	if($('#show_all_avail_components').attr('checked'))
	{
		// Компоненты из других доступных проектов ("Варианты")
		
		jQuery.post('server/Main.php', { act : 30, sess_id: document.session_id }, // GetComponentsFromAvailableProjects
			function(components) 
			{
				makeTable(components);
			},
			"json"
		);
	}
	else
	{
		// Все компоненты из этого проекта ("Варианты")
		
		jQuery.post('server/Main.php', { act : 46, sess_id: document.session_id }, // GetComponentsFromThisProject
			function(components) 
			{
				makeTable(components);
			},
			"json"
		);
	}
}

function slideAllComponents()
{
	var b = ($('#img_slaf').attr('src') == 'images/icons/eye.png');
	$('#Fields .field_eye').each(function(i)
	{
		if(b) 
		{
			$(this).attr('src', 'images/icons/eye_close.png'); // Разворачиваем список, вставляем иконку закрытого глаза
			$(this).attr('title', 'Скрыть список компонентов');
		}
		else
		{
			$(this).attr('src', 'images/icons/eye.png'); // Сворачиваем список, вставляем иконку открытого глаза
			$(this).attr('title', 'Показать список компонентов');
		}
		$(this).tooltip({showURL: false});
	});
	
	if(b)
	{
		$('#Fields tr div').slideDown();
		$('#img_slaf').attr('src', 'images/icons/eye_close.png');
	}
	else
	{
		$('#fields div').slideUp();
		$('#img_slaf').attr('src', 'images/icons/eye.png');
	}
}

function prevContext()
{
	jQuery.post('server/Main/GetPrevNextContext.php', { prev_or_next: 1, sess_id: document.session_id }, // 1 - значит предыдущий
		function(res)
		{
			if(res[0])
			{
				window.location.hash = '#Context_'+document.current_project_id+'_'+res[0];
			}
		},
		'json'
	);
}

function nextContext()
{
	jQuery.post('server/Main/GetPrevNextContext.php', { prev_or_next: 2, sess_id: document.session_id }, // 2 - значит следующий
		function(res)
		{
			if(res[0])
			{
				window.location.hash = '#Context_'+document.current_project_id+'_'+res[0];
			}
		},
		'json'
	);
}

function loadActivities()
{
	var t = $('#activity_list').html();
	
	// Activities (из вкладки контекстов)
	
	jQuery.ajax({ url: 'server/Main.php', async: false, data: { act : 43, sess_id: document.session_id }, // GetActivities
		type: 'POST', 
		dataType: "json",
		success: function(a) 
		{ 
			var s = '';
			
			for(var i = 0; i < a.length; i++)
			{
				s += "<option value=\""+a[i].id+"\">"+a[i].name+"</option>";
			}
			
			if(t != s) // Если ничего не поменялось, то ничего делать не будем
			{
				$('#activity_list').html(s);
			
				activityChange();
			}
		} 
	});
}

template_project_comment = '<div class="comment" id="Project_Comment_{id}"><div class="comment_header"><img src="images/icons/user_comment.png" alt="От:"> {login}, {add_time}</div>' +
'<div class="comment_body">{text} <p class="comment_reply"><a href="#" id="otvet_{id}">Ответить</a> </p> </div></div>';

template_context_comment = '<div class="comment" id="Context_Comment_{id}"><div class="comment_header"><img src="images/icons/user_comment.png" alt="От:"> {login}, {add_time}</div>' +
'<div class="comment_body">{text} <p class="comment_reply"><a href="#" id="otvet_{id}">Ответить</a> </p> </div></div>';

function addComment(parent_id)
{	
	var text = $('#New_Project_Comment_text').val();
	if (text!="")
	{
		$('#pcomment_processing').show();
		$('#New_Project_Comment_btn').hide();
		jQuery.post('server/Main/AddComment.php',{text:text, Parent_id:parent_id, sess_id: document.session_id},
			function(ret)
			{		
				var id = ret.id;
		
				$('#New_Project_Comment_btn').unbind('click');
			
				$('#New_Project_Comment').before($.nano(template_project_comment, ret));
				$('#Project_Comment_'+id+' *').filter('.comment_header').addClass("comment_header_my");
			
				$('#otvet_'+id).click(				
					function()
					{
						$('#New_Project_Comment_btn').unbind('click');
					
						var temp = $('#New_Project_Comment');
						temp.remove();
						$('#Project_Comment_'+id).append(temp);
					
						$('#New_Project_Comment_btn').click(function() { addComment(id); });
					
						$('#btnFieldDown').click(function()
							{
								var temp = $('#New_Project_Comment');
								temp.remove();
								$('#Project_Comments').append(temp);
						
								$('#New_Project_Comment_btn').click(function() { addComment(0); });
								return false;
							}
						);
					
						return false;
					}
				);	
				var temp = $('#New_Project_Comment');
				temp.remove();
				$('#Project_Comments').append(temp);
			
				$('#New_Project_Comment_btn').click(function() { addComment(0); });
			
				$('#New_Project_Comment_text').val(''); // Очистка поля ввода
			
				$('#pcomment_processing').hide();
				$('#New_Project_Comment_btn').show();
			},
			'json'
		);
	}
}

function getComments()
{	
	var temp = $('#New_Project_Comment');
	temp.remove();
		
	$('#Project_Comments').html('');
	
	$('#Project_Comments').append(temp);
	
	jQuery.post('server/Main/GetComments.php',{sess_id: document.session_id},
		function(comments)
		{	
			for (var i=0; i< comments.length;i++)
			{
				var c = $.nano(template_project_comment, comments[i]);
				
				if (comments[i].Parent_id==0)
				{
					$('#New_Project_Comment').before(c);
				}
				else 
				{
					$('#Project_Comment_'+comments[i].Parent_id).append(c);
				}
				
				if (comments[i].login==$('#user_login').html())
				{
					$('#Project_Comment_'+comments[i].id+' *').filter('.comment_header').addClass("comment_header_my");
				}
				
				(function (id)
				{
					$('#otvet_'+id).click(
						(function()
						{
							$('#New_Project_Comment_btn').unbind('click');
							
							var temp = $('#New_Project_Comment');
							temp.remove();
							
							$('#Project_Comment_'+id).append(temp);
							
							$('#New_Project_Comment_btn').click(function() { addComment(id); });
							
							$('#btnFieldDown').click(function()
								{
									var temp = $('#New_Project_Comment');
									temp.remove();
									$('#Project_Comments').append(temp);
								
									$('#New_Project_Comment_btn').click(function() { addComment(0); });
									return false;
								}
							);
							
							return false;
						})
					);
				})(comments[i].id);
			}
			$('#New_Project_Comment_btn').click(function() { addComment(0); });
		},
		'json'
	);
}

function addCommentContext(parent_id)
{
	var text = $('#New_Context_Comment_text').val();
	if (text!="")
	{
		$('#ccomment_processing').show();
		$('#New_Context_Comment_btn').hide();
	
	
		jQuery.post('server/Main/AddCommentContext.php',{text:text,Parent_id:parent_id, sess_id: document.session_id},
			function(ret)
			{		
				var id = ret.id; 
		
				$('#New_Context_Comment_btn').unbind('click');
			
				$('#New_Context_Comment').before($.nano(template_context_comment, ret));
				$('#Context_Comment_'+id+' *').filter('.comment_header').addClass("comment_header_my");
				
				$('#otvet_'+id).click(				
					function()
					{
						$('#New_Context_Comment_btn').unbind('click');
						
						var temp = $('#New_Context_Comment');
						temp.remove();
						$('#Context_Comment_'+id).append(temp);
						
						$('#New_Context_Comment_btn').click(function() { addCommentContext(id); });
						
						$('#btnCommentFieldDown').click(function()
							{
								var temp = $('#New_Context_Comment');
								temp.remove();
								$('#Context_Comments').append(temp);
							
								$('#New_Context_Comment_btn').click(function() { addCommentContext(0); });
								return false;
							}
						);
						
						return false;
					}
				);		
				var temp = $('#New_Context_Comment');
				temp.remove();
				$('#Context_Comments').append(temp);
				
				$('#New_Context_Comment_btn').click(function() { addCommentContext(0); });
				
				$('#New_Context_Comment_text').val(''); // Очистка поля ввода
				
				$('#ccomment_processing').hide();
				$('#New_Context_Comment_btn').show();
			},
			'json'
		);
	}
}

function getCommentsContext()
{	
	var temp = $('#New_Context_Comment');
	temp.remove();
		
	$('#Context_Comments').html('');
	
	$('#Context_Comments').append(temp);
	
	jQuery.post('server/Main/GetCommentContext.php',{sess_id: document.session_id},
		function(comments)
		{				
			for (var i=0; i< comments.length;i++)
			{
				var c = $.nano(template_context_comment, comments[i]);
				
				if (comments[i].Parent_id==0)
				{
					$('#New_Context_Comment').before(c);
				}
				else 
				{
					$('#Context_Comment_'+comments[i].Parent_id).append(c);
				}
				
				if (comments[i].login==$('#user_login').html())
				{
					$('#Context_Comment_'+comments[i].id+' *').filter('.comment_header').addClass("comment_header_my");
				}
				
				(function (id)
				{
					$('#otvet_'+id).click(
						(function()
						{
							$('#New_Context_Comment_btn').unbind('click');
							
							var temp = $('#New_Context_Comment');
							temp.remove();
							$('#Context_Comment_'+id).append(temp);
							
							$('#New_Context_Comment_btn').click(function() { addCommentContext(id); });
							
							$('#btnCommentFieldDown').click(function()
								{
									var temp = $('#New_Context_Comment');
									temp.remove();
									$('#Context_Comments').append(temp);
								
									$('#New_Context_Comment_btn').click(function() { addCommentContext(0); });
									return false;
								}
							);
							
							return false;
						})
					);
				})(comments[i].id);
			}
			
			$('#New_Context_Comment_btn').click(function() { addCommentContext(0); });
		},
		'json'
	); 
}

function renameProject()
{
	var newName = $("#rename_project").val();
	if (trimLeading(trimTrailing(newName)))
	{
		jQuery.post('server/Main/RenameProject.php',{sess_id: document.session_id, newName: newName},
			function()
			{
				$("#rename_project").val("");
				$("#project_name").val(newName);
			},
			'json'
		);
		$("#rename_project").val("");
		$("#project_name").html(newName);	
		 
	}
}

function renameContext()
{
	newName = prompt ("Введите новое имя контекста:", defaultText="");
	newName = trimLeading(trimTrailing(newName)); 
	if (newName)
	{
		jQuery.post('server/Main/RenameContext.php',{sess_id: document.session_id, newName: newName},
			function(res)
			{
				if (res) $("#context_name").val(newName);
			},
			'json'
		);		 
	}
}

