"use strict" var text = ""; var sugg = []; var typeindex = 0; var nodetypes = ["person", "project", "skill", "deliverable", "objective"]; var suggestionChange=false; var sentenceStack = []; var nodeindex, linkindex; var typeStack = []; var ExecutionStack = []; var lastnode; $('#textanalyser').autocompleteTrigger({ triggerStart: '#', triggerEnd: '', source: sugg }); $("#textanalyser").keypress(function(e) { if (graph.history !== undefined) { graph.history.record_keystrokes(KEYSTROKE_WHERE_TEXTANALYSIS, [e.which]); } if (e.which == 13) { if(!suggestionChange){ text = $('#textanalyser').val(); $('#textanalyser').val(""); TextAnalyser2(text, true); typeStack=[]; } else { suggestionChange=false; } return false; } if (e.which == 37) {//RIGHT $('body').scrollLeft(0); e.stopPropagation(); return false; } if (e.which == 39) { //LEFT $('body').scrollLeft(0); e.stopPropagation(); return false; } }); $(document).keydown(function(e) { if (graph.history !== undefined) { graph.history.record_keystrokes(KEYSTROKE_WHERE_DOCUMENT, [e.KeyCode]); } if (e.keyCode == 9) {//TAB e.preventDefault(); changeType("down", lastnode); return false; } if (e.keyCode == 37) {//UP $('html, body').scrollLeft(0); } if (e.keyCode == 39) {//DOWN $('html, body').scrollLeft(0); } if (e.keyCode == 38) {//UP suggestionChange=true; } if (e.keyCode == 40) {//DOWN suggestionChange=true; } if (e.keyCode == 9) {//TAB return false; } }); function textSelect(inp, s, e) { e = e || s; if (inp.createTextRange) { var r = inp.createTextRange(); r.collapse(true); r.moveEnd('character', e); r.moveStart('character', s); r.select(); }else if(inp.setSelectionRange) { inp.focus(); inp.setSelectionRange(s, e); } } function changeType(arg, id) { if(!id)id="new node"; if (arg === 'up') { if (typeindex < 4) typeindex++; else typeindex = 0; graph.editType(id, null, nodetypes[typeindex]); $('.typeselection').html('
' + "Chosen Type: " + nodetypes[typeindex] + '
'); graph.findCoordinates(lastnode,null); } else { if (typeindex > 0) typeindex--; else typeindex = 4; graph.editType(id, null, nodetypes[typeindex]); $('.typeselection').html('
' + "Chosen Type: " + nodetypes[typeindex] + '
'); graph.findCoordinates(lastnode,null); } graph.updateGraph(); } window.setInterval(function() { if ($('#textanalyser').val() != text) { if(text.length*8>500)$('#textanalyser').css('width',text.length*8+20); // text changed text = $('#textanalyser').val(); TextAnalyser2(text, false); suggestionChange=false; } }, 5); function TextAnalyser2(newtext, finalize) { var states = ["NOTHING", "NEWNODE", "EDITNODE", "CLOSENODE", "NEWLINK", "EDITLINK", "SPECIAL", "QUARTET"]; var segment = [], subsegment = [], sentence = []; var newlinks = []; var newnodes = []; linkindex = 0; nodeindex = 0; var orderStack = []; var quoteword = ""; var ANDcase = false; var ANDcount = 0; var prefix = ""; //Sentence Sequencing //Build the words and cuts the main elements segment = newtext.split("#"); for (var j = 0; j < segment.length; j++) { if (j !== 0) sentence.push("#"); subsegment = segment[j].split(" "); if (subsegment.length === 0) { sentence.push(" "); } for (var k = 0; k < subsegment.length; k++) { if (subsegment[k] !== " " && subsegment[k] !== "") { if (subsegment[k].charAt(0) === '"') { quoteword = ""; do { quoteword += subsegment[k] + " "; if(subsegment[k].charAt(subsegment[k].length-1) !== '"')k++; } while (k < subsegment.length && subsegment[k].charAt(subsegment[k].length - 1) !== '"'); if(subsegment[k])if(subsegment[k]!==quoteword.replace(/ /g, ""))quoteword += subsegment[k]; sentence.push(quoteword.replace(/"/g, "")); } else { sentence.push(subsegment[k]); } } } } //BUILD NEW NODE AND LINK ARRAYS WITH ORDER OF APPEARENCE for (var m = 0; m < sentence.length; m++) { switch (sentence[m]) { case "#": orderStack.push("START"); break; case "and": case "+": case ",": case "&": sentence[m]=" and "; ANDcount++; //orderStack.push("AND"); default: if (orderStack[orderStack.length - 1] === "START") { orderStack.push("NODE"); newnodes.push(sentence[m]); linkindex++; } else if (orderStack[orderStack.length - 1] === "NODE") { orderStack.push("LINK"); if (!newlinks[linkindex]) { newlinks[linkindex] = sentence[m] + " "; } else { newlinks[linkindex] += sentence[m] + " "; } } else { if (!newlinks[linkindex]) { newlinks[linkindex] = sentence[m] + " "; } else { newlinks[linkindex] += sentence[m] + " "; } } if (newnodes.length === 0) prefix += sentence[m] + " "; break; } } //ATTACH SENTENCE PREFIX if (prefix) newlinks[1] += "(" + prefix + ")"; //WRITE COMPLETE SENTENCE linkindex = 0; nodeindex = 0; var word = ""; var completeSentence = ""; for (var m = 0; m < orderStack.length; m++) { if (orderStack[m] === "NODE") { word += " (" + newnodes[nodeindex] + ") "; if(newnodes[nodeindex].split(" ").length>1){ completeSentence += '"'+newnodes[nodeindex]+'"' + " "; }else{ completeSentence += newnodes[nodeindex] + " "; } nodeindex++; } else if (orderStack[m] === "LINK") { linkindex++; word += " -->" + newlinks[linkindex] + " --> "; completeSentence += newlinks[linkindex]; } } //REBUILD GRAPH linkindex = 0; nodeindex = 0; //CHANGE TO PERMANENT STATE AND UPDATE SUGGESTIONLIST var typesetter = ""; if (finalize === true) { typesetter = "perm"; for (var n = 0; n < newnodes.length; n++) { if (Unique(newnodes[n])) { if(newnodes[n].split(" ").length>1){ sugg.push('"'+newnodes[n]+'"'); }else{ sugg.push(newnodes[n]); } } } sugg.push(text); } else { typesetter = "temp"; } //REINITIALISE GRAPH (DUMB BUT IT WORKS) graph.removeNodes("temp"); graph.removeLinks("temp"); //ADD SURROUNDING BUBBLE if (orderStack.length > 0) graph.addNode("", "bubble", "temp"); var abnormalGraph=false; if((newlinks.length- ANDcount)>=3 )abnormalGraph=true; //0-N ORDER STACK for (var m = 0; m < orderStack.length - 1; m++) { switch (orderStack[m]) { case "START": if(!typeStack[nodeindex])typeStack[nodeindex]=nodetypes[typeindex]; break; case "NODE": graph.addNode(newnodes[nodeindex], typeStack[nodeindex], typesetter); if (!abnormalGraph) graph.addLink(newnodes[nodeindex - 1], newnodes[nodeindex], newlinks[linkindex], typesetter); nodeindex++; break; case "LINK": linkindex++; break; } } //FINAL N ORDER switch (orderStack[orderStack.length - 1]) { case "START": typeStack[nodeindex]=nodetypes[typeindex]; graph.addNode("new node", typeStack[nodeindex], "temp"); if (!abnormalGraph){graph.addLink(newnodes[nodeindex - 1], "new node", newlinks[linkindex], "temp"); ANDconnect("new node");} $('.typeselection').css({top:window.innerHeight/2-115,left:window.innerWidth/2-325}); $('.typeselection').html('
Use [TAB] key to pick a type
'); break; case "NODE": typeStack[nodeindex]=nodetypes[typeindex]; graph.addNode(newnodes[nodeindex], typeStack[nodeindex], typesetter); if (!abnormalGraph){ graph.addLink(newnodes[nodeindex - 1], newnodes[nodeindex], newlinks[linkindex], typesetter); ANDconnect(newnodes[nodeindex]);} break; case "LINK": linkindex++; graph.addNode("new node", "empty", "temp"); if (!abnormalGraph){ graph.addLink(newnodes[nodeindex - 1], "new node", newlinks[linkindex], "temp"); ANDconnect("new node");} $('.typeselection').css('top', -300); $('.typeselection').css('left', 0); break; } //EXTERNAL AND CONNECTION CHECKING var verb = ""; function ANDconnect(node) { for(var x=0;x