var control = "meanings";
var op = "none";
var arg = "";
window.units_operations = [];
window.frames_operations = [];
var highlighted_id = "";
var highlighted_class = "";
var semantics_selected_id = "";

var relations_creating = ["hiponimia", "synonimia", "nie umiem umieścić"];

//////////////////////////// Control ////////////////////////////

function prepareControl() {  
    $(".semantics-control-tabs").tabs().bind('tabsselect', function(event, ui) {
        if(ui.panel.id == 'select_meanings') {
        	control="meanings";
        	frameClick("");
        	$('#assign_role').attr('disabled', "True");
        	$('#add_preference').attr('disabled', "True");
            $('#delete').attr('disabled', "True");
        } 
        else if(ui.panel.id == 'select_creating') {
        	control="connect";
            frameClick("");
            $('#assign_role').attr('disabled', "True");
            $('#add_preference').attr('disabled', "True");
            $('#delete').attr('disabled', "True");
        }
   });
}

function alertSemantics() {
    alert("Nie można modyfikować semantyki. Zapisz zmiany w składni.");
}

function alertOldSchemas() {
	alert('Działanie niemożliwe, wyświetlona wersja składni jest nieaktualna.');
}

/////////////////////////// Meanings ////////////////////////////
function hide() {
    $("#synset_input").css('visibility', 'hidden');
}
        
function reveal() {
    $("#synset_input").css('visibility', '');
}

function changeSynsetInput() {
    if (parseInt($("#synset_input_relation").val()) == 2) {
        hide();
    } else {
        reveal();
    }
}

function openMeaningsMenu() {
    if(window.lemma_id != getActualLemmaId(window.lemma_id)){
    	alertOldSchemas();
    }
    else {
    	displayMeanings();
    }
}

function displayMeanings() {

    var submitInitialState =
                function(e,v,m,f){ 
                    e.preventDefault();

                    if (v == 1) {
                        $.prompt.goToState('state1');
                    }
                    if (v == 2) {
                        if (f.meaning >= 0) {
                            if (isPlWNUnit(f.meaning)) {
                                $.prompt.goToState('state22');
                            } else {
                                $.prompt.goToState('state21');
                            }
                        } else {
                            if (f.meaning <= 0) {
                                $.prompt.goToState('state21');
                            } else {
                                // $.prompt.goToState('state20');
                                alert('Nie wybrano żadnego znaczenia!');
                            }
                        }
                    }
                    if (v == 3) {
                        if ((typeof f.meaning) == 'undefined') {
                            alert('Nie wybrano żadnego znaczenia!');
                        } else {
			    $.prompt.removeState('state3');
			    $.prompt.addState('state3', 
					      {
						title: 'Modyfikuj glossę', 
						html: 'Jednostka leksykalna: ' + getLexicalUnit(f.meaning) + '<br />' + 
						      '<label>Glossa <input type="text" name="glossa" value="' + getGlossa(f.meaning) + '"></label><br />', 
						buttons: glossa_buttons, 
						focus: 1, 
						submit: submitGlossa
					      }, 
					      'state22');
			    $.prompt.goToState('state3');
			}
                    }
                    if (v == 4) {
                        if ((typeof f.meaning) == 'undefined') {
                            alert('Nie wybrano żadnego znaczenia!');
                        } else {
			    var i = indexOfId(lexical_units, f.meaning);

			    $.prompt.removeState('state4');
			    $.prompt.addState('state4', 
					      {
						title: 'Podepnij przykłady do ' + getLexicalUnit(f.meaning), 
						html: getExamples(f.meaning), 
						buttons: examples_assignment_buttons, 
						focus:1, 
						submit: submitExamplesAssignment
					      }, 
					      'state22');
			    $.prompt.goToState('state4');
			}
                    }
                    if (v == 5) {
                        saveMeanings();
                        displayFrames();
		                $.prompt.close();  
		            }
		            
	            };
    var initial_state_buttons = { "Dodaj znaczenie": 1, "Usuń znaczenie": 2, "Modyfikuj glossę": 3, "Ustaw przykłady": 4, "Koniec": 5 };

    var submitGlossa = 
                function(e,v,m,f){ 
                    e.preventDefault();

                    if (v == -1) {
                        $.prompt.goToState('state0');
                    }
                    if (v == 1) {
                        setGlossa(f.meaning, f.glossa[1]); // TODO: WHY f.glossa[1]?
                        $.prompt.removeState('state0');
                        $.prompt.addState('state0', {title: 'Znaczenia', html: getMeanings(), buttons: initial_state_buttons, focus: 4, submit: submitInitialState}, 'state1');
                        $.prompt.goToState('state0');
                    }
                    
	            };
    var glossa_buttons = { "Anuluj": -1, "Potwierdź": 1 };

    var submitExamplesAssignment = 
                function(e,v,m,f){ 
                    e.preventDefault();
                    
                    var connect = normalizeFormData(f.connect);

                    if (v == -1) {
                        $.prompt.goToState('state0');
                    }
                    if (v == 1) {
                        setExamples(f.meaning, connect);
                        $.prompt.removeState('state0');
                        $.prompt.addState('state0', {title: 'Znaczenia', html: getMeanings(), buttons: initial_state_buttons, focus: 4, submit: submitInitialState}, 'state1');
                        $.prompt.goToState('state0');
                    }
                    
	            };
    var examples_assignment_buttons = { "Anuluj": -1, "Potwierdź": 1 };

    var addLexicalUnitLocation =
        function(e,v,m,f){
            // arg = "frame_26_comp_36_"

            if (v == -1) {
                e.preventDefault();
                $.prompt.goToState('state1');
            }        
            if (v == 0) {
                e.preventDefault();
                $.prompt.goToState('state0');
            }
            if (v == 1) {
                e.preventDefault();
                if (parseInt(f.relation) != 2) {
                    $.prompt.removeState('state12');
                    $.prompt.addState('state12', {title: 'Znaczenia', html: getFormContent(f) + getRelation(f) + "w stosunku do:<br />" + getSynsets(f.context, part_of_speech), buttons: {Wstecz: -1, Anuluj: 0, Zatwierdź: 1}, focus: 1, submit: submitSynsetSelection}, 'state11');
                    $.prompt.goToState('state12');
                } else {
                    createLexicalUnit(f.refl, f.glossa, f.relation, -1);
                    $.prompt.removeState('state0');
                    $.prompt.addState('state0', 
                                      {
                                        title: 'Znaczenia', 
                                        html: getMeanings(), 
                                        buttons: initial_state_buttons, 
                                        focus: 4, 
                                        submit: submitInitialState
                                      }, 
                                      'state1');
                    $.prompt.goToState('state0');                
                }
            }
        };
    var add_lexical_unit_location_buttons = { Wstecz: -1, Anuluj: 0, Potwierdź: 1 };

    var getFormContent = 
        function(f) {
	    var result = '';
	    if (part_of_speech == 'czasownik') {
		result += '<label>Zwrotny <input type="checkbox" name="refl" value="true" disabled';
	        if (f.refl == 'true') {
	            result += ' checked';
                }
	        result += '></label><br />';
	    }
            result += '<label>Glossa <input type="text" name="glossa" value="' + f.glossa + '" disabled></label><br />';
	    return result;
        };

    var getRelation = 
        function(f) {
	        return '<label>Relacja <select name="relation" disabled><option value="' + f.relation + '">' + relations_creating[parseInt(f.relation)] + '</option></label></select><br />';
        };
        
    var getRelationsForm =
        function () {
            var result = '<label>Relacja ';
            result += '<select id="synset_input_relation" name="relation" onchange="changeSynsetInput()">';
            result += '<option value="0">' + relations_creating[0] + '</option>';
            result += '<option value="1">' + relations_creating[1] + '</option>';
            result += '<option value="2">' + relations_creating[2] + '</option>';
            result += '</select></label><br />';
            return result;
        };

    var submitSynsetSelection =
        function(e,v,m,f){
            if (v == -1) {
                e.preventDefault();
                $.prompt.goToState('state11');
            }
            if (v == 0) {
                e.preventDefault();
                $.prompt.goToState('state0');
            }
            if (v == 1) {
                e.preventDefault();
                if ((typeof f.synset) == 'undefined') {
                    alert('Nie wybrano żadnego synsetu!');
                } else {
                    createLexicalUnit(f.refl, f.glossa, f.relation, f.synset);
                    $.prompt.removeState('state0');
                    $.prompt.addState('state0', 
                                      {
                                        title: 'Znaczenia', 
                                        html: getMeanings(), 
                                        buttons: initial_state_buttons, 
                                        focus: 4, 
                                        submit: submitInitialState
                                      }, 
                                      'state1');
                    $.prompt.goToState('state0');
                }
            }
        };

    var addMeaningsHtml =
        function() {
	    var result = '';
	    if (part_of_speech == 'czasownik') {
		result += '<label>Zwrotny <input type="checkbox" name="refl" value="true"></label><br />';
	    }
            result += '<label>Glossa <input type="text" name="glossa" value=""></label><br />';
	    return result;
        };
    
    var display_meanings = {
            state0: {
	            title: 'Znaczenia',
	            html: getMeanings(),
	            buttons: initial_state_buttons,
	            focus: 4,
	            submit: submitInitialState,
            },
            state1: {
	            title: 'Dodawanie znaczenia',
	            html: addMeaningsHtml(),
	            buttons: { "Anuluj": -1, "Potwierdź": 1 },
	            focus: 1,
	            submit:function(e,v,m,f){ 
                    e.preventDefault();
                    if (v == -1) {
                        $.prompt.goToState('state0');
                    }
                    if (v == 1) {
                        $.prompt.removeState('state11');
                        $.prompt.addState('state11', 
                                          {
                                            title: 'Miejsce w Słowosieci', 
                                            html: getFormContent(f) + getRelationsForm() + "<label id=\"synset_input\">w stosunku do <input id=\"plWN_context_selection\" type=\"text\" name=\"context\"></label>",
                                            buttons: add_lexical_unit_location_buttons,
                                            focus: 1, 
                                            submit: addLexicalUnitLocation
                                          }, 
                                          'state1');
                        $.prompt.goToState('state11');
                        attachPlWNContextAutocomplete();
                    }
	            }
            },
            state21: {
	            title: 'Usuwanie znaczenia',
	            html: 'Czy chcesz usunąć znaczenie?',
	            buttons: { "Nie": -1, "Tak": 1 },
	            focus: 1,
	            submit:function(e,v,m,f){ 
                    e.preventDefault();
                    if (v == -1) {
                        $.prompt.goToState('state0');
                    }
                    if (v == 1) {
                        destroyLexicalUnit(f.meaning);
                        $.prompt.removeState('state0');
                        $.prompt.addState('state0', {title: 'Znaczenia', html: getMeanings(), buttons: initial_state_buttons, focus:4, submit: submitInitialState}, 'state1');
                        $.prompt.goToState('state0');
                    }
	            }
            },
            state22: {
	            title: 'Usuwanie znaczenia',
	            html: 'Nie można usunąć znaczenia ze Słowosieci',
	            buttons: { "Ok": 1 },
	            focus: 1,
	            submit:function(e,v,m,f){ 
                    e.preventDefault();
                    $.prompt.goToState('state0');
	            }
            },
            state20: {
	            // title: 'Usuwanie znaczenia',
	            html: 'Nie wybrano żadnego znaczenia',
	            buttons: { "Ok": 1 },
	            focus: 1,
	            submit:function(e,v,m,f){ 
                    e.preventDefault();
                    $.prompt.goToState('state0');
	            }
            },
        };
    if (change == true) {
        alertSemantics();
    } else {
        $.prompt(display_meanings,
		 {close:function(e){
		     window.units_operations = [];
		     $.getJSON(ajax_units, {lemma_id: window.lemma_id}, function(data){
			 memorizeLexicalUnits(data.lexical_units);
			 basicLexicalUnitsData(data.informations);
		     })}});
    }
    
}
/////////////////////// Creating (Frames) ///////////////////////
function createFrame() {

    var create_frame = {
            state0: {
	            title: 'Tworzenie ramy',
	            html: getMeaningsSelection(),
	            buttons: { "Anuluj": -1, "Potwierdź": 1 },
	            focus: 1,
	            submit:function(e,v,m,f){ 
                    e.preventDefault();
                    if (v == -1) {
                        $.prompt.close();
                    }
                    if (v == 1) {
                    
                        var units;
                        if ((typeof f.meaning) == 'string') {
                            units = [f.meaning];
                        } else {
                            units = f.meaning;
                        }
			if ((typeof units) == 'undefined') {
			    units = [];
			}
                    
                        frameClick("");
                        newFrame(units);
                        displayFrames();
                        
                        $.prompt.close();
                    }
	            }
            },
        };
    if (change == true) {
        alertSemantics();
    } else {
        $.prompt(create_frame);
    }
    
}

function changeLexicalUnits() {

    var getRelation = 
        function(f) {
	        return '<label>Relacja <select name="relation" disabled><option value="' + f.relation + '">' + relations_creating[parseInt(f.relation)] + '</option></label></select><br />';
        };

    var getRelationsForm =
        function () {
            var result = '<label>Relacja ';
            result += '<select id="synset_input_relation" name="relation" onchange="changeSynsetInput()">';
            result += '<option value="0">' + relations_creating[0] + '</option>';
            result += '<option value="1">' + relations_creating[1] + '</option>';
            result += '<option value="2">' + relations_creating[2] + '</option>';
            result += '</select></label><br />';
            return result;
        };

    var units = [];
    var mwes = [];
    var new_mwes = [];
    var old_mwes = [];
    var a = "";
    var gloss = "";

    var addPhraseology =
                function(e,v,m,f){
                    e.preventDefault();
                    if (v == -1)
                        $.prompt.goToState('state0');
                    if (v == 0) {
                        $.prompt.close();
                    }
                    if (v == 1) {
                        if ((typeof f.synset) == 'undefined') {
                            alert('Nie wybrano żadnego synsetu!');
                        } else {
			    changeUnits(highlighted_id, units);

			    addPhraseologicalUnits(highlighted_id, units, old_mwes, new_mwes, f.glossa, f.relation, f.synset);

			    frameClick("");
			    displayFrames();
			    frameClick(a);
			    $.prompt.close();
                        }
                    }
                };

    var change_units = {
            state0: {
	            title: 'Zmiana jednostek leksykalnych',
	            html: getMeaningsSelectionForFrame(highlighted_id),
	            buttons: { "Anuluj": -1, "Potwierdź": 1 },
	            focus: 1,
	            submit:function(e,v,m,f){ 
			e.preventDefault();
			if (v == -1) {
			    $.prompt.close();
			}
			if (v == 1) {

                            new_mwes = [];
                            old_mwes = [];
			    units = normalizeFormData(f.meaning);
			    mwes = normalizeFormData(f.mwe);
			    a = semantics_selected_id;

                            if (mwes.length == 0) {
                                changeUnits(highlighted_id, units);
			    
                                frameClick("");
                                displayFrames();
                                frameClick(a);
                                $.prompt.close();
                            } else {
                                 
                                 var i;
                                 for (i = 0; i < mwes.length; i++) {
                                     var lu = mwes[i].split('_')[0];
                                     var id = mwes[i].split('_')[1];
                                     var luid = mwes[i].split('_')[2];
                                     var sid = mwes[i].split('_')[3];
                                     if (sid == '') {
                                         new_mwes.push(lu);
                                     } else {
                                         old_mwes.push({lu: lu, id: parseInt(id), luid: parseInt(luid), sid: parseInt(sid)});
                                     }
                                 }
                                 
                                 if (old_mwes.length > 0) {
                                     var sid = old_mwes[0].sid
                                     var ok = true;
                                     for (i = 0; i < old_mwes.length; i++) {
                                         if (old_mwes[i].sid != sid) {
                                             ok = false;
                                         }
                                     }
                                     if (ok) {
                                         changeUnits(highlighted_id, units);
                                         

                                         addPhraseologicalUnits(highlighted_id, units, old_mwes, new_mwes, old_mwes[0].lu, 1, sid);

                                         frameClick("");
                                         displayFrames();
                                         frameClick(a);
                                         $.prompt.close();
                                     } else {
                                         $.prompt.goToState('state1');
                                         attachPlWNContextAutocomplete();
                                     }
                                 } else {
                                     $.prompt.goToState('state1');
                                     attachPlWNContextAutocomplete();
                                 }
                            }

			}
	            }
            },
            state1: { /* nowa frazeologia */
	            title: 'Nowe jednostki frazeologiczne',
	            html: '<label>Glossa <input type="text" name="glossa" value=""></label><br />' + 
                          getRelationsForm() + "<label id=\"synset_input\">w stosunku do <input id=\"plWN_context_selection\" type=\"text\" name=\"context\"></label>",
	            buttons: { "Wstecz": -1, "Anuluj": 0, "Potwierdź": 1 },
	            focus: 1,
	            submit:function(e,v,m,f){ 
			e.preventDefault();
			if (v == -1) {
			    $.prompt.goToState('state0');
			}
                        if (v == 0) {
                            $.prompt.close();
                        }
			if (v == 1) {
                            if (parseInt(f.relation) != 2) { 
                                /* podana lokalizacja w Słowosieci */
                                $.prompt.removeState('state2');
                                $.prompt.addState('state2',
                                                  {
                                                      title: 'Znaczenia',
                                                      html: '<label>Glossa <input type="text" name="glossa" value="' + gloss + '" disabled></label><br />' + 
                                                            getRelation(f) + "w stosunku do:<br />" + getSynsets(f.context, part_of_speech), 
                                                      buttons: {Wstecz: -1, Anuluj: 0, Zatwierdź: 1}, 
                                                      focus: 1, 
                                                      submit: addPhraseology
                                                  })
                                $.prompt.goToState('state2');
                            } else {
                                /* zignorowane umiejscowienie w Słowosieci */
                                addPhraseologicalUnits(highlighted_id, units, old_mwes, new_mwes, f.glossa, f.relation, -1);
			        frameClick("");
			        displayFrames();
			        frameClick(a)
                                $.prompt.close();
                            }
			}
	            }       
            },
        };
    if (change == true) {
        alertSemantics();
    } else {
        $.prompt(change_units);
    }
    
}

function changeOpinion() {

    var change_opinion = {
            state0: {
	            title: 'Ustawianie statusu ramy',
	            html: getStatusesForFrame(highlighted_id),
	            buttons: { "Anuluj": -1, "Potwierdź": 1 },
	            focus: 1,
	            submit:function(e,v,m,f){ 
                    e.preventDefault();
                    if (v == -1) {
                        $.prompt.close();
                    }
                    if (v == 1) {
                    
                        var opinion = normalizeFormData(f.opinion);
                        if (opinion.length > 0) {
                    
                            var a = semantics_selected_id;
                            setOpinion(highlighted_id, opinion);
                            frameClick("");
                            displayFrames();
                            frameClick(a);
                            
                            $.prompt.close();
                            
                        } else {
                        
                            alert("Nie wybrano żadnego statusu");
                        
                        }
                    }
	            }
            },
        };
    if (change == true) {
        alertSemantics();
    } else {
        $.prompt(change_opinion);
    }
    
}

// assign role to selected complement
function assignRole() {

    var result = false;

    var assign_role = {
            state0: {
                title: 'Wybierz rolę',
                html: roles_display_table,
                buttons: { Anuluj: -1, Zatwierdź: 1 },
                focus: 1,
                close: function(){return result;},
                submit: function(e,v,m,f){ 
                    // arg = "frame_26_comp_36_"
                
                    if (v == -1) {
                        e.preventDefault();
                        $.prompt.close();
                    }
                    if (v == 1) {
                        e.preventDefault();
                        
                        var roles = normalizeFormData(f.roles);

                        var frame_id = parseInt(arg.split('_')[1]);
                        var complement_id = parseInt(arg.split('_')[3]);
                        
                        if (setRole(frame_id, complement_id, roles)) {
                        
                            var h = "frame_" + highlighted_id + "_";
                            var a = arg;
                            
                            // re-draw and re-color frame
                            frameClick(h);
                            displayFrames();
                            frameClick(a);
                            
                            result = true;
                            $.prompt.close();
                            
                        } else {
                            
                            alert("Wybrano niepoprawne role!");
                            
                        }
                    }
                    
                }
            },
        };
    if (change == true) {
        alertSemantics();
    } else {
        $.prompt(assign_role);
    }
    
}

function addSelectivePreference() {

    var submitSynsetSelection = function(e,v,m,f){ 
                    if (v == -1) {
                        e.preventDefault();
                        $.prompt.goToState('state2');                    
                    }
                    if (v == 1) {
                        e.preventDefault();
                        var frame_id = parseInt(arg.split('_')[1]);
                        var complement_id = parseInt(arg.split('_')[3]);
                        var synset = normalizeFormData(f.synset);
                        
                        var i;
                        for (i = 0; i < synset.length; i++) {
                            addPreference(frame_id, complement_id, { type: 's', content: synset[i], text: synsets[indexOfId(synsets, synset[i])].content[0].base + "-" + synsets[indexOfId(synsets, synset[i])].content[0].sense });
                        }
                        $.prompt.goToState('state0');                       
                    }
                }

    var select_preference = {
            state0: {
                title: 'Typ preferencji selekcyjnej',
                html: 'Wybierz typ preferencji selekcyjnej',
                buttons: { Predefiniowana: 1, Słowosieć: 2, Relacja: 3, Koniec: -1 },
                focus: -1,
                submit: function(e,v,m,f){ 
                    if (v == -1) {
                        e.preventDefault();

                        var h = "frame_" + highlighted_id + "_";
                        var a = arg;
                        
                        // re-draw and re-color frame
                        frameClick(h);
                        displayFrames();
                        frameClick(a);

                        $.prompt.close();
                    }
                    if (v == 1) {
                        e.preventDefault();
                        $.prompt.goToState('state1');
                            
                    } 
                    if (v == 2) {
                        e.preventDefault();
                        $.prompt.goToState('state2');
                            
                    } 
                    if (v == 3) {
                        e.preventDefault();
                        $.prompt.goToState('state3');
                            
                    } 
                }
            },
            state1: {
                title: 'Wybierz preferencję selekcyjną',
                html: predefinedSelect(),
                buttons: { Anuluj: -1, Zatwierdź: 1 },
                focus: 1,
                submit: function(e,v,m,f){
                    // arg = "frame_26_comp_36_"
                
                    if (v == -1) {
                        e.preventDefault();
                        $.prompt.goToState('state0');
                    }
                    if (v == 1) {
                        e.preventDefault();
                        var frame_id = parseInt(arg.split('_')[1]);
                        var complement_id = parseInt(arg.split('_')[3]);
                        var predef = normalizeFormData(f.predef);
                        
                        var i;
                        for (i = 0; i < predef.length; i++) {
                            addPreference(frame_id, complement_id, { type: 'g', content: predef[i], text: predefined[indexOfId(predefined, predef[i])].content });
                        }
                        $.prompt.goToState('state0');
                    }
                }
            },
            state2: {
                title: 'Wybierz preferencję selekcyjną',
                html: "<input id=\"plWN_context_selection\" type=\"text\" name=\"context\">",
                buttons: { Anuluj: -1, Wyszukaj: 1 },
                focus: 1,
                submit: function(e,v,m,f){
                    // arg = "frame_26_comp_36_"
                
                    if (v == -1) {
                        e.preventDefault();
                        $.prompt.goToState('state0');
                    }
                    if (v == 1) {
                        e.preventDefault();
                        $.prompt.removeState('state21');
                        $.prompt.addState('state21', {title: 'Znaczenia', html: getSynsets(f.context), buttons: {Anuluj: -1, Zatwierdź: 1}, focus: 1, submit: submitSynsetSelection}, 'state2');
                        $.prompt.goToState('state21');
                    }
                }
            },
            state3: {
                title: 'Wybierz relację i argument',
                html: relationArgument(arg),
                buttons: { Anuluj: -1, Zatwierdź: 1 },
                focus: 1,
                submit: function(e,v,m,f){
                    // arg = "frame_26_comp_36_"
                
                    if (v == -1) {
                        e.preventDefault();
                        $.prompt.goToState('state0');
                    }
                    if (v == 1) {
                        e.preventDefault();
                        
                        var frame_id = parseInt(arg.split('_')[1]);
                        var complement_id = parseInt(arg.split('_')[3]);
                        var rel = normalizeFormData(f.rel);
                        var args = normalizeFormData(f.arg);
                        
                        var i, j;
                        for (i = 0; i < rel.length; i++) {
                            var text = [];
                            for (j = 0; j < args.length; j++) {
                                var list = args[j].split(',');
                                var k;
                                for (k = 0; k < list.length; k++) {
                                    text.push(role_name[list[k]]);
                                }
                                addPreference(frame_id, complement_id, {type: 'r', content: { relation: rel[i], to: args[j] }, text: relations[indexOfId(relations, rel[i])].content + "<br>-> [" + text + "]" });
                            }
                        }
                        
                        $.prompt.goToState('state0');
                    }
                }
            },
        };
    if (change == true) {
        alertSemantics();
    } else {
        $.prompt(select_preference);
        attachPlWNContextAutocomplete();
    }

}

function removeFromFrame() {
    if (change == true) {
        alertSemantics();
        return;
    }
    if (op == "none") {
    }
    if (op == "add_argument") {
        // highlighted_id = "26"

        removeFrame(highlighted_id);
	
        frameClick("frame_" + highlighted_id + "_");
        displayFrames();
        
    }
    if (op == "add_realization") {
        // arg = "frame_26_comp_36_(lemma_)"
        
        var frame_id = parseInt(arg.split('_')[1]);
        var complement_id = parseInt(arg.split('_')[3]);
        var pos = -1;
        var h = "frame_" + highlighted_id + "_";
        
        frameClick(h);
  
        removeArgument(frame_id, complement_id, arg);
        
        op = "add_argument";
        arg = "";
        
        displayFrames();
        frameClick(h);
        
    }
    if (op == "remove_preference") {
        // arg = "frame_26_comp_36_pref_s1_"
        
        var frame_id = parseInt(arg.split('_')[1]);
        var complement_id = parseInt(arg.split('_')[3]);
        var preference_id = arg.split('_')[5];
        var pos = -1;
        var h = "frame_" + highlighted_id + "_";
        
        frameClick(h);

        removePreference(frame_id, complement_id, preference_id);
        
        op = "add_argument";
        arg = "";
        
        displayFrames();
        frameClick(h);
        
    }
}

///////////////////////// Frame Sharing /////////////////////////

function sharableFrames() {
    return getDisplay(false, true);
}

function shareFrame() {

    var share_frame = {
	state0: {
	    title: 'Współdzielona rama',
	    html: sharableFrames(),
	    buttons: { Anuluj: -1, Zatwierdź: 1 },
	    focus: 1,
	    submit: function(e,v,m,f) {
		if (v == -1) {
		    e.preventDefault();
		    $.prompt.close();
		}
		if (v == 1) {
		    var frames = normalizeFormData(f.frames);
		    var i;
		    for (i = 0; i < frames.length; i++) {
			frame_content[frames[i]].visible = true;
		    }
		    displayFrames();
		    e.preventDefault();
		    $.prompt.close();
		}
	    }
	},
    };
    
    $.prompt(share_frame);
    
}

//////////////////////////// Display ////////////////////////////

function frameClick(clicked_id) {

    if (clicked_id == "") {
        deselect();
        highlighted_id = "";
        semantics_selected_id = "";
	$('#assign_role').attr('disabled', "True");
	$('#add_preference').attr('disabled', "True");
	$('#delete').attr('disabled', "True");
	$('#multi_lus').attr('disabled', "True");
	$('#change_lus').attr('disabled', "True");
	$('#change_opinion').attr('disabled', "True");
        return;
    }
    
    if (control != "connect") {
        var frame_id = clicked_id.split('_')[1]

        if (highlighted_id != "") {
            deselect();
        }
        
        if (semantics_selected_id == frame_id) {
            highlighted_id = "";
            semantics_selected_id = ""
        } else {
            select(frame_id, clicked_id.split('comp')[0]);
            highlighted_id = frame_id;
            semantics_selected_id = frame_id;
        }
    } else {
        if (clicked_id.split('_').length == 3) {    // frame click
            var frame_id = clicked_id.split('_')[1];
	    var local = true;
	    if (frame_content[frame_id] != null){
		local = frame_content[frame_id].local;
	    }
            
            if (highlighted_id != "") {
                deselect();
            }
            if (semantics_selected_id == clicked_id) {
                highlighted_id = "";
                semantics_selected_id = "";
                op = "none";
                
                $('#assign_role').attr('disabled', "True");
                $('#add_preference').attr('disabled', "True");
                $('#delete').attr('disabled', "True");
		$('#multi_lus').attr('disabled', "True");
                $('#change_lus').attr('disabled', "True");
		$('#change_opinion').attr('disabled', "True");
            } else {
                select(frame_id, clicked_id);
                highlighted_id = frame_id;
                semantics_selected_id = clicked_id;
                op = "add_argument";

                $('#assign_role').attr('disabled', "True");
                $('#add_preference').attr('disabled', "True");
		$('#multi_lus').removeAttr('disabled');
                $('#change_lus').removeAttr('disabled');
		if (!local) {
                    $('#delete').attr('disabled', "True");
		    $('#change_opinion').attr('disabled', "True");
		} else {
                    $('#delete').removeAttr('disabled');
		    $('#change_opinion').removeAttr('disabled');
		}
            }
        } else if (clicked_id.split('_')[4] == 'lemma') { // part of lemma click
            frame_id = clicked_id.split('_')[1]
	    var local = true;
	    if (frame_content[frame_id] != null){
		local = frame_content[frame_id].local;
	    }
            
            if (highlighted_id != "") {
                deselect();
            }
            if (semantics_selected_id == clicked_id) {
                highlighted_id = "";
                semantics_selected_id = "";
                op = "none";
                
                $('#assign_role').attr('disabled', "True");
                $('#add_preference').attr('disabled', "True");
                $('#delete').attr('disabled', "True");
		$('#multi_lus').attr('disabled', "True");
                $('#change_lus').attr('disabled', "True");
		$('#change_opinion').attr('disabled', "True");
            } else {
                select(frame_id, clicked_id);

                highlighted_id = frame_id;
                semantics_selected_id = clicked_id;
                op = "add_realization";
                arg = clicked_id //.split('pref')[0]
                
                $('#assign_role').attr('disabled', "True");
                $('#add_preference').attr('disabled', "True");
		$('#multi_lus').removeAttr('disabled');
                $('#change_lus').removeAttr('disabled');
		if (!local) {
                    $('#delete').attr('disabled', "True");
		    $('#change_opinion').attr('disabled', "True");
		} else {
                    $('#delete').removeAttr('disabled');
		    $('#change_opinion').removeAttr('disabled');
		}
            }
        } else { // argument click
            frame_id = clicked_id.split('_')[1]
	    var local = true;
	    if (frame_content[frame_id] != null){
		local = frame_content[frame_id].local;
	    }
            
            if (highlighted_id != "") {
                deselect();
            }
            if (semantics_selected_id == clicked_id) {
                highlighted_id = "";
                semantics_selected_id = "";
                op = "none";
                
                $('#assign_role').attr('disabled', "True");
                $('#add_preference').attr('disabled', "True");
                $('#delete').attr('disabled', "True");
		$('#multi_lus').attr('disabled', "True");
                $('#change_lus').attr('disabled', "True");
		$('#change_opinion').attr('disabled', "True");
            } else {
                select(frame_id, clicked_id);

                highlighted_id = frame_id;
                semantics_selected_id = clicked_id;
                if(clicked_id.split('_').length == 5) {        
                    op = "add_realization";
                } else {
                    op = "remove_preference";
                }
                arg = clicked_id //.split('pref')[0]

		if (!local) {
                    $('#assign_role').attr('disabled', "True");
                    $('#add_preference').attr('disabled', "True");
                    $('#delete').attr('disabled', "True");
		    $('#change_opinion').attr('disabled', "True");
		} else {
                    $('#assign_role').removeAttr('disabled');
                    $('#add_preference').removeAttr('disabled');
                    $('#delete').removeAttr('disabled');
		    $('#change_opinion').removeAttr('disabled');
		}
		$('#multi_lus').removeAttr('disabled');
                $('#change_lus').removeAttr('disabled');
            }
        }
    }
}

function select(frame_id, clicked_id) { 
    
    redrawSchemas(frame_id);
    getDisplayedExamples(frame_id);
    displayExamples();
    fadeSchemas();
    highlighted_id = frame_id;
    brightenSchemasForDisplayedExamples();
    selectFrame(frame_id, clicked_id);
    
}   

function deselect() {

    redrawSchemas();
    displayed_examples = [];
    clearExampleArgumentsSelection();
    displayExamples();
    deselectFrame();
    deselectSchema();
    brightenSchemas();

} 

function selectFrame(frame_id, clicked_id) {

    $("#frame_" + frame_id + "_").css('background-color', 'LightSteelBlue');
    
    var i;
    var roles = frame_content[frame_id].display.roles;
    for (i = 0; i < roles.length; i++) {
        var style = getStyle(frame_id, i)
        $('#' + roles[i].csv_id).css(style.type, style.value);
        var j;
        for (j = 0; j < connected[roles[i].csv_class].length; j++) {
            $('#' + connected[roles[i].csv_class][j]).css(style.type, style.value);
            $('#' + connected[roles[i].csv_class][j]).css('color', '');
            $('#' + functionCsvId(connected[roles[i].csv_class][j])).css(style.type, style.value);
            $('#' + functionCsvId(connected[roles[i].csv_class][j])).css('color', '');
        }
    }

    var lemma = frame_content[frame_id].lemma;
    if (lemma.include) {
        var style = {type: 'background-color', value: 'white'};
        $('#' + lemma.csv_id).css(style.type, style.value);
        var j;
        for (j = 0; j < connected[lemma.csv_class].length; j++) {
            $('#' + connected[lemma.csv_class][j]).css(style.type, style.value);
            $('#' + connected[lemma.csv_class][j]).css('color', '');
            $('#' + functionCsvId(connected[lemma.csv_class][j])).css(style.type, style.value);
            $('#' + functionCsvId(connected[lemma.csv_class][j])).css('color', '');
        }
    }
    
    $("#" + clicked_id).css('border-width', '5px');

}

function deselectFrame() {

	$('[class^=frame_]').each(function(){
		$(this).css('background-color', "");
		$(this).css('background', "");
		$(this).css('border-width', '');
	});
}

function fadeSchemas() {

	$('[class^=schema_]').each(function(){
		$(this).css('color', "#aaaaaa");
		$(this).css('background-color', "#e8e8e8");
	});
	
}


function brightenSchemas() {

	$('[class^=schema_]').each(function(){
		$(this).css('color', "");
		$(this).css('background-color', "");
		$(this).css('background', "");
	});

}

function brightenSchemasForDisplayedExamples() {

    var i;
    for (i = 0; i < displayed_examples.length; i++){
        brightenSchemaArguments(displayed_examples[i].arguments);
    }

}

function brightenSchemaArguments(arguments_list) {

    if (arguments_list.length > 0) {
        brightenSchemaHeader(schemaId(arguments_list[0].id))
        
        var alts = alternations(selectedFrameId(), schemaId(arguments_list[0].id));
        var i, j;   
        for (i = 0; i < arguments_list.length; i++) {
            for (j = 0; j < alts; j++) {
                $('#schema_' + arguments_list[i].id.split('_')[1] + '_pos_' + arguments_list[i].id.split('_')[3] + '_alt_' + (j + 1) + '_').css('color', "");
                $('#schema_' + arguments_list[i].id.split('_')[1] + '_pos_' + arguments_list[i].id.split('_')[3] + '_alt_' + (j + 1) + '_').css('background-color', "");
                $('#' + arguments_list[i].id + 'alt_' + (j + 1) + '_').css('color', "");
		        $('#' + arguments_list[i].id + 'alt_' + (j + 1) + '_').css('background-color', "");
            }
        }
    }

}

function brightenSchemaHeader(schema_id) {

    $("#schema_" + schema_id + '_').css('color', "");
    $("#schema_" + schema_id + '_').css('background-color', "");   
    
}

function getDisplayedExamples(frame_id) {

    var lexical_units = getFrameLexicalUnits(frame_id);
    
    displayed_examples = [];
    
    var i;
    var to_display = false;
    for (i = 0; i < examples.length; i++) {
        to_display = false;
        var j;
        for (j = 0; j < lexical_units.length; j++) {
            if(examples[i].meanings.indexOf(parseInt(lexical_units[j].id)) != -1) {
                to_display = true;
            }
        }
        if (to_display) {
            displayed_examples.push(examples[i]);
        }
    }

}

function displayExamples() {
    
    $("#semantics-examples").html(getDisplayedExamplesTable());
    
}

function getFrameLexicalUnits(frame_id) {

    var selected_lexical_units = [];

    var i;
    for (i = 0; i < lexical_units_frames.length; i++) {
        if (lexical_units_frames[i].indexOf(frame_id) != -1) {
            selected_lexical_units = selected_lexical_units.concat(lexical_units_num[i]);
        }
    }

    return selected_lexical_units;

}

function getDisplayedExamplesTable() {
    var table = '<table id="examples_table" class="ChangeControlTable">';
    
    table += '<tr>';
    table += '<td class="ColumnHeader">Identyfikator:</td>';
    table += '<td class="ColumnHeader">Przykład:</td>';
    table += '<td class="ColumnHeader">Źródło:</td>';
    table += '<td class="ColumnHeader">Ocena:</td>';
    table += '</tr>';
    
    var i;
    for (i = 0; i < displayed_examples.length; i++){
    	var exampleDomId = 'example_' + displayed_examples[i].id;
        table += '<tr id="' + exampleDomId + '" class="ExampleRow">';
        table += '<td ' + 'onclick=showExampleArguments("' + exampleDomId + '")' + '>' + displayed_examples[i].id + '</td>';
        table += '<td ' + 'onclick=showExampleArguments("' + exampleDomId + '")' + '>' + displayed_examples[i].sentence + '</td>';
        table += '<td ' + 'onclick=showExampleArguments("' + exampleDomId + '")' + '>' + displayed_examples[i].source + '</td>';
        table += '<td ' + 'onclick=showExampleArguments("' + exampleDomId + '")' + '>' + displayed_examples[i].opinion + '</td>';
        table += '</tr>';
    }
    
    table += '</table>';
    
    return table;
}

function color(what, how, disconnected_background, disconnected_text) {

    for (i = 0; i < connected[what].length; i++) {
        $('.' + connected[what][i]).css('background-color', how);
        $('.' + what).css('background-color', how);
    }

    capo = frame_id(what)
    for (i = 0; i < disconnected[capo].length; i++) {
        $('.' + disconnected[capo][i]).css('background-color', disconnected_background);
        $('.' + disconnected[capo][i]).css('color', disconnected_text);
    }

}

function schemaClick(class_id, lex) {
    
    var table = roles_display_table;
    if (lex.length != 0){
	table = roles_display_table_full;
    }

    var field_ids;
    if (class_id.split('arg').length == 1) {
        field_ids = position_arguments[class_id].slice();
    } else {
        if (class_id.split('_').length > 7) {
            if (parseInt(class_id.split('_')[5]) < 0) {
                return;
            }
        }
        field_ids = [class_id];
    }

    if (control == "connect") {
        if (op == "none") {
            return;
        }
        if (op == "add_argument") {
            // highlighted_id = "26"
	    var local = frame_content[highlighted_id].local;
	    if (!local) {
		return;
	    }
            var frame_id = parseInt(highlighted_id);

            if (roleFree(frame_id, field_ids)) {

                var choose_role = {
                        state0: {
                            title: 'Wybierz rolę',
                            html: table,
                            buttons: { Anuluj: -1, Zatwierdź: 1 },
                            focus: 1,
                            close: function(){return result;},
                            submit: function(e,v,m,f){ 
                            
                                if (v == -1) {
                                    e.preventDefault();
                                    $.prompt.close();
                                }
                                if (v == 1) {
                                    e.preventDefault();
                                    
                                    var roles = normalizeFormData(f.roles);

                                    // var frame_id = parseInt(highlighted_id);
                                    var complement_id = addArgument(frame_id, field_ids, roles);
                                    
                                    if (complement_id) {
                                        var h = "frame_" + highlighted_id + "_";
                                        var a = complement_id;  //"frame_" + highlighted_id + "_comp_" + complement_id + "_";
                                        
                                        // re-draw and re-color frame
                                        frameClick(h);
                                        displayFrames();
                                        frameClick(a);
                                        
                                        result = true;
                                        $.prompt.close();
                                    } /*else {
                                        alert("Wybrano niepoprawne role!");
                                    } */ 
                                }
                                
                            }
                        },
                    };
                if (change == true) {
                    alertSemantics();
                } else {
                    $.prompt(choose_role);
                }
            } else {
                alert("Nie można ponownie podłączyć tej samej pozycji składniowej");
            }
            
        }
        if (op == "add_realization") {
            if (change == true) {
                alertSemantics();
                return;
            }
            if (arg == "") {
                return;
            } else {
                // arg = "frame_26_comp_36_(lemma_)"
                if (arg.split('_')[4] == 'lemma' && lex.length == 0) {
                    alert("Nie można podłączyć do lematu!");
                    return;
                }
                var frame_id = parseInt(parseInt(arg.split('_')[1]));
                var i, j;
                var can_connect = false;
                if (roleFree(frame_id, field_ids)) {
                    can_connect = true;
                }
                var connect = true;
                for (i = 0; i < field_ids.length; i++) {
                    if (connected[arg].indexOf(field_ids[i]) != -1) {
                    connect = false;
                    break;
                    }
                }
                if (connect && !can_connect) {
                    alert("Nie można ponownie podłączyć tej samej pozycji składniowej");
                } else {
                    for (i = 0; i < field_ids.length; i++) {
                        if (!connect) {
                            // disconnect
                            j = connected[arg].indexOf(field_ids[i])
                            if (j != -1) {
                                connected[arg].splice(j, 1);
                                j = connected_reverse[field_ids[i]].indexOf('frame_' + frame_id + '_')
                                connected_reverse[field_ids[i]].splice(j, 1);
                                frames_operations.push({operation: 'disconnect', arg: arg, connect: field_ids[i]});
                                var a = arg;
                                frameClick("");
                                frameClick(a);
                            }
                        } else {
                            //connect
                            j = connected[arg].indexOf(field_ids[i])
                            if (j == -1) { // redundant
                                connected[arg].push(field_ids[i]);
                                if (typeof(connected_reverse[field_ids[i]]) == 'undefined') {
                                    connected_reverse[field_ids[i]] = []
                                }
                                connected_reverse[field_ids[i]].push('frame_' + frame_id + '_');
                                frames_operations.push({operation: 'connect', arg: arg, connect: field_ids[i]});
                                var a = arg;
                                frameClick("");
                                frameClick(a);
                            }
                        }
                    }
                } 
            } 
        }
    } else {
        return;
    }
}

function selectSchema(schema_id) {
	deselect();
    $("#schema_" + schema_id + "_").css('background-color', 'LightSteelBlue');
    $("#schema_" + schema_id + "_").css('border-width', '5px');
    getSchemaExamples(schema_id);
    displayExamples();
}

function deselectSchema() {
	$('[class^=schema_]').each(function(){
		$(this).css('background-color', "");
		$(this).css('background', "");
		$(this).css('border-width', '');
	});
}

function getSchemaExamples(schema_id) {
	
    displayed_examples = [];
    for(var i=0; i<window.examples.length; i++) {
      var exampleSchemaId = schemaId(window.examples[i].arguments[0].id);
      if(exampleSchemaId == schema_id) {
    	  displayed_examples.push(window.examples[i]);
      }
    }

}

var exampleSelectionColor = "rgb(176,196,222)";

function showExampleArguments(id) {
	clearExamplesSelection();
	selectExample(id);
	selectExampleArguments(id);
}

function clearExamplesSelection() {
	$('[id^=example_][selected=selected]').children().css('background-color', "");
	$('[id^=example_][selected=selected]').removeAttr('selected');
}

function selectExample(example_dom_id)
{  	 
	$('#' + example_dom_id).attr('selected', "selected");
	$('#' + example_dom_id).children().css('background-color', exampleSelectionColor);
}

function selectExampleArguments(example_dom_id) {
	var selected_example = null;
	var selected_example_id = example_dom_id.replace('example_', '');
	clearExampleArgumentsSelection();
	
	for(i = 0; i < window.nkjp_examples.length; i++) {
		if(window.nkjp_examples[i].example_id == selected_example_id) {
			selected_example = window.nkjp_examples[i];
			break;
		}
	}
	
	if(selected_example) {
		var selected_schema_id = parseId(selected_example.arguments_ids[0])['frame_id'];
		goToFrame('schema_'+selected_schema_id+'_', document.getElementById('schemas'));
		for(i = 0; i < selected_example.arguments_ids.length; i++) {
			var arg_dom_id = selected_example.arguments_ids[i].replace('frame', 'schema');
			$('[id^=' + arg_dom_id + ']').each(function(){
				$(this).attr('selected', "selected");
			});
		}
	}
}

function clearExampleArgumentsSelection() {
	$('[id^=schema_][id*=_arg_][selected=selected]').each(function() {
		$(this).removeAttr('selected');
	});
}

function frame_id(class_id) {
    parts = class_id.split('_');
    if (parts.length < 3) {
        console.log("Błąd wywołania");
        return "";
    }
    var result = "";
    for (i = 0; i < 2; i++) {
        result += parts[i] + '_';
    }
    return result;
}

function value_compare(a, b) {
    return b.value - a.value;
}

/////////////////////////// Splitters ///////////////////////////

var hSplitterId = 'semantics-hsplit';
var topSplitId = 'semantics-hsplit-top';
var bottomSplitId = 'semantics-hsplit-bottom';
var topVSplitterId = 'semantics-vsplit-top';
var bottomVSplitterId = 'semantics-vsplit-bottom';
var topLeftSplitId = 'frames';
var topRightSplitId = 'schemas';
var bottomLeftSplitId = 'control';
var bottomRightSplitId = 'semantics-examples';

function createHSplitter() {
  $('#'+hSplitterId).height($('#right').height() - 70);
  
  if ($.fn.splitter) {
	  
	$(window).resize(function() {
		$('#'+hSplitterId).height($('#right').height() - 70);
	});
	  
    $('#'+hSplitterId).bind('resize', function(e) {
		  var resizeEvt;
	      clearTimeout(resizeEvt);
	      resizeEvt = setTimeout(function() {
	        	$('#'+topVSplitterId).trigger('resize', $('#'+topLeftSplitId).width());
	            $('#'+bottomVSplitterId).trigger('resize', $('#'+bottomLeftSplitId).width()+7);
	        }, 50);
		  e.stopPropagation();
	});
	  
    $('#'+topSplitId).bind('resize', function(e) {
    	$('#'+topVSplitterId).height($('#'+topSplitId).height());
    	$('#'+topVSplitterId).children().each(function () {
    		$(this).height($('#'+topSplitId).height() - 7);
    	});
    	
    	$('#'+bottomVSplitterId).height($('#'+bottomSplitId).height());
    	$('#'+bottomVSplitterId).children().each(function () {
    		$(this).height($('#'+bottomSplitId).height() - 7);
    	});
        e.stopPropagation();
    });
    $('#'+bottomSplitId).bind('resize', function(e) {
      e.stopPropagation();
    });
    $('#'+hSplitterId).splitter({
      type: "h",
      minTop: 200,
      minBottom: 100,
      sizeBottom: 170,
      resizeToWidth: true,
      outline: true
    });
  }
}

function createVTopSplitter() {
  var w=$('#'+topVSplitterId).width();
  
  $('#'+topVSplitterId).height(2*$('#right').height()/3);
  
  if ($.fn.splitter) {
    $('#'+topLeftSplitId).bind('resize', function(e) {
    	$('#'+topVSplitterId).height($('#'+topSplitId).height());
    	$('#'+topVSplitterId).children().each(function () {
    		$(this).height($('#'+topSplitId).height() - 7);
    	});
    	$('#'+topRightSplitId).width($('#'+topRightSplitId).width() - 20);
        e.stopPropagation();
    });
    $('#'+topRightSplitId).bind('resize', function(e) {
      e.stopPropagation();
    });
    $('#'+topVSplitterId).splitter({
      type: "v",
      minLeft: 50,
      sizeLeft: w/2,
      resizeToWidth: true,
      outline: true
    });
  }
}

function createVBottomSplitter() {
  var w=$('#'+bottomVSplitterId).width();
  $('#'+bottomVSplitterId).height($('#right').height()/3);
  if ($.fn.splitter) {
    $('#'+bottomLeftSplitId).bind('resize', function(e) {
    	$('#'+bottomVSplitterId).height($('#'+bottomSplitId).height());
    	$('#'+bottomVSplitterId).children().each(function () {
    		$(this).height($('#'+bottomSplitId).height()-7);
    	});

    	$('#'+bottomLeftSplitId).width($('#'+bottomLeftSplitId).width() - 7);
    	$('#'+bottomRightSplitId).width($('#'+bottomRightSplitId).width() - 20);
        e.stopPropagation();
    });
    $('#'+bottomRightSplitId).bind('resize', function(e) {
      e.stopPropagation();
    });
    $('#'+bottomVSplitterId).splitter({
      type: "v",
      sizeLeft: w/3,
      minLeft: 200,
      resizeToWidth: true,
      outline: true
    });
  }
}
