// minibar.js, assumes that support.js has also been loaded var default_server="http://www.grammaticalframework.org:41296" var tree_icon=default_server+"/translate/se.chalmers.cs.gf.gwt.TranslateApp/tree-btn.png"; function start_minibar(server,opts,target) { // Typically called when the HTML document is loaded /* --- Configuration ---------------------------------------------------- */ // default values for options: var options={ show_abstract: false, show_trees: false, show_grouped_translations: true, delete_button_text: "⌫", default_source_language: null, try_google: true, feedback_url: null, random_button: true, help_url: null } /* --- Creating user interface elements --------------------------------- */ if(opts) for(var o in opts) options[o]=opts[o]; var surface=div_id("surface"); var extra=div_id("extra"); var menubar=div_id("menubar"); var words=div_id("words"); var translations=div_id("translations"); var minibar=element(target || "minibar"); minibar.innerHTML=""; appendChildren(minibar,[menubar,surface,words,translations,extra]); // Added later: var language_menu=empty_id("select","language_menu"); var to_menu=empty_id("select","to_menu"); /* --- Minibar client state initialisation ------------------------------ */ var current={from: null, input: ""}; var previous=null; /* --- Auxiliary functions ---------------------------------------------- */ function show_grammarlist(grammars) { //debug("show_grammarlist ") menubar.innerHTML=""; if(grammars.length>1) { var menu=empty("select"); for(var i=0;i0*/) get_translations(); else translations.innerHTML=""; if(surface.typed && emptycnt==completions.length) { if(surface.typed.value=="") remove_typed_input(); } else add_typed_input(); } function add_completions(completions) { if(words.timeout) clearTimeout(words.timeout),words.timeout=null; words.innerHTML=""; words.completions=completions; words.word=[]; var t=surface.typed ? surface.typed.value : ""; var emptycnt=0; for(var i=0;i0) { var w=word(s); words.appendChild(w); words.word[i]=w; } else emptycnt++; } filter_completions(t,true); return emptycnt; } function filter_completions(t,dim) { if(words.timeout) clearTimeout(words.timeout),words.timeout=null; words.filtered=t; //if(dim) debug('filter "'+t+'"'); var w=words.word; words.count=0; var dimmed=0; var prefix=""; // longest common prefix, for completion for(var i=0;i0) words.timeout=setTimeout(function(){ filter_completions(t,false)},1000); } function get_translations() { var c=current; if(options.show_grouped_translations) server.translategroup(c.from,c.input,show_groupedtranslations); else server.translate(c.from,c.input,show_translations); } function target_lang() { return langpart(to_menu.options[to_menu.selectedIndex].value, language_menu.grammar.name); } function add_typed_input() { var inp; if(surface.typed) inp=surface.typed; else { inp=empty("input","type","text"); inp.value=""; inp.setAttribute("accesskey","t"); inp.style.width="10em"; inp.onkeyup=complete_typed; surface.appendChild(inp); surface.typed=inp; } inp.focus(); } function remove_typed_input() { if(surface.typed) { surface.typed.parentNode.removeChild(surface.typed); surface.typed=null; } } function complete_typed(event) { //element("debug").innerHTML=show_props(event,"event"); var inp=surface.typed; //debug('"'+inp.value+'"'); var s=inp.value; var ws=s.split(" "); if(ws.length>1 || event.keyCode==13) { if(ws[0]!=words.filtered) filter_completions(ws[0],true); if(words.count==1) add_word(words.theword); else if(elem(ws[0],words.completions)) add_word(ws[0]); else if(words.theword.length>ws[0].length) inp.value=words.theword; } else if(s!=words.filtered) filter_completions(s,true) } function generate_random() { function show_random(random) { clear_all1(); var menu=language_menu; add_words(random[0].text); } function lin_random(abs) { server.linearize(abs[0].tree,current.from,show_random); } server.get_random(lin_random); } function add_words(s) { var words=s.split(" "); for(var i=0;i0 && s2[0]==" ") s2=s2.substr(1); surface.typed.value=s2; } else surface.typed.value=""; } get_completions(); } function add_word1(s) { previous={ input: current.input, previous: previous }; current.input+=s; var w=span_class("word",text(s)); if(surface.typed) surface.insertBefore(w,surface.typed); else surface.appendChild(w); } function delete_last() { if(surface.typed && surface.typed.value!="") surface.typed.value=""; else if(previous) { current.input=previous.input; previous=previous.previous; if(surface.typed) { surface.removeChild(surface.typed.previousSibling); surface.typed.focus(); } else surface.removeChild(surface.lastChild); translations.innerHTML=""; get_completions(); } } function tdt(tree_btn,txt) { return options.show_trees ? tda([tree_btn,txt]) : td(txt); } function show_translations(translationResults) { var trans=translations; var grammar=language_menu.grammar; var to=target_lang(); var cnt=translationResults.length; //trans.translations=translations; trans.single_translation=[]; trans.innerHTML=""; /* trans.appendChild(wrap("h3",text(cnt<1 ? "No translations?" : cnt>1 ? ""+cnt+" translations:": "One translation:"))); */ for(p=0;p 1) tbody.appendChild(tr([td(text(lin[i].tree))])); } trans.appendChild(wrap("table",tbody)); } } } function append_extra_buttons(extra,options) { if(options.try_google) extra.appendChild(button("Try Google Translate",try_google)); if(options.feedback_url) appendChildren(extra,[text(" "),button("Feedback",open_feedback)]); } function try_google() { var to=target_lang(); var grammar=language_menu.grammar; var s=current.input; if(surface.typed) s+=surface.typed.value; var url="http://translate.google.com/?sl=" +langpart(current.from,grammar.name); if(to!="-1") url+="&tl="+to; url+="&q="+encodeURIComponent(s); window.open(url); } function open_help() { open_popup(options.help_url,"help"); } function open_feedback() { language_menu.current=current; open_popup(options.feedback_url,'feedback'); } /* --- Main program, this gets things going ----------------------------- */ append_extra_buttons(extra,options); if(server.grammar_list) show_grammarlist(server.grammar_list); else server.get_grammarlist(show_grammarlist); } function commonPrefix(s1,s2) { for(var i=0;i