function argument(id, text_rep, type, connections)
{
  	this.id = id
  	this.text_rep = text_rep;
    this.type = type;
    this.error = false;
    this.tooltip = '';
    this.connections = connections;
}

function arguments_form_change(lastActualValueIdx, arg_id, this_form, lemma_id) {	
    form_data = this_form.serializeArray();
    this_dialog = this_form.closest("$[id$='-dialog']");
  
  	if(!arg_id)
  	{
  	  form_data = prepareArgFormData(this_form, form_data, lastActualValueIdx);
      form_data.push({name: 'arg_id', value: ''});
    }
    else
      form_data.push({name: 'arg_id', value: arg_id});
    
    data = JSON.stringify(form_data);
    
    positionArguments = '';
    if(arg_id) {
    	this_dialog.data('positionArguments', '');
    }
    else {
    	positionArguments = this_dialog.data('positionArguments');
    }

    phraseologic = false;
    selectedArgId = null;
    selectedFrame = this_dialog.data('selectedFrame');
    if(this_dialog.data('selectedArgId')) {
    	selectedArgId = this_dialog.data('selectedArgId');
    	this_dialog.data('selectedArgId', '');
    }
    if(!selectedFrame) {
    	selectedFrame = '';
    }
    else {
    	phraseologic = selectedFrame.is_phraseologic;
    }
    
    var lexArgChoosing = false;
    var positionOrArgumentsArgChoosing = false;
    var creatingEditingNewRealization = false;
    if(this_dialog.dialog( "option" , "title").startsWith("Wybieranie")) {
    	lexArgChoosing = true;
    }
    else if(this_dialog.dialog( "option" , "title").startsWith("Tworzenie typu frazy") ||
    		 this_dialog.dialog( "option" , "title").startsWith("Zmiana typu frazy")) {
    	positionOrArgumentsArgChoosing = true;
    }
    else if(this_dialog.dialog( "option" , "title").startsWith("Tworzenie rozwinięcia typu frazy") ||
   		 	 this_dialog.dialog( "option" , "title").startsWith("Zmiana rozwinięcia typu frazy")) {
    	creatingEditingNewRealization = true;
   }
    else if(this_dialog.dialog( "option" , "title").startsWith("Dodawanie")) {
    	phraseologic = false;
    }
    
    this_dialog.empty();
    this_dialog.load(ajax_argument_form, {'form_data': data,
    									  'lemma_id': lemma_id,
        								  'position_arguments': JSON.stringify(positionArguments),
        								  'selected_arg': selectedArgId,
        								  'phraseologic': phraseologic,
        								  'lex_arg_choosing': lexArgChoosing,
        								  'position_or_arguments_arg_choosing': positionOrArgumentsArgChoosing,
        								  'creating_editing_new_realization': creatingEditingNewRealization});
} 

function prepareArgFormData(form, form_data, lastActualValueIdx) {
    var freq_coordinated = '';
    var opinion = '';
    var type = '';
    var values = [];
    
    form_data = $.map(form_data, function(elem)
    {
      //alert(elem.name+'  '+elem.value);
      if (!elem.name.startsWith('arg_type') && 
    	  !elem.name.startsWith('value') &&
    	  elem.name != 'freq_coordinated' &&
    	  elem.name != 'opinion')
        return elem;
      else {
    	  if (elem.name == 'freq_coordinated')
          	freq_coordinated = elem.value;
    	  else if (elem.name.startsWith('arg_type'))
          	type = elem.value;
    	  else if (elem.name == 'opinion')
              opinion = elem.value;
      }
    });
    
    var subforms = form.find('#subform');
    subforms.each(function() {
    	var subform = $(this);
    	var subform_values = [];
    	var subform_data = subform.find("input, textarea, select").serializeArray();
    	$.map(subform_data, function(elem) {
	      if (!elem.name.startsWith('value'))
	        return elem;
	      else {
	        if (elem.name.startsWith('value'))
	        	subform_values.push(elem.value);
	      }
    	});
    	values.push(subform_values);
    });

    form_data.push({name: 'arg_type', value: type});
    if(lastActualValueIdx >= 0 && values && 
			  lastActualValueIdx < values.length) 
    	values = values.splice(0, lastActualValueIdx);
    form_data.push({name: 'subform_values', value: values});
    form_data.push({name: 'freq_coordinated', value: freq_coordinated});
    form_data.push({name: 'opinion', value: opinion});
	
    return form_data
}

function argument_form_submit() {
    ShowProgressAnimation();
    var this_form = $(this);
    var this_dialog = this_form.closest("$[id$='-dialog']");
    
    lemma_id = window.lemma_id;
    if (typeof(lemma_id) === 'undefined')
    	lemma_id = null;
    
    form_data = this_form.serializeArray();
    form_data = prepareArgFormData(this_form, form_data, -1);
    if(this_dialog.dialog( "option" , "title").startsWith("Wybieranie")) 
    	form_data.push({name: 'lex_arg_choosing', value: true});
    else
    	form_data.push({name: 'lex_arg_choosing', value: false});
    
    $.ajaxJSON({
      method: 'post',
      url: ajax_argument_form_submit,
      data: {
        form_data: form_data
      },

    callback: function(result) {    
      var arg = new argument(result["id"], result["text_rep"], result["type"], []);
      
      // dodawanie argumentow
      if(this_dialog.dialog( "option" , "title").startsWith("Dodawanie"))
      {
        selected_pos = getElementInstance(selected_id, schemas);
        selected_pos['element'].arguments.push(arg);
        window.selected_id = -1;
        
        scrollPosition = $('#new-frame-tables').scrollTop();
        draw_filtered_frames(window.schemas, 'new-frame-tables', 'new-frame-table', 'frame_filter', window.nkjp_examples, 'ActiveFrameTable', window.lemma_entry);
        $('#new-frame-tables').scrollTop(scrollPosition);

        frames_modif = frames_modif.slice(0, frames_modif_idx+1);     
        var lemma_version = new Lemma_Version(schemas, window.nkjp_examples, window.nkjp_lemma_examples);
        frames_modif.push(lemma_version);
        frames_modif_idx++;
        window.change = true;
        
      }
      // edycja argumentow
      else if (this_dialog.dialog( "option" , "title").startsWith("Edycja"))
      {
        edited_arg = getElementInstance(edited_id, schemas);
        edited_arg['element'].id = arg.id;
        edited_arg['element'].text_rep = arg.text_rep;
        edited_arg['element'].type = arg.type;
          
        // przepisywanie przykladow ze starej instancji argumentu na nowa
        var ids = parseId(edited_id);
        var frame_tabId = 'frame_'+ids['frame_id']+'_';
        var arg_tabId = 'arg_'+ids['arg_id']+'_';
        var new_arg_tabId = 'arg_'+arg.id+'_';
        
        // podmienianie identyfikatorow argumentow na rzecz przypisywania do nich przykladow
        if(window.selectedFrameIdNkjp == frame_tabId && window.selectedArgumentsIdNkjp.indexOf(arg_tabId) != -1)
          window.selectedArgumentsIdNkjp = window.selectedArgumentsIdNkjp.replace(arg_tabId, new_arg_tabId)  
        
        for(var i=0; i<window.nkjp_examples.length; i++)
        {
          if(window.nkjp_examples[i].frame_id == frame_tabId)
          {
            for(var j=0; j<window.nkjp_examples[i].arguments_ids.length; j++)
            {
              if(window.nkjp_examples[i].arguments_ids[j] == edited_id)
              {
                window.nkjp_examples[i].arguments_ids[j] = window.nkjp_examples[i].arguments_ids[j].replace(arg_tabId, new_arg_tabId);
              }
            }
          }
        }
        
        scrollPosition = $('#new-frame-tables').scrollTop();
        draw_filtered_frames(window.schemas, 'new-frame-tables', 'new-frame-table', 'frame_filter', window.nkjp_examples, 'ActiveFrameTable', window.lemma_entry);
        $('#new-frame-tables').scrollTop(scrollPosition);

        frames_modif = frames_modif.slice(0, frames_modif_idx+1);     
        var lemma_version = new Lemma_Version(schemas, window.nkjp_examples, window.nkjp_lemma_examples);
        frames_modif.push(lemma_version);
        frames_modif_idx++;
        window.change = true;
        
      } 
      // tworzenie nowych argumentow
      else if (this_dialog.dialog( "option" , "title").startsWith("Tworzenie typu frazy")) {
    	  var dialogParent = this_dialog.data('origParentElement');
    	  var argumentsElement = dialogParent.children("$[id$='-arguments']").first();
    	  argumentsElement.append("<p id='argument'>"+result['text_rep']+"<input id='id_value' type='hidden'  name='value' value='"+result["id"]+"'/>" +
    	  		"<button type='button' id='edit-argument'>Edytuj</button><button type='button' id='remove-argument'>Usuń</button></p>");
      }
      // zmiana argumentu (edycja argumentow przy leksykalizacji np. jesli leksykalizowany jest compar)
      else if (this_dialog.dialog( "option" , "title").startsWith("Zmiana typu frazy")) {
    	  var dialogParent = this_dialog.data('origParentElement');
    	  var argumentsElement = dialogParent.children("$[id$='-arguments']").first();
    	  var editedArgDiv = this_dialog.data('editedArgDiv');
    	  editedArgDiv.remove();
    	  argumentsElement.append("<p id='argument'>"+result['text_rep']+"<input id='id_value' type='hidden'  name='value' value='"+result["id"]+"'/>" +
    	  		"<button type='button' id='edit-argument'>Edytuj</button><button type='button' id='remove-argument'>Usuń</button></p>");
      }
      
      // tworzenie nowych rozwiniec typu frazy (na potrzeby podtypow xp w lexach)
      else if (this_dialog.dialog( "option" , "title").startsWith("Tworzenie rozwinięcia typu frazy")) {
    	  var dialogParent = this_dialog.data('origParentElement');
    	  var argumentsElement = dialogParent.children("$[id$='-arguments']").first();
    	  argumentsElement.append("<p id='argument'>"+result['text_rep']+"<input id='id_value' type='hidden'  name='value' value='"+result["id"]+"'/>" +
    	  		"<button type='button' id='edit-realization'>Edytuj</button><button type='button' id='remove-argument'>Usuń</button></p>");
      }
      // zmiana rozwiniec typu frazy (edycja utworzonych typow fraz w lexach dla podtypow xp np.)
      else if (this_dialog.dialog( "option" , "title").startsWith("Zmiana rozwinięcia typu frazy")) {
    	  var dialogParent = this_dialog.data('origParentElement');
    	  var argumentsElement = dialogParent.children("$[id$='-arguments']").first();
    	  var editedArgDiv = this_dialog.data('editedArgDiv');
    	  editedArgDiv.remove();
    	  argumentsElement.append("<p id='argument'>"+result['text_rep']+"<input id='id_value' type='hidden'  name='value' value='"+result["id"]+"'/>" +
    	  		"<button type='button' id='edit-realization'>Edytuj</button><button type='button' id='remove-argument'>Usuń</button></p>");
      }
      
      // wypelnianie atrybutu argument
      else if (this_dialog.dialog( "option" , "title").startsWith("Wybieranie")) {
    	  var dialogParent = this_dialog.data('origParentElement');
    	  var argumentElement = dialogParent.children("$[id$='-argument']").first();
    	  argumentElement.empty();
    	  argumentElement.append(result['text_rep']+"<input id='id_value' type='hidden'  name='value' value='"+result["id"]+"'/>");
    	  if (lemma_id) { // edytujemy haslo
    		  arguments_form_change(1, null, dialogParent.closest(".argument-add-form"), lemma_id);
    	  } 
    	  // tworzymy typy fraz
    	  else {
    		  //arguments_form_change(1, null, dialogParent.closest(".argument-add-form"), '');
    		  realization_arguments_form_change(1, '', false, dialogParent.closest(".argument-add-form"));
    	  }
      }
      this_dialog.dialog('close'); 
      HideProgressAnimation();	
    },
    error_callback: function(xhr, status, error) {
      HideProgressAnimation();
      error_alert(status + ': ' + error);
    },
    bad_data_callback: function(result) {
      if (result) {
          HideProgressAnimation();
          error_alert(result);
          return false;
      }
      else
      {
        HideProgressAnimation();
        return true;
      }
    },
  });
  return false;
}

function openSelectArgumentDialog(event, lemma_id) {
	  var form_data = '';
	  var formDivParent = $(event.target).parent();
	  var argId = formDivParent.find('#id_value').first().val();
	  if(argId) {
		  form_data = [{name: 'arg_id', value: argId}];
	  }
	  var data = JSON.stringify(form_data);
	  
	  formDivParent.append("<div id="+formDivParent.attr('id')+"-argument-form-dialog></div>");
	  var form_div = formDivParent.children("$[id$='-argument-form-dialog']").first();
	  form_div.data('positionArguments', '')
	  		  .data('origParentElement', formDivParent)
	  		  .load(ajax_argument_form, {'form_data': data,
		  			'lemma_id': lemma_id,
		  			'position_arguments': '',
		  			'selected_arg': '',
		  			'phraseologic': false,
		  			'lex_arg_choosing': true,
		  			'creating_editing_new_realization': false})
		  	  .dialog({ autoOpen: true, 
		  				modal: 'true',
		  				title: 'Wybieranie typu frazy:',
		  				close: function(event, ui)
		  		        {
		  		            $(this).dialog('destroy').remove();
		  		        }});
}

function openAddArgumentDialog(event, lemma_id, dialogTitle) {
	  var formDivParent = $(event.target).parent();
	  formDivParent.append("<div id="+formDivParent.attr('id')+"-argument-form-dialog></div>");
	  var form_div = formDivParent.children("$[id$='-argument-form-dialog']").first();
	  var creatingEditingNewRealization = false;
	  if(dialogTitle.startsWith("Tworzenie rozwinięcia typu frazy")) {
		  creatingEditingNewRealization = true;
	  }
	  form_div.data('positionArguments', '')
	  		  .data('origParentElement', formDivParent)
	  		  .load(ajax_argument_form, 
	  			   {'form_data': '',
		  			'lemma_id': lemma_id,
		  			'position_arguments': '',
		  			'selected_arg': '',
		  			'phraseologic': false,
		  			'position_or_arguments_arg_choosing': true,
		  			'creating_editing_new_realization': creatingEditingNewRealization})
		  	  .dialog({ autoOpen: true, 
		  				modal: 'true',
		  				title: dialogTitle,
		  				close: function(event, ui)
		  		        {
		  		            $(this).dialog('destroy').remove();
		  		        }});
}

function edit_argument() {
	var clickedButton = $(this);
	if(typeof(window.lemma_id) == "undefined")
		openEditArgumentDialog(null, clickedButton, "Zmiana typu frazy:");
	else
		openEditArgumentDialog(window.lemma_id, clickedButton, "Zmiana typu frazy:");
}

function edit_realization() {
	var clickedButton = $(this);
	if(typeof(window.lemma_id) == "undefined")
		openEditArgumentDialog(null, clickedButton, "Zmiana rozwinięcia typu frazy:");
	else
		openEditArgumentDialog(window.lemma_id, clickedButton, "Zmiana rozwinięcia typu frazy:");
}

function openEditArgumentDialog(lemma_id, editButton, dialogTitle) {
	  var editedArgDiv = editButton.parent();
	  var argId = editedArgDiv.find('#id_value').first().val();
	  var formData = [{name: 'arg_id', value: argId}];
	  var formDivParent = editButton.closest('#subform');
	  var data = JSON.stringify(formData);
	  formDivParent.append("<div id="+formDivParent.attr('id')+"-argument-form-dialog></div>");
	  var form_div = formDivParent.children("$[id$='-argument-form-dialog']").first();
	  var creatingEditingNewRealization = false;
	  if(dialogTitle.startsWith("Zmiana rozwinięcia typu frazy")) {
		  creatingEditingNewRealization = true;
	  }
	  
	  form_div.data('positionArguments', '')
	  		  .data('origParentElement', formDivParent)
	  		  .data('editedArgDiv', editedArgDiv)
	  		  .load(ajax_argument_form, 
	  			   {'form_data': data,
		  			'lemma_id': lemma_id,
		  			'position_arguments': '',
		  			'selected_arg': '',
		  			'phraseologic': false,
		  			'position_or_arguments_arg_choosing': true,
		  			'creating_editing_new_realization': creatingEditingNewRealization})
		  	  .dialog({ autoOpen: true, 
		  				modal: 'true',
		  				title: dialogTitle,
		  				close: function(event, ui)
		  		        {
		  		            $(this).dialog('destroy').remove();
		  		        }});
}

function openAddPositionDialog(event) {
	  var formDivParent = $(event.target).parent();
	  formDivParent.append("<div id="+formDivParent.attr('id')+"-position-form-dialog></div>");
	  var form_div = formDivParent.children("$[id$='-position-form-dialog']").first();
	  
	  form_div.load(ajax_create_position_form)
	  		  .data('origParentElement', formDivParent)
	  		  .dialog({ autoOpen: true, 
						modal: 'true',
						title: 'Tworzenie pozycji:',
						close: function(event, ui)
						{
							$(this).dialog('destroy').remove();
						}});
}

function remove_position() {
	$(this).parent().remove();
}

function edit_position() {
	var clickedButton = $(this);
	openEditPositionDialog(clickedButton);
}

function openEditPositionDialog(editButton) {
	  var editedPosDiv = editButton.parent();
	  var formDivParent = editButton.closest('#subform');
	  var posId = editButton.parent().find('#id_value').first().val()
	  
	  formDivParent.append("<div id="+formDivParent.attr('id')+"-position-form-dialog></div>");
	  var form_div = formDivParent.children("$[id$='-position-form-dialog']").first();
	  form_div.load(ajax_create_position_form, 
 			   {'position_id': posId})
 			  .data('editedPosDiv', editedPosDiv)
	  		  .data('origParentElement', formDivParent)
	  		  .dialog({ autoOpen: true, 
						modal: 'true',
						title: 'Zmiana pozycji:',
						close: function(event, ui)
						{
							$(this).dialog('destroy').remove();
						}});
}

function remove_argument() {
	$(this).parent().remove();
}

function create_position_form_submit() {
    ShowProgressAnimation()
    var this_form = $(this);
    var this_dialog = this_form.closest("$[id$='-dialog']");
    var args = [];
    var category = '';
    form_data = this_form.serializeArray();
    form_data = $.map(form_data, function(elem)
    {
      if (elem.name != 'category' && 
    	  elem.name != 'value')
        return elem;
      else {
        if (elem.name == 'category')
          category = elem.value;
        else if (elem.name == 'value')
          args.push(elem.value);
      }
    });
  
    
    form_data.push({name: 'category', value: category});
    form_data.push({name: 'arguments', value: args});

    $.ajaxJSON({
      method: 'post',
      url: ajax_create_position_form_submit,
      data: {
        form_data: form_data
      },

    callback: function(result) {
  	  var dialogParent = this_dialog.data('origParentElement');
	  var positionsElement = dialogParent.children("$[id$='-positions']").first();
	  positionsElement.append("<p id='position'>"+result['text_rep']+
				"<input id='id_value' type='hidden'  name='value' value='"+result['id']+"'/>"+
		  		"<button type='button' id='edit-position'>Edytuj</button><button type='button' id='remove-position'>Usuń</button></p>");
      // jesli edytowalismy pozycje, to usun stara wersje
      if (this_dialog.dialog( "option" , "title").startsWith("Zmiana")) {
    	  var editedPosDiv = this_dialog.data('editedPosDiv');
    	  editedPosDiv.remove();
      }
      this_dialog.dialog('close');
      HideProgressAnimation();	
    },
    error_callback: function(xhr, status, error) {
      HideProgressAnimation();
      error_alert(status + ': ' + error);
    },
    bad_data_callback: function(result) {
      if (result == 'no arguments') {
        HideProgressAnimation();
        error_alert('Pozycja musi zawierać przynajmniej jeden typ frazy.');
        return false;
      }
      else
      {
        HideProgressAnimation();
        return true;
      }
    },
  });
  return false;
}

function show_argument_realizations()
{
    var this_form = $(this).closest('form');
    var this_dialog = this_form.closest("$[id$='-dialog']");
    form_data = this_form.serializeArray();
    form_data = prepareArgFormData(this_form, form_data, -1);
    form_data.push({name: 'manage', value: false});
    data = JSON.stringify(form_data);
    this_form.parent().children('#realizations').first().load(ajax_show_realizations, {'form_data' : data});
    this_dialog.dialog( "option", "height", 400 );
    return false;
}