//modules' classes 
Module.Main = function(){


    //get values from cookie
    //search_mode = get_preferences("search_mode", search_mode);
    show_search_button = get_preferences("show_search_button", show_search_button);
    show_search_expr_button = get_preferences("show_search_expr_button", show_search_expr_button);
    show_search_auto_button = get_preferences("show_search_auto_button", show_search_auto_button);
    
    default_L1 = get_preferences("default_L1", default_L1);
    default_L2 = get_preferences("default_L2", default_L2);
    show_L1 = get_preferences("show_L1", show_L1);
    show_L2 = get_preferences("show_L2", show_L2);
    input_mode = get_preferences("input_mode", 0);
    
    var m_history_step = false;
    
    
    var html = '<table width="100px">';
    html += '<tr>';
    html += '<td>';
    html += get_text('whattosearch') + ':</td><td colspan="7">';
    html += '<table border="0"  cellspacing="0" cellpadding="0"><tr><td>';//width="100%"
    if (input_mode == 0){    
        html += '<input type="text" name="'+input_field_id+'" id="'+input_field_id+'" size="61">';
        html += '<textarea id="'+input_area_id+'" name="'+input_area_id+'" cols="40" style="visibility:hidden;display:none"></textarea>';
    }else{
        html += '<input type="text" name="'+input_field_id+'" id="'+input_field_id+'" size="61" style="visibility:hidden;display:none">';
        html += '<textarea id="'+input_area_id+'" name="'+input_area_id+'" cols="40"></textarea>';
    }
    html += "<div><div id='word_history_div' style='position:absolute;z-index:1000;visibility:hidden;display:none;border: 0px solid;margin: 0px;padding: 0px;'>";//background:white;
    html += "<select name='word_history' size='6' id='word_history' onChange='MoBiDic_module.go_history()'></select></div></div>";
    html += '</td><td>';
    html += '<a href="javascript:MoBiDic_module.toggle_history()">'+get_image('history_button.png', get_text('history'), " id='history_button' name='history_button' height='20'") +'</a>';
    html += "</td></tr></table>";

    html += '</td></tr>';
    html += '<tr><td align="right"><div id="L1_text_obj" name="L1_text_obj">'+get_text('L1_text')+':</div></td><td width="10px"><select name="L1" id="L1" style="visibility:hidden"></select>';
    html += '</td><td width="35px"><div id="L2_text_obj" name="L2_text_obj">'+get_text('L2_text')+':</div></td><td width="10px"><select name="L2" id="L2" style="visibility:hidden"></select></td>';
    //html += '</tr>';onChange="fill_dict_on_sel();" 
    //html += '</table>';
    
    
    //search buttons <table><tbody><tr>
    html += '<td valign="left" align="left"><input type="submit" name="search_button" id="search_button" ';
    if (show_search_button == 0)
        html += 'style="visibility:hidden;display:none"';
    html += ' value="'+get_text('search')+'">';
    html += '</td><td><input type="submit" name="search_expr_button" id="search_expr_button" ';
    if (show_search_expr_button == 0)
        html += 'style="visibility:hidden;display:none"';  
    html += ' value="'+get_text('searchexpr')+'">';
    html += '</td><td><input type="submit" name="search_auto_button" id="search_auto_button" ';
    if (show_search_auto_button == 0)
        html += 'style="visibility:hidden;display:none"';
    html += ' value="'+get_text('auto')+'">';
    html += '</td></tr></tbody></table>';
    
    var settings_html = "<table border=\"0\" class='settingtable' align=center >";//
	settings_html += "<tr>";
    settings_html += "<td colspan=\"2\" align=\"center\"><b>" + get_text("settings")+"</b></td>";
	settings_html += "</tr>";
/*
    settings_html += "<tr><td>";
    settings_html += '<div style="border: 1px; border-color: grey;	border-style: solid; ">';
    settings_html += '<table><tr>';
    settings_html += '<td width="100">' + get_text("search modes")+':</td>';
	settings_html += '<td>';

    settings_html += '<input type=checkbox name="show_search_button" id="show_search_button" value="true" '; 
    if (show_search_button == 1) 
        settings_html += "checked";
    settings_html += ' onClick="setvalue(\'show_search_button\', this.checked)">' + get_text("show_search_button")+'</td>';
	settings_html += "</tr>";

    settings_html += "<tr>";
    settings_html += "<td></td>";
	settings_html += '<td><input type=checkbox name="show_search_expr_button" id="show_search_expr_button" value="true" '; 
    if (show_search_expr_button == 1) 
        settings_html += "checked";
    settings_html += ' onClick="setvalue(\'show_search_expr_button\', this.checked)">' + get_text("show_search_expr_button")+'</td>';
	settings_html += "</tr>";

    settings_html += "<tr>";
    settings_html += "<td></td>";
	settings_html += '<td><input type=checkbox name="show_search_auto_button" id="show_search_auto_button" value="true" '; 
    if (show_search_auto_button == 1) 
        settings_html += "checked";
    settings_html += ' onClick="setvalue(\'show_search_auto_button\', this.checked)">' + get_text("show_search_auto_button")+'</td>';
	settings_html += "</tr>"; */
    settings_html += "</table></div></td></tr>";

/*    settings_html += "<tr><td>"+ get_text("default_search_mode")+"</td>";
    settings_html += "<td><select name=\"search_mode\" id=\"search_mode\" onChange=\"setvalue(\'search_mode\', getSelected(this))\">"
    settings_html += "<option value=\"0\" ";
    if (search_mode == 0) 
        settings_html +="selected";
    settings_html += ">"+get_text("search")+"</option>";
    settings_html += "<option value=\"1\" ";
    if (search_mode == 1) 
        settings_html +="selected";
    settings_html += ">"+get_text("searchexpr")+"</option>";
    settings_html += "</select>";
    settings_html += "</td>";

    settings_html += "</tr>";
*/
//PG asked me to remove this options 2007.08.31.
    settings_html += "<tr>";
    settings_html += '<td>';
    settings_html += '<div style="border: 1px; border-color: grey;	border-style: solid; ">';
    settings_html += '<table><tr>';
    settings_html += '<td width="100">' + get_text("language directions")+':</td>';
//	settings_html += "<td>";
	//settings_html += "<table  class='settingtable'><tr>";
	settings_html += '<td><input type=checkbox name="show_L1" id="show_L1" value="true" '; 
    if (show_L1) 
        settings_html += "checked";
    settings_html += ' onClick="setvalue(\'show_L1\', this.checked)">' + get_text("show_L1_text")+'</td>';
	settings_html += "</tr>";
/*
//FA asked me to remove only this
    settings_html += '<tr><td>' + get_text("default_L1_text") +':</td>';
    settings_html += '<td><form name = "L1_setting"><select name="def_L1" style="z-index:0"></select></form></td>';
    settings_html += "</tr>";

    settings_html += "</table>";
    settings_html += "</td>";
    settings_html += "</tr>";
*/	
	settings_html += "<tr>";
    settings_html += '<td></td>';
	//settings_html += "<td>";
//	settings_html += "<table  class='settingtable'><tr>";
	settings_html += '<td><input type=checkbox name="show_L2" id="show_L2" value="true" '; 
    if (show_L2) 
        settings_html += "checked";
    settings_html += ' onClick="setvalue(\'show_L2\', this.checked)">' + get_text("show_L2_text")+'</td>';
	settings_html += "</tr>";
    settings_html += "</table></div></td></tr>";
/*    settings_html += '<tr><td>' + get_text("default_L2_text") +':</td>';
    settings_html += '<td><form name = "L2_setting"><select name="def_L2"></select></form></td>';
    settings_html += "</tr>";
    settings_html += "</table>";
    settings_html += "</td>";
    settings_html += "</tr>";
*/    
    settings_html += '<tr><td>';
    settings_html += '<table><tr>';
    settings_html += '<td>'+get_text("input mode")+':</td><td><input type=checkbox name="show_S_area" id="show_S_area" value="true" '; 
    if (input_mode == 1) 
        settings_html += "checked";
    settings_html += ' onClick="setvalue(\'input_mode\', this.checked)">' + get_text("advanced input")+'</td>';
    settings_html += '</tr></table>';
    settings_html += "</tr>";
    settings_html += "</table>";

    if (custom_input){
        html = "";
        settings_html = "";
    }

    var m1_obj = new Module(get_text('main module'), settings_html, html, 'MoBiDic_module', "main");

    this.module = m1_obj.module;
    this.obj = m1_obj;


  var m_callbacks = new Array();
    this.after_initialize = function( func){
      m_callbacks.push(func);
    }

    this.initialized = function(){
      for(var i = 0; i<m_callbacks.length; i++){
        m_callbacks[i]();
        //delete m_callbacks[i]; // reconnect = reopen dicts jo ez igy? FIXME
      }
      if (!custom_input)
        m1_obj.getContentItem("input", input_field_id).focus();
    }

    this.init = function() {
        init(this);
    }
    function ed_init(){

/*      //PG asked me to remove this 2007.08.31.
        var l1 = m1_obj.getSettingsItem("select", "def_L1");
        show_languages_basic(true, l1, "L1_label", default_L1);
        var l2 = m1_obj.getSettingsItem("select", "def_L2");
        show_languages_basic(true, l2, "L2_label", default_L2);
*/
    }
    
    m1_obj.setEditInit(ed_init);
    

    this.go_history = function(value){
        if (arguments.length == 0){
            value = 0;
        }
        var obj = document.getElementById("word_history");
        if (obj.options.length == 0)
            return;
        obj.selectedIndex += value;
        var str = obj.options[obj.selectedIndex].value;
        m_history_step = true;
        start_query(str);        
        m_history_step = false;
        if (value == 0)
            this.toggle_history();
        
    }
    
    this.toggle_history = function(){
        var obj = document.getElementById("word_history_div");
        if (obj.style.display == "none")
            setvisible(obj, true);
        else
            setvisible(obj, false);
/*        var button = document.getElementById("history_button");
        obj.x = button.x;
        obj.y = button.y;*/
    }
    
    function hide_history(e){
        var source = null;
        if(typeof e=="undefined")e=window.event;
        if (e){
            if(typeof e.target != 'undefined'){
                source = e.target;
            }else if (typeof e.srcElement != 'undefined'){
                source = e.srcElement;
            }
        }
        //alert(event.srcElement);// + ev.srcElement);

        if (source && source.id == "history_button")
            return true;
            
        var obj = document.getElementById("word_history_div");
        
        if (obj.style.display == "block"){
            //alert(obj.style.display);
            MoBiDic_module.toggle_history();
            //alert(obj.style.display);
        }
        return true;
    }
    
    this.store_query = function(str){
        var obj = document.getElementById("word_history");
        var limited_str = str;
        if (limited_str.length > 30)
            limited_str = limited_str.substr(0, 30) + "...";
            
        var elOptNew = document.createElement('option');
        elOptNew.text = limited_str;
        elOptNew.value = str;
        var first = (obj.options.length > 0 ? obj.options[0] : null);  
        try {
          obj.add(elOptNew, first); // standards compliant; doesn't work in IE
        }
        catch(ex) {
          obj.add(elOptNew, 0); // IE only
        }
        obj.selectedIndex = 0;
    }
    
    this.fill_language_selectors = function() {
        var obj1 = m1_obj.getContentItem("select", "L1");
        var obj2 = m1_obj.getContentItem("select", "L2");
        var text_obj1 = m1_obj.getContentItem("div", "L1_text_obj");
        var text_obj2 = m1_obj.getContentItem("div", "L2_text_obj");

        show_languages_basic(true, obj1, "L1_label", default_L1);
        show_languages_basic(false, obj2, "L2_label", default_L2);
        if (show_L1){
            obj1.style.visibility = 'visible';
        }
        if (show_L2){
          obj2.style.visibility = 'visible';
        }
        
        setvisible(text_obj1, show_L1, false);
        setvisible(text_obj2, show_L2, true);
    }
    
    function onEnter(event)
    {
        //For a full list of key codes go to
        //http://www.js-x.com/beginners/key_codes.php3
        var bolOldBrowser = (document.layers) ? true : false;
        var intKeyCode = 0;
        if (bolOldBrowser)
        intKeyCode = event.which;
        else{
            if (event)
                intKeyCode = event.keyCode;
        }
        if (intKeyCode && intKeyCode == 13){
            startSearch();
            return false;
            }
        
        //document.forms[0].submit();
    }
    
    this.start_query_ex = function(l1, l2, str, mode, dictionary_id, dest_module, dest_element, offset){

        entry_module.obj.ClearContent();
        //cache will clear them:
        //context_module.obj.ClearContent();
        
        var opendicts = dict_man.get_given_dicts(l1, l2);
        if(entries_module.check_query_params(l1, l2, opendicts.join(','), str, mode, 0))
            return;
        entries_module.save_query_params(l1, l2, opendicts.join(','), str, mode, 0);
        entries_module.ClearContent(); 

        entries_module.set_title("'"+str+"': %d " + get_text("entries for"));
        entries_module.loadingState(get_text("loading entries for") + " '"+str +"'...");        
        if (!mbd_query(l1, l2, str, mode, opendicts, dest_module, dest_module.obj.content, offset, false))
            return;
        start_expressions(l1, l2, opendicts, str);	

        //Webaudit.Measure('11616786448215');
        //pp_gemius_hit('nA6QnUyt.34W1u9QclDbjsbiTDOkbavk9P0IwzDTyIn.q7');
    }

//this.input_mode = input_mode;
    function startSearch(ev){
        
        var str = document.getElementById(input_field_id).value;
        if(typeof ev=="undefined")ev=window.event;        
        if (str.length == 0 || 
            (ev && (ev.type == "dblclick")) || 
            (window.event && window.event.type == "dblclick")) { //(custom_input || input_mode == 1){ //
            //input from multiline input element
            var sel_str = MoBiDic_module.get_selectionword(ev);
            if (!custom_input && sel_str == "" && input_mode == 1){
                alert(get_text("advanced input but no selection"));
                return false;
            }
            if (sel_str != "")
                str = sel_str;
        }
	    str = str.trim();
        if (str == '')
            return;
            
        //start mobidic independent infos...
        if (related_words_module){
            related_words_module.obj.ClearContent();
            related_words_module.start(0, 0, 0, str);
        }

        if (!m_history_step)
            MoBiDic_module.store_query(str);
        document.getElementById(input_field_id).value = str;
        if (input_mode == 0){
            var e = document.getElementById(input_area_id);
            if (e) e.value = str;
        }
        if (custom_input){
            var mode = 0;
            if (ev == 0 || ev == 1)
                mode = ev;
            return mbd_doSearch(mode);
        }


        //get the source and target languages
        var l1_obj = document.getElementById("L1");
        var l1 = 0; //default: from any language
        if (l1_obj.style.visibility != "hidden")
            l1 = getSelected(l1_obj);
        var l2_obj = document.getElementById("L2");
        var l2 = 0; //default: to any language
        if (l2_obj.style.visibility != "hidden")
            l2 = getSelected(l2_obj);

        var mode = search_mode;
/*        if (!ev)
            ev = window.event;
        var source = null;
        if (ev){
            if(typeof ev.target != 'undefined'){
                source = ev.target;
            }else if (typeof ev.srcElement != 'undefined'){
                source = ev.srcElement;
            }
        }
        if (!source  || (source.id == "search_auto_button") ||
            (document.getElementById("search_button").style.visibility == "hidden" &&
            document.getElementById("search_expr_button").style.visibility == "hidden" &&
            document.getElementById("search_auto_button").style.visibility == "hidden")){
            //if it contains more words => search in expressions
            if (isArray(str.match(/\w \w/)))
                mode = 1;
            else
                mode = 0;
        }else if (source.id == "search_button")
            mode = 0;
        else if (source.id == "search_expr_button")
            mode = 1;
*/
        start_query_ex(l1, l2, str, mode, dictionary_id, entries_module, entries_element, 0);
        
        return false;
    }
    
    this.get_selectionword = function (ev){
        var str = "";
        if (window.getSelection){
            str = window.getSelection();
            str = str.toString();

            if (str.length == 0){
                if (input_mode == 1){
                    //textarea
                    var input = document.getElementById(input_area_id);
                    var a = input.selectionStart;
                    var b = input.selectionEnd;
                    str = input.value.substring(a, b);
                }else{
                    //simple input
                    input = document.getElementById(input_field_id);
                    str = input.value;
                }
            }

        }else if (document.selection){
            str = document.selection.createRange().text;
        }
	
	if (ev && ev.target && ev.target.name && ev.target.name == "S_area")
	    return str;;
        //set input fields
	var input = document.getElementById(input_area_id);
    if (input)
        input.value = str;
        if (!input){
            input = document.getElementById(input_field_id);
        input.value = str;
        }
        
        return str;
    }

/*
    function getword(e){
        var str = get_selectionword(e);
        //alert(str);
        document.getElementById(input_field_id).value = str;
        startSearch();
        return false;
    }
*/
    this.doSearch = startSearch;
    
    if (!custom_input){
        m1_obj.content.SetFunc2Event("onclick", "input", "search_button", startSearch);
        m1_obj.content.SetFunc2Event("onclick", "input", "search_expr_button", startSearch);
        m1_obj.content.SetFunc2Event("onclick", "input", "search_auto_button", startSearch);
        m1_obj.content.SetFunc2Event("onkeypress", "input", input_field_id, onEnter);
    }
    document.ondblclick=startSearch;
    document.onclick=hide_history;
    //m1_obj.content.SetFunc2Event("ondblclick", "textarea", input_area_id, getword);//trial fixme
}

    function setvisible(obj, show, block){
        if (arguments.length == 2){
            block = true;
        }
        if (!show){
            obj.style.visibility = "hidden";
            if (block)
                obj.style.display = "none";
        }else{
            obj.style.visibility = "visible";
            if (block)
                obj.style.display = "block";
        }
    }

    function setvalue(name, obj){

/*        var obj = getJObject(name);
        var value;
        if (obj.checked != undefined)
            value = obj.checked;
        else
            value = getSelected(obj); //search_mode
*/            
        var value = obj;
        eval(name + "=" + value + ";");
        
        set_preferences(name, value);
        if (name == "show_L2"){
            setvisible(document.getElementById("L2"), value, true);
            setvisible(document.getElementById("L2_text_obj"), value, true);
        }
    
        if (name == "show_L1"){
            setvisible(document.getElementById("L1"), value, true);
            setvisible(document.getElementById("L1_text_obj"), value, false);
        }
            
        if (name == "input_mode"){
            setvisible(document.getElementById(input_area_id), value, true);
            setvisible(document.getElementById(input_field_id), !value, true);
        }

/*        if (value == false &&
            document.getElementById("search_button").style.visibility == "hidden" &&
            document.getElementById("search_expr_button").style.visibility == "hidden" &&
            document.getElementById("search_auto_button").style.visibility == "hidden"){
            alert(":)");
            obj = true;
        }
  */      
        if (name == "show_search_button"){
            setvisible(document.getElementById("search_button"), value, true);
        }
        if (name == "show_search_expr_button"){
            setvisible(document.getElementById("search_expr_button"), value, true);
        }
        if (name == "show_search_auto_button"){
            setvisible(document.getElementById("search_auto_button"), value, true);
        }

        //alert(eval(document.name));
        
    }

suggestion_visible = false;
function suggest(){
    suggestion_visible = !suggestion_visible;
    var obj = document.getElementById("suggestion_info");
    setvisible(obj, suggestion_visible);
}

Module.Entries = function(){
    
    // m_mode: mode of displaying results in entries module
    //      0=headword + entry
    //      1=headword 
    var m_mode = get_preferences("entries_mode", def_entries_mode);
    var m_viewer_mode = get_preferences("entries_viewer_mode", "tree");
    var m_entries_max_hits = get_preferences("entries_max_hits", number_of_hits);

    var last_l1, last_l2, last_dict_id, last_str, last_mode, last_offset;
    
    var settings_html = "<table border=\"0\" class='settingtable' align=center>";
	settings_html += "<tr>";
    settings_html += "<td><b>" + get_text("settings")+"</b></td>";
	settings_html += "</tr></table>";
    settings_html += "<table border=\"0\" class='settingtable'>";
/*    settings_html += "<td><input type=\"radio\" name=\"entries_mode\" id=\"mode0\" value=\"0\" onClick=\"entries_module.setmode(this, 'entry');\"";
    if (m_mode == 0)
        settings_html += " checked";
    settings_html += ">" + get_text("headword + entry") + "</td>";
	settings_html += "</tr><tr>";
    settings_html += "<td><input type=\"radio\" name=\"entries_mode\" id=\"mode1\" value=\"1\" onClick=\"entries_module.setmode(this, 'entry');\"";
    if (m_mode == 1)
        settings_html += " checked";
    settings_html += ">" + get_text("headword") + "</td>";
    settings_html += "</tr><tr>";*/
    settings_html += "<td>" + get_text("number of hits")+":</td>";
    //settings_html += "<td><input type=\"text\" name=\"entries_max_hits\" value=\""+m_entries_max_hits+"\" size=10 onkeyup=\"entries_module.save_limit(this)\">";
    settings_html += "<td><select name=\"entries_max_hits\" onchange=\"entries_module.save_limit(this)\">";
    if (m_entries_max_hits == 10) settings_html += "<option selected value='10'>10</option>";
        else settings_html += "<option value='10'>10</option>";
    if (m_entries_max_hits == 30) settings_html += "<option selected value='10'>30</option>";
        else settings_html += "<option value='30'>30</option>";
    if (m_entries_max_hits == 60) settings_html += "<option selected value='10'>60</option>";
        else settings_html += "<option value='60'>60</option>";
    if (m_entries_max_hits == 1000) settings_html += "<option selected value='10'>1000</option>";
        else settings_html += "<option value='1000'>1000</option>";
	settings_html += "</td>";
/*    settings_html += "</tr><tr>";
    settings_html += "<td><input type=\"radio\" name=\"view_mode\" id=\"view0\" value=\"tree\" onClick=\"entries_module.setmode(this, 'view');\"";
    if (m_viewer_mode == "tree")
        settings_html += " checked";
    settings_html += ">" + get_text("tree view");
    settings_html += "<input type=\"radio\" name=\"view_mode\" id=\"view1\" value=\"flat\" onClick=\"entries_module.setmode(this, 'view');\"";
    if (m_viewer_mode == "flat")
        settings_html += " checked";
    settings_html += ">" + get_text("flat view") + "</td>";
*/	
    settings_html += "</tr></table>";
    
    var def_html = get_Banner(); //reklam helye
    
    //var suggest_html = "<span id='suggest_1' style='visibility:hidden;position:absolute;top:30px;right:30px' onClick='alert(\"hello\")'>javasol</span>";
    var suggest_html = '';
    /*'<table cellpadding="0" cellspacing="0" width="170" id="suggest_1" style="visibility:hidden;position:absolute;top:25px;right:30px"><tbody><tr>';
    suggest_html += '<td style="width: 7px; height: 18px; background-image: url(images/lightbutton_left.gif);"><div style="width: 7px;"></div></td>';
    suggest_html +=  '<td style="background-image: url(images/lightbutton_bg.gif);" align="center">';
    suggest_html += '<a tabindex="5" class="buttonLinkSmall" href="javascript:suggest();">'+ get_text("suggest")+'</a>';
    suggest_html +=  '</td>';
    suggest_html +=  '<td style="width: 7px; background-image: url(images/lightbutton_right.gif);"><div style="width: 7px;"></div></td>';
    suggest_html +=  '</tr></tbody></table>';
    */
    
    var obj = new Module(get_text('entries'), settings_html, def_html, 'entries_module', "main");
    this.module = obj.module;
    this.obj = obj;
    this.loadingState = function (str){
        obj.loadingState(str);
        m_hit_count = 0;
    }
    
    var m_hit_count = 0;
    var m_title = "";
    var m_entry_id_list = new Array();
    var m_viewer = new Viewer();
    m_viewer.change_view(m_viewer_mode);
    
    this.init_items = function(){
        if (m_mode == "0"){ //head+entry
            entry_module.obj.close();
        }else
            entry_module.obj.open();
    }
    
    this.setmode = function(input_obj, type){
        if (type == "entry") {
            if (input_obj.value && input_obj.checked)
                this.m_mode = input_obj.value; //parseInt
            else
                return;
            if (this.m_mode == "0"){ //head+entry
                entry_module.obj.close();
            }else
                entry_module.obj.open();
            var a = this.get_displayed_entry_ids(); //fixme: lehetne parameter a entries_module valtozo
            for(var i=0; i<a.length; i++){
                var entryitem = document.getElementById(a[i]);
                var hworditem = document.getElementById(a[i].replace(/entry_/, "headword_"));
                var block = true;
                if (this.m_mode == 1){
                    setvisible( entryitem, false, block);
                    setvisible( hworditem, true, block);
                }else{
                    setvisible( entryitem, true, block);
                    setvisible( hworditem, false, block);
                }
            }
    
            set_preferences("entries_mode", this.m_mode);
        }else if (type == "view"){
            m_viewer.change_view(input_obj.value);
            m_viewer_mode = input_obj.value;
            set_preferences("entries_viewer_mode", m_viewer_mode);
        }
    }

    this.save_limit = function(obj){
        var val = getSelected(obj);//obj.value;
        if (val != "" && !isNaN(val)){
            if (val < 1){
                alert("'"+val + "' " + get_text("is too small..."));
                return false;
            }
            m_entries_max_hits = val;
            set_preferences("entries_max_hits", val);
            expressions_module.clear_query_params();
            this.clear_query_params();

        }else
            alert("'"+val + "' " + get_text("is not a number..."));
        return false;
    }

    this.get_limit = function(){
        return m_entries_max_hits;
    }

    
    this.m_mode = m_mode;
    this.viewer = m_viewer;
/*    
    function setting_init(){
        if (m_mode == 0)
            getJObject("mode0").checked = true;
        else if (m_mode == 1)
            getJObject("mode1").checked = true;
    }
    
    obj.setEditInit(setting_init);    
*/    
    this.get_displayed_entry_ids = function(){
        return m_entry_id_list;
    }
    
    this.push_entry_id = function(id){
        m_entry_id_list.push(id);
    }
    
    
    this.ClearContent = function(){
        obj.ClearContent();
        obj.content.innerHTML += suggest_html;
        //Initialise_tree(obj.content);//fixme
        //dict_nodes.length = 0;
        m_viewer.init(obj.content);
        m_entry_id_list.length = 0;
	m_hit_count = 0;
    }
    
    this.increase_hit_counter = function(){
        m_hit_count++;
        this.set_hit_counter(m_hit_count);
    }
    
    this.add_hit_counter = function(c){
        m_hit_count += parseInt(c);
        this.set_hit_counter(m_hit_count);
    }

    this.set_hit_counter = function(c){
        m_hit_count = parseInt(c);
        var str = m_title;
        obj.title.innerHTML = str.replace("%d", m_hit_count);
        //obj.title.innerHTML = m_hit_count + m_title;
    }

    this.set_title = function(str){
        m_title = str;
    }
    
    this.restore_caption = function(){
        var str = m_title;
        str = str.replace("%d", m_hit_count);
        obj.restore_caption(str);
        
        //suggest
        var sugg = document.getElementById("suggest_1");
        if (sugg)
            setvisible(sugg, true);

    }

    this.save_query_params = function (l1, l2, dict_id, str, mode, offset){
        last_l1 = l1;
        last_l2 = l2;
        last_dict_id = dict_id;
        last_str = str;
        last_mode = mode;
        last_offset = offset;
    }
    
    this.check_query_params = function(l1, l2, dict_id, str, mode, offset){
        if (l1 == last_l1 && 
            l2 == last_l2 && 
            dict_id == last_dict_id &&
            str == last_str && 
            mode == last_mode && 
            offset == last_offset)
                return true;
        return false;
    }
    
    this.clear_query_params = function(){
        this.save_query_params('', '', '', '', '', '');
    }
}




Module.Entry = function(){

  var settings = '';//'settings... todo: xslt parameters, tilde or not, ... (fixme)';
  var html= '';
    
  var obj = new Module(get_text('entry'), settings, html, 'entry_module');
  this.module = obj.module;
  this.obj = obj;

    this.loadingState = function (str){
        obj.loadingState(str);
        m_hit_count = 0;
    }
    
    var m_title = "";

    this.set_title = function(str){
        m_title = str;
    }
    
    this.restore_caption = function(){
        obj.restore_caption(m_hit_count + m_title);
    }

}




Module.Context = function(){

    context_limit = get_preferences("context_limit", context_limit);
    
    var last_l1 = 0;
    var last_l2;
    var last_dict_id, last_head_str, last_head_id, last_entry_id, last_context_limit;

    var settings_html = '<form onSubmit="return context_module.save_context_limit(this.context_limit)">';
    settings_html += '<table class="settingtable">'; 
    settings_html += '<tr><td>' + get_text("context_limit_text") +':</td>';
    settings_html += '<td><input type="text" name="context_limit" value="' + context_limit +'" size="5"></td>';
    settings_html += "</tr>";
    settings_html += "</table></form>";
    
    var obj = new Module(get_text('context_title'), settings_html, '', 'context_module');
    this.obj = obj;
    this.module = obj.module;
    this.loadingState = obj.loadingState;
    
    this.save_query_params = function(l1, l2, dict_id, head_str, head_id, entry_id){
        last_l1 = l1;
        last_l2 = l2;
        last_dict_id = dict_id;
        last_head_str = head_str;
        last_head_id = head_id;
        last_entry_id = entry_id;
        last_context_limit = context_limit;
    }
    
    this.close = function(){ 
        alert(delete obj);
    }
    
    this.getDescription = function(){
        return get_text("context description");
    }
    
    this.save_context_limit = function(obj){
        var val = obj.value;
        if (val != "" && !isNaN(val)){
            if (val < 1){
                alert("'"+val + "' " + get_text("is too small..."));
                return false;
            }
            context_limit = val;
            set_preferences("context_limit", context_limit);
            if (last_l1 != 0)
                start_context(last_l1, last_l2, last_dict_id, last_head_str, last_head_id, last_entry_id);
        }else
            alert("'"+val + "' " + get_text("is not a number..."));
        return false;
    }

    this.check_query_params = function(dict_id, head_str){
        if (dict_id == last_dict_id &&
            head_str == last_head_str &&
            context_limit == last_context_limit)
            return true;
        return false;
    }
}



/*    function save_context(obj){
        want_context = obj.checked;
    }
*/

    function start_each_word(l1, l2, dicts, str, mode){
    
        //if it contains more words => lookup each words, too
        var words = str.split(" "); 
        if (words.length > 1){
            for(i=0; i<words.length; i++){
                //entries_module.save_query_params(l1, l2, dicts.join(','), words[i], mode, 0);
                mbd_query(l1, l2, words[i], mode, dicts, entries_module, entries_module.obj.content, 0, true);
            }
        }
    
    }
    
    function start_context(l1, l2, dict, headword_str, headword_id, entry_id){
        
        // context switched OFF
        return;
        //check if this is exactly the last query => nothing to do
        //if(context_module.check_query_params(dict, headword_str))
        //    return;

        context_module.obj.ClearContent();
        context_module.loadingState(get_text("loading context for")+" '"+headword_str +"'...");
        //context_module.save_query_params(l1, l2, dict, headword_str, headword_id, entry_id);
        mbd_context(l1, l2, dict, headword_str, headword_id, entry_id, context_module.obj);
    }

    function start_expressions(l1, l2, dicts, headword_str){
        //check if this is exactly the last query => nothing to do
        //if(expressions_module.check_query_params(l1, l2, dicts.join(","), headword_str))
          //  return;

        expressions_module.obj.ClearContent();
       /* var dict_shortname = dict_man.get_shortname_by_intname(dict);
        if (dict_shortname != "")
            dict_shortname  = " ("+dict_shortname +")"; */
        expressions_module.set_title("'" + headword_str + "': %d " + get_text("expressions for")); // + dict_shortname
        expressions_module.loadingState(get_text("loading expressions for")+" '"+headword_str +"'...");
        expressions_module.save_query_params(l1, l2, dicts.join(","), headword_str);
        mbd_query(l1, l2, headword_str, 2, dicts, expressions_module, expressions_module.obj.content, 0, false); 
    }

    function show_related (l1, l2, dict, headword_str, headword_id, entry_id){
        //show context
        if (want_context){
            start_context(l1, l2, dict, headword_str, headword_id, entry_id)
        }
        
        //show expressions
        if (want_expression){
            start_expressions(l1, l2, dict, headword_str)
        }
        
        //related words moved to startseach
        //...
        
    }

    function show_related_info(dict_name, headword_str, str, obj){
        entry_module.obj.ClearContent();
        var title = "'" + headword_str + "': " + dict_name; //" '"+headword_str+"' " + get_text("entry in")
        entry_module.set_title(title);
        //entry_module.loadingState(get_text("loading entry for")+" '"+headword_str +"'...");
        str = str.replace(/(<font color="*red"*>[^<]+)</i, '$1<span id="showme"> </span><');
        entry_module.obj.content.innerHTML = str;
        var x = entry_module.obj.getContentItem("span", "showme");
        if (x && (typeof x.scrollIntoView!="undefined")){
                x.scrollIntoView(false);}
        entry_module.obj.restore_caption(title);
    }


    function show_next_results(l1, l2, str, mode, dict_id, dest_module, dest_element, offset){
        //dest_element.innerHTML += 'loading...';
        //dest_element.innerHTML = "";//"<span class='more_hits'>" + get_text('more results') + ":" + "</span>";  //kell ez?
        dest_element.onclick = null;
        //remove show next from tree
        if (dest_module.obj.getModuleName() == "entries_module")
            //dest_element.parentNode.parentNode.parentNode.removeChild(dest_element.parentNode.parentNode);
            //dest_element.innerHTML = "";
            dest_module.ClearContent();
        if (dest_module.obj.getModuleName() == "expressions_module")
            dest_element.innerHTML = "";
        //setvisible(dest_element, false);
        //dest_element.style.visibility = "hidden";
        //setvisible(dest_element, false, true);
        mbd_query(l1, l2, str, mode, dict_id, dest_module, dest_element, offset, false);
    }

    function start_query(headword_str, entry_id){
        document.getElementById(input_field_id).value = headword_str;
        document.getElementById(input_area_id).value = headword_str;
        MoBiDic_module.doSearch();
    }

Module.Expressions = function(){
    
    var m_expressions_max_hits = get_preferences("expressions_max_hits", expr_number_of_hits);
    var last_l1 = 0;
    var last_l2;
    var last_dict_id, last_head_str;
    
    var settings_html = '<form onSubmit="return expressions_module.save_limit(this.entries_max_hits)">';
    settings_html += "<table border=\"0\" class='settingtable' align=center>";
	settings_html += "<tr>";
    settings_html += "<td><b>" + get_text("settings")+"</b></td>";
	settings_html += "</tr></table>";

    settings_html += "<table border=\"0\" class='settingtable'>";
    settings_html += "<tr>";
    settings_html += "<td>" + get_text("number of hits")+":</td>";
    settings_html += "<td><input type=\"text\" name=\"entries_max_hits\" value=\""+m_expressions_max_hits+"\" onblur=\"return expressions_module.save_limit(this)\" size=\"5\">";
	settings_html += "</td>";
    settings_html += "</tr></table></form>";

  
    var obj = new Module(get_text('expressions'), settings_html, '', 'expressions_module');
    this.obj = obj;
    this.module = obj.module;

    this.loadingState = function (str){
        obj.loadingState(str);
        m_hit_count = 0;
    }
    //this.loadingState = obj.loadingState;
    
    var m_hit_count = 0;
    var m_title = "";
    
    this.increase_hit_counter = function(){
        m_hit_count++;
        this.set_hit_counter(m_hit_count);
    }
    
    this.add_hit_counter = function(c){
        m_hit_count += parseInt(c);
        this.set_hit_counter(m_hit_count);
    }

    this.set_hit_counter = function(c){
        m_hit_count = parseInt(c);
        var str = m_title;
        obj.title.innerHTML = str.replace("%d", m_hit_count);
        //obj.title.innerHTML = m_hit_count + m_title;
    }


    this.ClearContent = function(){
        obj.ClearContent();
	    m_hit_count = 0;
    }
 
    this.save_query_params = function(l1, l2, dict_id, head_str){
        last_l1 = l1;
        last_l2 = l2;
    	last_dict_id = dict_id;
        last_head_str = head_str;
    }

    this.check_query_params = function(l1, l2, dict_id, head_str){
        if (dict_id == last_dict_id &&
            head_str == last_head_str)
            return true;
        return false;
    }
    
    this.clear_query_params = function(){
        this.save_query_params('', '', '', '');
    }


    this.save_limit = function(obj){
        var val = obj.value;
        if (val != "" && !isNaN(val)){
            if (val < 1){
                alert("'"+val + "' " + get_text("is too small..."));
                return false;
            }
            m_expressions_max_hits = val;
            set_preferences("expressions_max_hits", val);
            //if (last_l1 != 0)
              //  start_expressions(last_l1, last_l2, last_dict_id, last_head_str);
            entries_module.clear_query_params();
            this.clear_query_params();
        }else
            alert("'"+val + "' " + get_text("is not a number..."));
        return false;
    }

    this.get_limit = function(){
        return m_expressions_max_hits;
    }

    this.set_title = function(str){
        m_title = str;
    }
    
    this.restore_caption = function(){
        var str = m_title;
        str = str.replace("%d", m_hit_count);
        obj.restore_caption(str);
    }

    this.getDescription = function(){
        return get_text("expression description");
    }

}




Module.Dictionaries = function(){

  var m_title = get_text('dictionaries');
  var m_show_order_cell = get_preferences('show_order_cell', false);
  var m_dictionary_order = get_preferences('dictionary_order', "");
  var m_closed_dictionaries = get_preferences('closed_dictionaries', "");


    var m_settings = "<table border=\"0\" class='settingtable' align=center>";
	m_settings += "<tr>";
    m_settings += "<td><b>" + get_text("settings")+"</b></td>";
	m_settings += "</tr></table>";

  m_settings += '<table class="settingtable"><tr><td>';
  m_settings += '<input type="checkbox" value="true" onclick="dictionaries_module.ShowOrderCells(this)"';
  if (m_show_order_cell)
    m_settings += ' checked';
  m_settings += ' >';
  m_settings += get_text('show ordering cells');
  m_settings += '</td></tr>';
  m_settings += '<tr><td>';
  m_settings += '<input type="button" value="'+get_text('order')+'" onclick="dictionaries_module.OrderCells()"><br>';
  m_settings += '</td></tr></table>';
  var obj = new Module(m_title, m_settings, '', 'dictionaries_module');
  this.module = obj.module;
  this.obj = obj;
  
  //amikor a dictionary object kész van, akkor mehet a 
  this.list_dictionaries = function(){
    obj.loadingState();
    
    if (m_dictionary_order != ""){
        //log_info(1, "dictionary_order called", "");
        var arr = m_dictionary_order.split(":");
        dict_man.order_by(arr);
        //log_info(1, "dictionary_order finished", "");
    }
    if (m_closed_dictionaries != ""){
        var arr = m_closed_dictionaries.split(":");
        //apply dicts states
        for(var i=0; i<arr.length; i++){
            dict_man.set_state_by_intname(arr[i], false);
        }
    }
    dict_man.display_dictionaries(obj, m_show_order_cell);
    var sum = dict_man.dictionaries.length;

    //var sum = get_dictionaries(obj);
    obj.restore_caption(m_title + " (" + sum + ")");
/*    
    //add buttons, too
    var html = "<FIELDSET><LEGEND>" + get_text('switch dictionaries by group');
    html += "</LEGEND>";
    var all_langs = dict_man.get_supported_langs(true);
    var dst_langs = dict_man.get_supported_langs(false);
    for(i=0; i<dst_langs.length; i++)
        add_new_element(all_langs, dst_langs[i]);
    html += "<input type='button' value='"+get_text('all')+"' id='dict_sel_all' onclick='dictionaries_module.set_langs(0)'>";
    html += "<input type='button' value='"+get_text('none')+"' id='dict_sel_none' onclick='dictionaries_module.set_langs(-1)'>";
    for(var i = 1; i<all_langs.length; i++){
        //html += "<input type='image' src='"+flags_path+"/"+get_flag(all_langs[i])+"' value='"+get_text(all_langs[i])+"' name='aaa' onclick='dictionaries_module.set_langs("+all_langs[i]+")'>";
        html += "<input type='button' value='"+get_text(all_langs[i])+"' id='dict_sel_"+all_langs[i]+"' onclick='dictionaries_module.set_langs("+all_langs[i]+")'>";
    }
    html += "</FIELDSET>";
    obj.content.innerHTML += html;
*/
    
    var parent = document.getElementById("parent");
    parent.style.visibility = "visible";

  }
  
  function save_state_into_cookie(){
    //save in cookie: which is turned OFF
    var closed_dicts = dict_man.get_dictlist_by_state("closed");
    set_preferences('closed_dictionaries', closed_dicts);
  }
  
  //dict_id: come form server
  //index: dict index in dict_man object
  this.set_state = function(index, state){
        
    //set in dict obj
    dict_man.set_state(index, state);
    
    //save in cookie
    save_state_into_cookie();
  }
  
  this.set_langs = function(lang_code){
    var dictids = dict_man.get_dicts_to_lang(lang_code);
    if (lang_code == 0){
        for(var i = 0; i<dictids.length; i++){
            var obj = document.getElementById("dict_id_" + dictids[i]);
            obj.checked = true;
            dict_man.set_state_by_id(dictids[i], true);
        }
        save_state_into_cookie();
        return;
    }else if (lang_code == -1){
        dictids = dict_man.get_dicts_to_lang(0);
        for(var i = 0; i<dictids.length; i++){
            var obj = document.getElementById("dict_id_" + dictids[i]);
            obj.checked = false;
            dict_man.set_state_by_id(dictids[i], false);
        }
        save_state_into_cookie();
        return;
    }
    
    var all = dict_man.get_dicts_to_lang(0);
    for(var i = 0; i<all.length; i++){
        var obj = document.getElementById("dict_id_" + all[i]);
        obj.checked = false;
        dict_man.set_state_by_id(all[i], false);
    }
    //alert(dictids);
    for(var i = 0; i<dictids.length; i++){
        var obj = document.getElementById("dict_id_" + dictids[i]);
        obj.checked = true;
        dict_man.set_state_by_id(dictids[i], true);
    }
    save_state_into_cookie();
  }
  
  this.ShowOrderCells = function(checkbox){
    var obj;
    m_show_order_cell = checkbox.checked;
    set_preferences('show_order_cell', m_show_order_cell);
    for(var i = 0; i<dict_man.dictionaries.length; i++){
        obj = document.getElementById("ordercell_td_" + i);
        if (m_show_order_cell)
            obj.style.visibility = "visible";
        else
            obj.style.visibility = "hidden";
    }
  }
  
  this.OrderCells = function(){
    var cell;
    for(var i = 0; i<dict_man.dictionaries.length; i++){
        cell = document.getElementById("ordercell_" + i);
        dict_man.set_order_value(i, cell.value);
    }
    dict_man.sort();
    obj.content.innerHTML = "";
    dict_man.display_dictionaries(obj, m_show_order_cell);
    set_preferences('dictionary_order', dict_man.get_order());
  }
  
  this.orderItem = function(item, where){
    //log_info(1, "orderItem called", "");
    dict_man.move(item, where);
    //log_info(1, "move called", "");
    obj.content.innerHTML = "";
    dict_man.display_dictionaries(obj, m_show_order_cell);
    //log_info(1, "displayed", "");
    set_preferences('dictionary_order', dict_man.get_order());
  }
  this.getDescription = function(){
    return get_text("dictionary description");
  }

}


Module.Messages = function(){

  var m_message_limit = get_preferences('message_limit', 5);
  var m_update_limit = get_preferences('message_update_limit', 5);
    var settings_html = "<form onSubmit=\"return messages_module.save_limits(this)\">";
    settings_html += "<table class='settingtable'>";
    settings_html += '<tr><td>' + get_text("word limit") +':</td>';
    settings_html += '<td><input type="text" name="limit" value="' + m_message_limit +'" size="5"></td>';
    settings_html += "</tr>";
    settings_html += '<tr><td>' + get_text("refresh limit") +':</td>';
    settings_html += '<td><input type="text" name="update_limit" value="' + m_update_limit +'" size="5">';
    settings_html += '(' + get_text("min") + ')  <input type="submit" value="OK"></td>';
    settings_html += "</tr>";

    settings_html += '</table></form>';
  
  var m_html = '<input type="text" name="message" id="message" size="50" maxlength="120">';
  m_html += '<input type="button" name="send" value="'+get_text("send")+'" id="send" onclick="messages_module.SendMessage()"><br>';
  
  var obj = new Module(get_text('messages'), settings_html, m_html + get_text('loading...'), 'messages_module');
  this.module = obj.module;
  this.obj = obj;

  this.getDescription = function(){
    return get_text("message description");
  }

  this.save_limits = function (obj){
        var val = obj.limit.value;
        if (val != '' && !isNaN(val)){
                if (val < 1){
                    alert("'"+val + "' " + get_text("is too small..."));
                    return false;
                }
                m_message_limit = val;
                set_preferences("message_limit", m_message_limit);
                update_messages(); //:)
        }else
            alert("'"+val + "' " + get_text("is not a number..."));
        val = obj.update_limit.value;
        if (val != '' && !isNaN(val)){
                if (val < 1){
                    alert("'"+val + "' " + get_text("is too small..."));
                    return false;
                }
                m_update_limit = val;
                set_preferences("message_update_limit", m_update_limit);
                clearTimeout(m_timer);
                m_timer = window.setInterval(update_messages, m_update_limit * 60 * 1000);
        }else
            alert("'"+val + "' " + get_text("is not a number..."));
        return false;
    }
    
  this.SendMessage = function (){
    var str = obj.getContentItem("input", "message");
    //send to server
    if (!offline && other_services_url != ""){
        var url=other_services_url+"?do=new_message&message="+encodeURIComponent(str.value);
        getXml(url, update_messages);
    }
  }
    
  function update_messages()
  { 
      if (!offline && other_services_url != ""){
        obj.loadingState();
        var url=other_services_url+"?do=get_messages&message_limit="+m_message_limit;
        getXml(url, update_messages_parse);
      }
      
      function update_messages_parse(response){
          log_info(4, "update_messages_parse", response.responseText); 
          var root = response.responseXML.documentElement;
          var list = root.getElementsByTagName("message"); 
          var html = m_html;
          for(var i=0; i<list.length; i++){
            html += list[i].firstChild.nodeValue + "<br>";
          }

          obj.content.innerHTML = html;
          obj.restore_caption();
      }
  }
  
  var m_timer = window.setInterval(update_messages, m_update_limit * 60 * 1000); //60*1000 = 1 second
  update_messages();
}



Module.LastQueries = function(){

  var m_word_limit = get_preferences('LastQueries_word_limit', 5);
  var m_update_limit = get_preferences('LastQueries_update_limit', 5);
    var settings_html = "<table class='settingtable'>";
//    settings_html += '<tr><td>' + get_text("word limit") +':</td>';
//    settings_html += '<td><input type="text" name="limit" value="' + m_message_limit +'" size=10 onkeyup="messages_module.save_limit(this)"></td>';
//    settings_html += "</tr>";
    settings_html += '<tr><td>' + get_text("refresh limit") +':</td>';
    settings_html += '<td><input type="text" name="update_limit" value="' + m_update_limit +'" size=10 onkeyup="last_queries_module.save_limit(this)">';
    settings_html += '(' + get_text("min") + ')</td>';
    settings_html += "</tr>";
    settings_html += "</table>";

  
  var obj = new Module(get_text('last queries'), settings_html, get_text('loading...'), 'last_queries_module');
  this.module = obj.module;
  this.obj = obj;

  this.save_limit = function (obj){
        var val = obj.value;
        if (val != '' && !isNaN(val)){
            if (obj.name == "limit"){
                m_message_limit = val;
                update(); //:)
                set_preferences("message_limit", m_message_limit);
            }else{
                m_update_limit = val;
                set_preferences("message_update_limit", m_update_limit);
            }
        }else
            alert("'"+val + "' " + get_text("is not a number..."));
    }

  function update()
  { 
      if (!offline && other_services_url != ""){
        obj.loadingState();
        var url=other_services_url+"?do=last_queries&limit="+m_word_limit;
        getXml(url, update_words_parse);
      }
  
      function update_words_parse(response){
          log_info(4, "update_words_parse", response.responseText); 
          var root = response.responseXML.documentElement;
          var list = root.getElementsByTagName("word"); 
          var html = "";
          for(var i=0; i<list.length; i++){
            html += list[i].firstChild.nodeValue + "<br>";
          }


          obj.content.innerHTML = html;
          obj.restore_caption();
      }
  }
  
  var Timer = window.setInterval(update, m_update_limit * 60 * 1000); //60*1000 = 1 minute
  update();
}



Module.UnknownWords = function(){

  var m_word_limit = get_preferences('UnknownWords_word_limit', 5);
  var m_update_limit = get_preferences('UnknownWords_update_limit', 5);
  
  var m_help_done = false;
  var m_help_form_opened = false;
  var m_orig_size;
    var settings_html = "<table class='settingtable'>";
//    settings_html += '<tr><td>' + get_text("word limit") +':</td>';
//    settings_html += '<td><input type="text" name="limit" value="' + m_message_limit +'" size=10 onkeyup="messages_module.save_limit(this)"></td>';
//    settings_html += "</tr>";
    settings_html += '<tr><td>' + get_text("refresh limit") +':</td>';
    settings_html += '<td><input type="text" name="update_limit" value="' + m_update_limit +'" size=10 onkeyup="unknown_words_module.save_limit(this)">';
    settings_html += '(' + get_text("min") + ')</td>';
    settings_html += "</tr>";
    settings_html += "</table>";
  
  var lang_src = new Array(2057, 1038, 1036);//dict_man.get_supported_langs(false);
  var lang_trg = new Array(2057, 1038, 1036);//dict_man.get_supported_langs(true);

  
  var obj = new Module(get_text('last_unknown_words'), settings_html, get_text('loading...'), 'unknown_words_module');
  this.module = obj.module;
  this.obj = obj;
  
  function make_select(name, lang_codes, def_language){
    var html = "<select name='"+name+"' id='"+name+"' style='font-size:"+font_size+"'>";
    for(var i=0;i<lang_codes.length; i++){
        html += "<option value='"+lang_codes[i] + "'";
        if (lang_codes[i] == def_language)
          html += " selected";
        html += ">"+get_text(lang_codes[i]) + "</option>";
    }
    html += "</select>";
    return html;
  }
  
  this.help_form_submit = function(){
    
    var l1, l2, src, src_mod, trg, comment, src_mod, pos;
    var obj = document.getElementById('unknown_src_lang');
    if (obj)
        l1 = getSelected(obj);
    obj = document.getElementById('unknown_trg_lang');
    if (obj)
        l2 = getSelected(obj);
    obj = document.getElementById('unknown_pos');
    if (obj)
        pos = getSelected(obj);
    obj = document.getElementById('unknown_word_src');
    if (obj)
        src = obj.value;
    obj = document.getElementById('unknown_word_src_modified');
    if (obj)
        src_mod = obj.value;
    obj = document.getElementById('unknown_word_trg');
    if (obj)
        trg = obj.value;
    if (trg == ""){
        alert(get_text('give a translation'));
        obj.focus();
        return false;
    }
        
    obj = document.getElementById('unknown_word_comment');
    if (obj)
        comment = obj.value;
        
        
    src = Url.encode(src);
    src_mod = Url.encode(src_mod);
    trg = Url.encode(trg);
    comment = Url.encode(comment);
    
    if (other_services_url != ""){
        var url=other_services_url+"?do=add_unknow_word&l1="+l1+"&l2="+l2+"&pos="+pos+"&word_orig="+src+"&word="+src_mod+"&word_trg="+trg+"&comment="+comment+"&limit="+m_word_limit;
        m_help_done = true;
        getXml(url, update_words_parse);
    }
    this.obj.setProperties(m_orig_size, "on");
    return false;

    //alert("hello"+ l1 + " " + l2 + " " + src + " " + trg + " " + comment);
  }
  
  this.hide_form = function(){
    this.obj.setProperties(m_orig_size, "on");
    var obj = document.getElementById('help_form');
    if (obj && obj.style.display != "none")
        setvisible(obj, false);
    obj = document.getElementById('help_form_details');
    if (obj)
        setvisible(obj, true);
    m_help_form_opened = false;

    return false;
  }
  
  this.show_form = function(word){
    var params = this.obj.getProperties().split(":");
    m_orig_size = params[2];
    this.obj.setProperties(200, "on");
    var obj = document.getElementById('help_form');
    var html = "";
    var pos_array = new Array('', 'IGE', 'FN', 'MN', 'SZN', 'HAT');
    
    lang_src = dict_man.get_supported_langs(false);
    lang_trg = dict_man.get_supported_langs(true);

    html += "<br><FIELDSET><LEGEND>" + get_text("What does it mean?") + "</LEGEND>";
    html += "<table><tr><td colspan='2'>";
    html += make_select('unknown_src_lang', lang_src, 2057);
    html += ' <input type="text" name="unknown_word_src_modified" id="unknown_word_src_modified" value="'+word+'">';
	html += " => ";
    html += make_select('unknown_trg_lang', lang_trg, 1038);
    html += ' <input type="hidden" name="unknown_word_src" id="unknown_word_src" value="'+word+'">';
    html += ' <input type="text" name="unknown_word_trg" id="unknown_word_trg" title="'+get_text('unknown word trg details')+'" >';
    html += "</td></tr>";
    html += "<tr><td>";
    html += get_text('part of speech')+ ":</td><td> " + make_select('unknown_pos', pos_array, 0);
    html += "</td></tr>";
    html += "<tr><td>";
    html += get_text('comment')+':</td><td> <input type="text" name="unknown_word_comment" id="unknown_word_comment" title="'+get_text('unknown word comment details')+'" size=20>';
    html += '<input type="submit" value="'+get_text('send')+'" onClick="return unknown_words_module.help_form_submit()" style="font-size:'+font_size+'">';
    html += '<input type="submit" value="'+get_text('cancel')+'" onClick="return unknown_words_module.hide_form()" style="font-size:'+font_size+'">';
    html += "</td></tr></table>";
    html += "</FIELDSET>";
    
    obj.innerHTML = html;

    if (obj.style.display == "none")
        setvisible(obj, true);
    m_help_form_opened = true;
    obj = document.getElementById('help_form_details');
    if (obj)
        setvisible(obj, false);
    
    return false;

  }

  this.save_limit = function (obj){
        var val = obj.value;
        if (val != '' && !isNaN(val)){
            if (obj.name == "limit"){
                m_message_limit = val;
                update(); //:)
                set_preferences("message_limit", m_message_limit);
            }else{
                m_update_limit = val;
                set_preferences("message_update_limit", m_update_limit);
            }
        }else
            alert("'"+val + "' " + get_text("is not a number..."));
    }

  function update(){
  
      if (m_help_form_opened)
        return;
        
      if (/*!offline && */other_services_url != ""){
        obj.loadingState();
        var url=other_services_url+"?do=unknow_words&limit="+m_word_limit;
        getXml(url, update_words_parse);
      }
    }
  
    function update_words_parse(response){
      log_info(4, "update_words_parse", response.responseText); 
      var root = response.responseXML.documentElement;
      var list = root.getElementsByTagName("word"); 
      var html = "";
      var word = "";
      for(var i=0; i<list.length; i++){
        word = list[i].firstChild.nodeValue;
        if (true)
            html += "<a href='#' onClick='return unknown_words_module.show_form(\"" + word + "\")' title='"+get_text('i know it')+"'>" + word + "</a><br>";
        else
            html += list[i].firstChild.nodeValue + "<br>";
      }
    
      var table = "<table width='100%'><tr><td>";
      table += html + "</td><td>";
      table += "<div id='help_form_details' name='help_form_details'>";
      if (m_help_done)
        table += get_text("thanks") + "<br>" + get_text("next") + get_image('emoticons/emoticon-0138-thinking.gif');
      else
        table += get_image('emoticons/emoticon-0138-thinking.gif') + get_text('help us') + "<br>" + get_text('help us details');
      table += "</div>";
      table += "</td></tr><tr><td colspan='2'>";
      table += "<div id='help_form' name='help_form' style='display:none'></div>";
      table +=  "</td></tr></table>";
      
      obj.content.innerHTML = table;
      obj.restore_caption();
    }

  
  var Timer = window.setInterval(update, m_update_limit * 60 * 1000); //60*1000 = 1 minute
  update();
  
}

Module.RelatedWords = function(){

    var m_word_limit = 10;
    var m_blacklist = "on";
    var m_tagcloud = true;
    var m_details_text = get_text('related words details');
    var m_prev_word = "";
    
    
    var settings_html = "<table class='settingtable'>";
    settings_html += '<tr>';
    settings_html += '<td><input type="checkbox" name="" ';
    if (m_tagcloud)
        settings_html += ' checked';
    settings_html += ' onclick="related_words_module.save_parameter(\'tagcloud\', this.checked)">';
    settings_html += get_text("show in tagcloud") +'</td>';
    settings_html += "</tr>";
    settings_html += '<tr>';
    settings_html += '<td><input type="checkbox" name="" ';
    if (m_blacklist)
        settings_html += ' checked';
    settings_html += ' onclick="related_words_module.save_parameter(\'blacklist\', this.checked)">';
    settings_html += get_text("filter obscene words") +'</td>';
    settings_html += "</tr>";
    settings_html += "</table>";
  
  var obj = new Module(get_text('related words'), settings_html, '', 'related_words_module');
  this.module = obj.module;
  this.obj = obj;


    this.save_parameter = function(name, value){
        if (name == "tagcloud")
            m_tagcloud = value;
        if (name == "blacklist"){
            if (value)
                m_blacklist = "on";
            else
                m_blacklist = "";
        }
        //update
        if (m_prev_word != "")
            this.start(0, 0, 0, m_prev_word);
    }

  this.start = function(l1, l2, dict_id, headword_str){
      headword_str = headword_str.trim();
      m_prev_word = headword_str;
      if (!offline && other_services_url != "" && headword_str != ""){
        obj.loadingState();
        var url=other_services_url+"?do=related_words&str="+headword_str+"&limit="+m_word_limit+"&blacklist="+m_blacklist;
        getXml(url, related_words_parse);
      }
    
  
      function related_words_parse(response){
          log_info(4, "related_words_parse", response.responseText); 
          var root = response.responseXML.documentElement;
          var html = m_details_text + "<br>";
          if (m_blacklist == ""){
            html += get_image("18limit.png");
          }
          if (m_tagcloud){
            var list = root.getElementsByTagName("tagcloud"); 
            if (list && list[0] && list[0].firstChild)
                html += list[0].firstChild.nodeValue;
          }else{
              var list = root.getElementsByTagName("word"); 
              for(var i=0; i<list.length; i++){
                var word = list[i].firstChild.nodeValue;
                //html += list[i].firstChild.nodeValue + "<br>";
                html += "<a href=\"javascript:start_query('"+word+"', 0)\">";
                html += word + "</a><br>";
              }
          }

          obj.content.innerHTML = html;
          obj.restore_caption();
          obj.title.innerHTML = "'"+headword_str+"': " + get_text('related words');
      }
  }
}


Module.Settings = function(){

    var settings = '';
    var html = '';  
    var m_active_css = get_preferences('active_css', active_css);
    if (m_active_css == ''){
        m_active_css = getActiveStyleSheet();
    }else
        setActiveStyleSheet(m_active_css);
    var m_user_config_exits = true;
    if ((get_config_index('user') == 0) &&
        (configs[0].name != 'user'))
        m_user_config_exits = false;
    

    function print_modules(obj){
        if (obj.length == 0){
            var curr_index = get_config_index(active_config);
            load_modules_infos(obj, configs[curr_index].columns);
        }
        var html = '<table>';
        for(var i=0;i<obj.length; i++){
            //html += obj[i][0] + ' ' + obj[i][1] + '<br>';
            try{
                if (obj[i][0] == "settings_module" ||
                    obj[i][0] == "context_module" ||
                    obj[i][0] == "entry_module")
                    continue;

                var current_module = eval(obj[i][0]);
                if (current_module.obj.isMainModule())
                    continue;
                html += '<tr><td> </td><td><input type="checkbox" id="check_'+obj[i][0]+'" name="check_'+obj[i][0]+'" value="on" onClick="settings_module.dosome(this.checked, '+obj[i][0] +')" '; 
                if (obj[i][1] != 'off') 
                    html += ' checked="checked" ';
    
                html += '/>';
                var title = current_module.obj.getTitle(); //eval(obj[i][0] + ".obj.getTitle()") ;//obj[i][0].obj.getTitle();//
                if(typeof current_module.getDescription == 'function'){
                    var desc = current_module.getDescription();
                    html += '</td><td><div OnMouseover="showTooltip(0, 0, \''+title+'\', \''+desc+'\')" OnMouseout="hideTooltip();">'; //
                    html += '<label for="check_'+obj[i][0]+'">' + title +'</label></div>'; //
                }else{
                    html += '</td><td>' + title;    
                }
                html += '</td></tr>'; 
            }catch(err){
                continue;
            }
            
                //alert(eval(obj[i][0] + ".obj.getTitle()"));
        }
        html += '</tr></table>';
        return html;
    }

    function print_stylesheets(){
        var html = '';
        html += '<select OnChange="settings_module.change_css(getSelected(this))">';
        var css_names = getStyleSheetList();
        //var active_css = getActiveStyleSheet();
        for(var i=0;i<css_names.length; i++){
            html += '<option value="'+css_names[i]+'" ';
            if (m_active_css == css_names[i])
                html += "selected";
            html += ' >'+css_names[i]+'</option>';
        }
        html += '</select>';
        return html;
    }

    function print_configs(){
        var html = '';
        html += '<select id="config_selector" name="config_selector" OnChange="settings_module.change_config(getSelected(this))">';

        for(var i=0;i<configs.length; i++){
            html += '<option value="'+configs[i].name+'" ';
            if (active_config == configs[i].name)
                html += "selected";
            html += ' >'+get_text(configs[i].name)+'</option>';
        }
        html += '</select>';
        return html;
    }

    function print_col_number(){
        var html = '<select id="column_number" name="column_number" onChange="settings_module.changeColumnNumber(this)" >';

        var curr_index = get_config_index(active_config);
        var col_number = configs[curr_index].columns.length;

        for(var i=1;i<4; i++){
            html += '<option value="'+i+'" ';
            if (col_number == i)
                html += "selected";
            html += ' >'+i+'</option>';
        }
        html += '</select>';
        return html;
    }

    html += '<table >';//class="settingtable"
    html += '<tr>';
    html += '<td colspan="2"><input type="button" onclick="javascript:restore_defaults()" value="' + get_text('restore defaults') + '" />';
    html += '</td></tr>';
    html += '<tr><td><b>'+get_text('number of columns')+':</b></td><td>';
    html += print_col_number();
    html += '</td></tr>';
    html += '<tr><td>';
    html += '<b>'+get_text('font size')+ ':</b></td><td>';
//    <a href="javascript:ts(\'body\',1)">'+get_image('zoomin.gif', get_text('larger font'))+'</a>';
//    html += '&nbsp;<a href="javascript:ts(\'body\',-1)">'+get_image('zoomout.gif', get_text('smaller font'))+'</a>';
    html += print_font_sizes('font_sizer', 'set_font_event(\'body\', getSelected(this))', font_size);
    html += '</td></tr>';
//    html += '<tr><td><b>'+get_text('styles')+':</b></td><td>';
//    html += print_stylesheets();
//    html += '</td></tr>';
    html += '<tr><td><b>'+get_text('configs')+':</b></td><td>';
    html += print_configs();
    html += '</td></tr>';
      
/*    html += '<tr><td>';
    html += '<b>'+get_text('ui langs')+ ':</b></td><td>';
    html += '<table ><tr><td width="40" align="left">';
    html += '<a href="index.htm?lang=hu"><img src="'+flags_path+'/'+get_flag('hu')+'" border="0"></a> ';
    //html += '</td><td width="40" align="right">';
    html += '<a href="index.htm?lang=en"><img src="'+flags_path+'/'+get_flag('en')+'" border="0"></a>';
    html += '</td></tr>';
*/    html += '</table></td></tr>';

    html += '<tr><td colspan="2"><b>'+get_text('modules')+':</b></td></tr>';
    html += '<tr><td>';
    html += print_modules(module_info);
    html += '</td></tr></table>';
    
    
  var obj = new Module(get_text('settings'), settings, html, 'settings_module');
  this.module = obj.module;
  this.obj = obj;
  //user prefs
  if (!offline && other_services_url != ""){
    url=other_services_url+"?do=user_prefs&info="+encodeURIComponent(document.cookie);
    getXml(url, function(){});
  }

  
  this.dosome = function(show, module_name){
    if (show){
        module_name.obj.open();
    }else{
        module_name.obj.close();
    }
    save_positions();
  }
  this.change_css = function(name){
    setActiveStyleSheet(name);
    set_preferences('active_css', name);
  }
  
  this.change_config = function(name){
    var index = get_config_index(name);
    make_config(configs[index]);
    
    //update column_number select
    var sel = obj.getContentItem("select", "column_number");
    if (sel.selectedIndex != configs[index].columns.length-1)
        sel.selectedIndex = configs[index].columns.length-1;
    
    set_preferences('active_config', name);
  }
  
  this.update_config = function (arr, arr_width){
    
    if (!m_user_config_exits){
        var x = new configuration();
        x.name = "user";
        configs.push(x);
    }
    update_user_config(arr, arr_width);
    set_preferences('active_config', "user");
    var index = get_config_index('user');
    var sel_obj = obj.getContentItem("select", "config_selector");
    if (!m_user_config_exits){
        sel_obj.options[configs.length-1] = new Option(get_text('user'), 'user');
        m_user_config_exits = true;
    }
    if (sel_obj.selectedIndex != index)
        sel_obj.selectedIndex = index;
  }

  this.updateModuleState = function(item, state){

    var ch_obj = obj.getContentItem('input', 'check_'+item);
    if (ch_obj)
        ch_obj.checked = state;
    
    custom_apperance(item);
  }
  
  this.changeColumnNumber = function(obj){
     column_number=getSelected(obj);
     //save into cookie
     set_preferences('column_number', column_number);
     change_col_number(column_number);

    if (column_number == 1){

        //put all boxes into this col
        var c2_arr = getModuleArr(document.getElementById("column_2"));
        c2_arr  = c2_arr.concat(getModuleArr(document.getElementById("column_3")));
        for(i=0; i<c2_arr.length;i++){
            removeItem(c2_arr[i]);
            document.getElementById("column_1").appendChild(c2_arr[i]);
        }

        save_positions();

     }else if (column_number == 2){
        
        //put all boxes in last col into this col
        var c3_arr = getModuleArr(document.getElementById("column_3"));
        for(i=0; i<c3_arr.length;i++){
            removeItem(c3_arr[i]);
            document.getElementById("column_2").appendChild(c3_arr[i]);
        }
        save_positions();

     }
  }

}

/*
Module.LanguageSelector = function(){

  var settings = '';
  var html= '<center>';
  html += '<table ><tr><td width="40" align="left">';
  html += '<a href="?lang=hu"><img src="'+flags_path+'/'+get_flag('hu')+'" border="0"></a> ';
  html += '</td><td width="40" align="right">';
  html += '<a href="?lang=en"><img src="'+flags_path+'/'+get_flag('en')+'" border="0"></a>';
  html += '</td></tr></table>';
  html += '</center>';
  
  var obj = new Module(get_text('ui langs'), settings, html, 'langs_module');
  this.module = obj.module;
  this.obj = obj;
  
}
*/

Module.Help = function(){

  var settings = '';
  var tip1_on = false;
  var tip1_str = '<a href="'+help_path+'/index.htm?lang='+ui_lang+'" target="blank">'+get_text('show help')+'</a>';
  //var tip2_str = '<a href="'+help_path+'/tip1.htm?lang='+ui_lang+'" target="blank">'+get_text('help tip 1')+'</a>';
  var html= get_text('help intro');
  //html += '<div onclick="help_module.show_demo(this)">';
  html += '<br/>';
  html += '<br/>' + tip1_str;
  //html += '<br>' + tip2_str;
  //html += '</div>';
  
    
  var obj = new Module(get_text('help'), settings, html, 'help_module');
  this.module = obj.module;
  this.obj = obj;
//PG asked me to work in other way
/*  this.show_demo = function(dest_element){
    if (tip1_on){
       tip1_on = false;
       dest_element.innerHTML = tip1_str;
       return false;
    }
    var str = '<a href="#">' + get_text('close') + '</a> <img src="demo/demo.gif">';
    str += 'Az egÃ©rmutatÃ³val lehet az ablakok mÃ©retÃ©t (alul Ã©s oldalt) vÃ¡ltoztatni, fejlÃ©cÃ¼knÃ©l fogva pedig kÃ¶nnyen Ã¡thelyezhetÅ‘k. <img src="images/smiley.gif">';
    //show_tip_of_the_day('Ablakok mÃ©retÃ©nek, elrendezÃ©sÃ©nek beÃ¡llÃ­tÃ¡sa', str);
    /*var obj = new Module('title', '', str, 'id_tmp', 0);
	var container = document.getElementById("tipoftheday");
	container.appendChild(obj.module);
    container.style.visibility = "visible";
*/
/*    dest_element.innerHTML = str; 
    tip1_on = true;

    //alert(str);
    return false;
  }
*/
  this.getDescription = function(){
    return get_text("help description");
 }

}


function show_modules(){
    
    var curr_index = get_config_index(active_config);
    make_config(configs[curr_index]);
    //font_size = get_preferences('font_size', font_size);
    if (font_size != ""){
        set_font_size("body", font_size);
    }

	close_loading();    
}

function initialize_MoBiDic(){

    //load_modules_infos(module_info, new Array(column_1, column_2, column_3));

    dictionaries_module = new Module.Dictionaries();
    entries_module = new Module.Entries();
    entry_module = new Module.Entry();
    expressions_module = new Module.Expressions();
    messages_module = new Module.Messages();
    last_queries_module = new Module.LastQueries();
    unknown_words_module = new Module.UnknownWords();
    related_words_module = new Module.RelatedWords();
    context_module = new Module.Context();
    MoBiDic_module = new Module.Main();
    //langs_module = new Module.LanguageSelector();
    help_module = new Module.Help();
    settings_module = new Module.Settings();
    

    MoBiDic_module.after_initialize(dictionaries_module.list_dictionaries);
    MoBiDic_module.after_initialize(entries_module.init_items);
    MoBiDic_module.after_initialize(MoBiDic_module.fill_language_selectors);
    MoBiDic_module.after_initialize(show_modules);
    MoBiDic_module.init();

    if (bubble){
	    enableTooltips();//for bubble
    	watch_event(document, 'mousemove', Locate);
    }

}

    get_user_settings();