var frame_localization = [];    // list of localizations of all frames on page display
var frame_content = [];         // list of contents of all frames
var free_complement_id = -1;
var free_frame_id = -1;
var free_preference_id = -1;
var semantic_opinion_vals = [];

function selectedFrame() {
    return "frame_" + highlighted_id + "_";
}

function selectedFrameId() {
    return highlighted_id;
}

function getFrames(frames_display){
    var i, j;
    lexical_units_num = [];
    for (i = 0; i < frames_display.length; i++) {
        lexical_units_num.push(frames_display[i].lexical_units);
        lexical_units_frames[i] = [];
        
        frames = frames_display[i].frames;
        for (j = 0; j < frames.length; j++) {
            frame_content[frames[j].frame_id] = frames[j];
            frame_localization[frames[j].frame_id] = {"units": i, "position": j};
            lexical_units_frames[i].push(frames[j].frame_id);
        }
    }
}

function memorizeOpinions(opinions_list){
    var i;

    for (i = 0; i < opinions_list.length; i++){
        semantic_opinion_vals[opinions_list[i].id] = opinions_list[i].name;
    }
}

function getStatusesForFrame(frame_id){
    // TODO: limit possible values
    var display = "";
    
    for (var id in semantic_opinion_vals){
        display += "<input type = \"radio\" name = \"opinion\" value = \"" + id + "\">" + semantic_opinion_vals[id] +  "<br>";
    }
    
    return display;
}

function displayFrames(){
    var display = '';
    var i, j;
    for ( i = 0; i < lexical_units_num.length; i++) {
        display += '<div id="lus_' + i + '_">';
        display += '<div>';
        var units = [];
        for (j = 0; j < lexical_units_num[i].length; j++) {
            var id = parseInt(lexical_units_num[i][j].id);
            var lid = indexOfId(lexical_units, id)
            var u = '<strong title="';
            u += lexical_units[lid].glossa;
            if (lexical_units[lid].glossa != '') {
		u += '\n';
	    }
	    u += lexical_units[lid].definition;
	    u +='"> '; 
            u += lexical_units[lid].base + '-' + lexical_units[lid].sense;
            u += '</strong>';
            units.push(u);
        }
        display += units.join()
        var frames = lexical_units_frames[i];
        for (j = 0; j < frames.length; j++) {
            display += '<div id="lus_' + i + '_pos_' + j +'_">';
            display += getFrameDisplay(frame_content[frames[j]]);
            display += '</div>';
        }
        display += '</div>';
        
        display += '</div>';
    }
    $("#frames").html(display);
}

function getFrameDisplay(frame_description){
    var i, j;
    var display = '<table><tr><td>';
    display += '<table class="InactiveFrameTable">';
    display += '<tr><td class="ColumnHeader">Rama:</td><td id="frame_' + frame_description.frame_id + '_" class="frame_' + frame_description.frame_id + '_" colspan="' + frame_description.colspan + '" onclick="frameClick(\'frame_' + frame_description.frame_id + '_\', \'frame_' + frame_description.frame_id + '_\')">';
    display += '<span class="Opinion">' + frame_description.status + ' [' + frame_description.frame_id + ']</span>';
    display += '<tr>';
    display += '<td class="ColumnHeader">Rola:</td>';
    for (i = 0; i < frame_description.display.roles.length; i++) {
        display += '<td id="' + frame_description.display.roles[i].csv_id + '" class="' + frame_description.display.roles[i].csv_class + '" onclick="frameClick(\'' +frame_description.display.roles[i].csv_id + '\', \'' + frame_description.display.roles[i].csv_class + '\')">';
        var roles = frame_description.display.roles[i].argument;
        var role_names = [];
        var j;
        for (j = 0; j < roles.length; j++) {
            role_names.push(role_name[parseInt(roles[j])]);
        }
        var displayed_role = "";
        if (role_names.length > 0)
        {
            displayed_role += role_names[0];
        
            for (j = 1; j < role_names.length; j++) {
                displayed_role += ", ";
                displayed_role += role_names[j];
            }
        }
        display += displayed_role;
        display += '</td>';
    }
    display += '</tr>';
    display += '<tr>';
    display += '<td class="ColumnHeader" rowspan="' + frame_description.rowspan + '">Preferencje <br/>selekcyjne:</td>';
    for (i = 0; i < frame_description.display.preferences.length; i++) {
        for (j = 0; j < frame_description.display.preferences[i].length; j++) {
            display += '<td id="' + frame_description.display.preferences[i][j].csv_id + '" class="' + frame_description.display.preferences[i][j].csv_class + '" onclick="frameClick(\'' + frame_description.display.preferences[i][j].csv_id + '\', \'' + frame_description.display.preferences[i][j].csv_class + '\')">';
            display += frame_description.display.preferences[i][j].preference;
            display += '</td>';
        }
        display += '</tr><tr>';
    }
    display += '</tr>';
    display += '</table>';
    display += '</td></tr></table>';
    return display;
}

// create new empty frame for selected lexical units
function newFrame(units) {
    var y = lexical_units_num.length;
    var x = free_frame_id;
    
    var newdiv = document.createElement('div');
    var divIdName = 'lus_' + y + '_';
    newdiv.setAttribute('id',divIdName);
    document.getElementById("frames").appendChild(newdiv);
    
    frame_localization[x] = {units: y, position: 0};
    
    lexical_units_frames.push(["" + x]);
    
    var units_list = [];
    var i;
    for (i = 0; i < units.length; i++) {
        lu = lexical_units[indexOfId(lexical_units, units[i])];
        units_list.push({base: lu.base, sense: lu.sense, id: lu.id});
    }
    lexical_units_num.push(units_list);
    
    frame_content[free_frame_id] = {colspan: "1", rowspan: "1", status: "brak", frame_id: "" + x, display: {preferences:[[]], roles:[]}};
    frames_operations.push({operation: "create_frame", meanings: units_list, id: x});
    free_frame_id = free_frame_id - 1;
}

function validateRoles(roles) {
    
    if (roles.length > 2) {
        return false;
    };

    var ok = false;
    var i;
    for (i = 0; i < roles.length; i++) {
        if (role_color[roles[i]].color != 'None') {
            ok = !ok
        }
    }

    if (!ok) {
        return false;
    }
    
    return true;
}

// assign role(s) to given compelement
function setRole(frame_id, complement_id, roles) {

    if (validateRoles(roles)) {

        for (i = 0; i < frame_content[frame_id].display.roles.length; i++) {
            if (frame_content[frame_id].display.roles[i].csv_id == 'frame_' + frame_id + '_comp_' + complement_id + '_') {
                frame_content[frame_id].display.roles[i].argument = roles;
            }
        }
        
        frames_operations.push({operation: "assign_role", frame_id: frame_id, complement_id: complement_id, role: roles});
        return true;
    } else {
        return false;
    }
}


function removeFrame(frame_id) {
    var units = [];
    
    var i;
    for (i = 0; i < lexical_units_frames.length; i++) {
        if (lexical_units_frames[i].indexOf(frame_id) != -1) {
            var j = lexical_units_frames[i].indexOf(frame_id);

            lexical_units_frames[i].splice(j, 1);
            if (lexical_units_frames[i].length == 0) {
                var k;
                for (k = 0; k < lexical_units_num[i].length; k++) {
                    units.push(lexical_units_num[i][k].id);
                }
                lexical_units_num[i] = [];
            }
        }
    }
    
    var connections = getConnected(frame_id);
    removeFrameConnections(frame_id);
    
    frames_operations.push({operation: "remove_frame", id: frame_id, units: units, connections: connections});
}

function roleFree(frame_id, field_ids) {
    var i;
    for (i = 0; i < field_ids.length; i++) {
        if (typeof(connected_reverse[field_ids[i]]) != 'undefined') {
            if (connected_reverse[field_ids[i]].indexOf('frame_' + frame_id + '_') >= 0) {
                return false;
            }
        }
    }
    return true;
}

function addArgument(frame_id, field_ids, roles) {

    if (validateRoles(roles)) {
        frame_content[frame_id].colspan = "" + (parseInt(frame_content[frame_id].colspan) + 1);
        frame_content[frame_id].display.roles.push({csv_class: 'frame_' + frame_id + '_comp_' + free_complement_id + '_', csv_id: 'frame_' + frame_id + '_comp_' + free_complement_id + '_', argument: ''});
        var i;
        for (i = 0; i < frame_content[frame_id].rowspan; i++) {
            frame_content[frame_id].display.preferences[i].push({csv_class: 'frame_' + frame_id + '_comp_' + free_complement_id + '_', csv_id: 'frame_' + frame_id + '_comp_' + free_complement_id + '_pref_-' + i + '_', preference: ''});
        }
        connected['frame_' + frame_id + '_comp_' + free_complement_id + '_'] = field_ids;
        
        for(i = 0; i < field_ids.length; i++) {
            if (typeof(connected_reverse[field_ids[i]]) == 'undefined') {
                connected_reverse[field_ids[i]] = [];
            }
            connected_reverse[field_ids[i]].push('frame_' + frame_id + '_');
        }
        
        var complement_id = free_complement_id;
        free_complement_id = free_complement_id - 1;

        for (i = 0; i < frame_content[frame_id].display.roles.length; i++) {
            if (frame_content[frame_id].display.roles[i].csv_id == 'frame_' + frame_id + '_comp_' + complement_id + '_') {
                frame_content[frame_id].display.roles[i].argument = roles;
            }
        }
        
        frames_operations.push({operation: 'add_argument', frame_id: frame_id, id: complement_id, role: roles});
        for (i = 0; i < field_ids.length; i++) {
            frames_operations.push({operation: 'connect', arg: 'frame_' + frame_id + '_comp_' + complement_id + '_', connect: field_ids[i]});
        }

        return complement_id;
    } else {
        return false;
    }

}

function removeArgument(frame_id, complement_id) {
    var pos = -1;
    var arg = "frame_" + frame_id + "_comp_" + complement_id + "_"
    
    var i;
    for (i = 0; i < frame_content[frame_id].display.roles.length; i++) {
        if (frame_content[frame_id].display.roles[i].csv_id == arg) {
            pos = i;
        }
    }
    
    frame_content[frame_id].display.roles.splice(pos, 1);
    
    var j;
    for (j = 0; j < frame_content[frame_id].display.preferences.length; j++) {
        frame_content[frame_id].display.preferences[j].splice(pos, 1);
    }
    
    frames_operations.push({operation: 'remove_argument', frame_id: frame_id, complement_id: complement_id});
}

function changeUnits(frame_id, units) {
    var id = "" + frame_id;

    var j;
    for (j = 0; j < lexical_units_num.length; j++) {
        if (lexical_units_frames[j].indexOf(id) != -1) {
            lexical_units_num[j] = []
            var i;
            for (i = 0; i < units.length; i++) {
                var k;
                
                for (k=0; k < lexical_units.length; k++) {
                    if (lexical_units[k].id == parseInt(units[i])) {
                        lexical_units_num[j].push(lexical_units[k]);
                        break;
                    }
                }
                
            }
            break;
        }
    }

    frames_operations.push({operation: "change_units", frame_id: frame_id, units: units});
}

function setOpinion(frame_id, opinion) {
    var id = "" + frame_id;

    frame_content[frame_id].status = semantic_opinion_vals[opinion];

    frames_operations.push({operation: "set_opinion", frame_id: frame_id, opinion: opinion[0]});
}
 
function isNewPreference(frame_id, complement_id, preference) {

    var i, j, k;
    
    j = -1;
    for (k = 0; k < frame_content[frame_id].display.roles.length; k++) {
        if (frame_content[frame_id].display.roles[k].csv_class == 'frame_' + frame_id + '_comp_' + complement_id + '_') {
            j = k;
        }
    }
    if (j < 0) {
        return false;
    }
    
    i = -1;
    for (k = 0; k < frame_content[frame_id].display.preferences.length; k++) {
        if (frame_content[frame_id].display.preferences[k][j].preference == preference.text.split(':')[0]) {
            return false;
        }
    }
    return true;

}

function addPreference(frame_id, complement_id, preference) {
    if (isNewPreference(frame_id, complement_id, preference)) {

        var i, j, k;
        
        j = -1;
        for (k = 0; k < frame_content[frame_id].display.roles.length; k++) {
            if (frame_content[frame_id].display.roles[k].csv_class == 'frame_' + frame_id + '_comp_' + complement_id + '_') {
                j = k;
            }
        }
        if (j < 0) {
            return false;
        }
        
        i = -1;
        for (k = 0; k < frame_content[frame_id].display.preferences.length; k++) {
            if (frame_content[frame_id].display.preferences[k][j].preference == "" && i < 0) {
                i = k;
            }
        }
        if (i < 0) { 
            i = parseInt(frame_content[frame_id].rowspan);
        
            frame_content[frame_id].rowspan = "" + (i + 1);
            
            var new_row = [];
            for (k = 0; k < frame_content[frame_id].display.roles.length; k++) {
                new_row.push({csv_class: frame_content[frame_id].display.roles[k].csv_class, csv_id: frame_content[frame_id].display.roles[k].csv_class + "pref_-" + frame_content[frame_id].rowspan + "_", preference: ""});
            }
            frame_content[frame_id].display.preferences.push(new_row);
        }

        var preference_id = preference.type + free_preference_id;
        frame_content[frame_id].display.preferences[i][j].csv_id = frame_content[frame_id].display.preferences[i][j].csv_class + "pref_" + preference_id + "_";
        frame_content[frame_id].display.preferences[i][j].preference = preference.text.split(':')[0];
        free_preference_id = free_preference_id - 1;

        frames_operations.push({operation: 'add_preference', frame_id: frame_id, complement_id: complement_id, preference_id: preference_id, preference: preference});
        return preference_id;
    }
    
}

function removePreference(frame_id, complement_id, preference_id) {
    var i, j, k;
    
    j = -1;
    for (k = 0; k < frame_content[frame_id].display.roles.length; k++) {
        if (frame_content[frame_id].display.roles[k].csv_class == 'frame_' + frame_id + '_comp_' + complement_id + '_') {
            j = k;
        }
    }
    if (j < 0) {
        return false;
    }
    
    i = -1;
    for (k = 0; k < frame_content[frame_id].display.preferences.length; k++) {
        if (frame_content[frame_id].display.preferences[k][j].csv_id == 'frame_' + frame_id + '_comp_' + complement_id + '_pref_' + preference_id + '_') {
            i = k;
        }
    }
    if (i < 0) { 
        return false;
    } 

    frame_content[frame_id].display.preferences[i][j].csv_id = 'frame_' + frame_id + '_comp_' + complement_id + '_pref_' + (- i) + '_';
    frame_content[frame_id].display.preferences[i][j].preference = "";
    
    for (k = i; k < frame_content[frame_id].display.preferences.length - 1; k++) {
        var tmp = frame_content[frame_id].display.preferences[k][j];
        frame_content[frame_id].display.preferences[k][j] = frame_content[frame_id].display.preferences[k + 1][j];
        frame_content[frame_id].display.preferences[k + 1][j] = tmp;
    }
    
    var remove = true;
    for (k = 0; k < frame_content[frame_id].display.preferences[frame_content[frame_id].display.preferences.length - 1].length; k++) {
        if (frame_content[frame_id].display.preferences[frame_content[frame_id].display.preferences.length - 1][k].preference != "") {
            remove = false;
        }
    }
    if (remove) {
        k = parseInt(frame_content[frame_id].rowspan);
        if (k > 1) {
            frame_content[frame_id].display.preferences.splice(frame_content[frame_id].display.preferences.length - 1, 1);
            frame_content[frame_id].rowspan = "" + (k - 1);
        }
    }
    
    frames_operations.push({operation: 'remove_preference', frame_id: frame_id, complement_id: complement_id, preference_id: preference_id});
    return true;
}

function saveFrames() {
    if (change == true) {
        alertSemantics();
    } 
    else if(window.lemma_id != getActualLemmaId(window.lemma_id)){
    	alertOldSchemas();
    }
    else if (!userIsAuthenticated()) {
    	alertUserNotAuthenticated();
    }
    else {
        frameClick("");
        $.getJSON(ajax_modify_frames, {"operations": JSON.stringify(frames_operations), "lemma_id": lemma_id}, function(data){
                getFrames(data.frames_display);
                displayFrames();
                memorizeConnections(data.connections.connected, data.connections.connected_reverse);
                $("#semantic-frames-count").empty();
      			$("#semantic-frames-count").append(data.frames_count);
      			updateSchemataConnections();
            });
        frames_operations = [];
    }
}