// ---- funktioner för input_string ----

var input_string_timer=[];
var input_string_completion_last=[];
var input_string_click=[];
var input_string_adjust=[];
// IE-fix: får inte vara med två gånger 
if(typeof(input_string_suggestions)=='undefined'){
    var input_string_suggestions=[];
};

function input_string_set_suggestions(id,state){
    // sätter meny + completion aktiv för id till state
    input_string_suggestions[id]=state;
};

function input_string_activate(id,url,suggestions,adjust){
    // effekt: sätter upp textfält id+"input" till input-string-kontroll
    //         url är ställe att hämta menyn
    //         om suggestions visas förslag
    //         om adjust alignas meny med botten på input

    var input=document.getElementById(id+'input');

    // registrerar tangentbord
    add_listener(input,'focus',function(){
	focus_history_add(this);
	keyboard_focus(input);
    },false);

    add_listener(input,'blur',function(){keyboard_blur(input)});
    keyboard_onedit_register(input,function(){
	input_string_timer[id]=window.setTimeout(function(){
	    input_string_menu(id,url,input);
	},200);
    });

    // förbereder komplettering
    input_string_completion_last[id]=input.value;
    // aktivera komplettering och meny
    input_string_set_suggestions(id,suggestions);
    
    // förhindrar annan dropdown
    set_attribute(input,"autocomplete","off");

    // registrera funktioner för tangenttryckningar
    input.onkeydown=function(event){
	// bugg-kompatibel med IE
	if(!event) event=window.event;
	// prova om knappen hör till meny
	if(input_common_menu_key(this,id,event)) return 0;
    };
    input.onkeyup=function(event){
	// bugg-kompatibel med IE
	if(!event) event=window.event;
	if(input_common_menu_keyup(this,id,event)) return 0;

	// -- hit kommer man vid övriga tecken --

	// ta bort språkval från meny
	var lang_input=document.getElementById(id+"lang");
	if(lang_input) lang_input.value='';

	// avbryter i alla lokala fall pågående menybegäran
	input_string_cancel_xhrs(id);

	// vid escape
	if(key_code(event) == 27){
	    input_string_menu_delete(id);
	    return 0;
	};
	// vid retur - ignorera
	if(key_code(event) == 13) return 0;

	// gör meny
	input_string_timer[id]=window.setTimeout(function(){
	    input_string_menu(id,url,input);
	},200);
    };

    // registrera callback för menybläddring
    input_common_onclick_register(id,function(a){
	// uppdatera bara texten, skicka inte
	input.value=a.firstChild.nodeValue;

	// hämta info om språk för länk
	lang=null;
	s=find_near(a,'span','class','tyda_input_string_lang');
	// skicka med värde för språk om det är satt
	if(s){
	    lang=s.firstChild.nodeValue;
	    var lang_input=document.getElementById(id+"lang");
	    lang_input.value=lang;
	};
    });

    // registrera funktion vid avfokusering
    input.onblur=function(){input_string_blur(input,id)};
    
    // registrera funktion för skickande av närstående formulär
    find_near(input,"form").onsubmit=function(){
	// visa grafik
	window.setTimeout(function(){input_string_flag(id,"sent")},1);
	// stäng meny och pågående begäran
	input_string_menu_delete(id);
	input_string_cancel_xhrs(id);
	// låt skickande fortsätta
	return true;
    };

    // registrera adjust
    input_string_adjust[id]=adjust;
};

function input_string_cancel_xhrs(id){
    // effekt: avbryter pågående timers och xhr-begäran för id

    // avbryter eventuell timer
    if(input_string_timer[id]){
	window.clearTimeout(input_string_timer[id]);
    };

    // avbryter xhr som håller på att ta fram förslag
    cancel_id(id);
    cancel_id(id+'notfound');
};

function input_string_blur(input,id){
    // hanterar blur-händelse

    // stäng inte om meny håller på att klickas på
    if(input_string_click[id]) return;

    // stäng senare (vid mus-upp) om något annat klickas på
    if(mouse_down()){
	// registrera funktion som kör en gång, sen avregistrerar sig
	add_listener(document,'mouseup',function(){
	    input_string_menu_delete(id);
	    remove_listener(document,'mouseup',arguments.callee);
	});
	return;		
    };

    input_string_menu_delete(id);
};

function input_string_menu(id,url,input){
    // effekt: gör meny (placerad i div med id+"base") som uppdaterar
    //	   input id+"input", från värden i url+input.value

    // skickar med ord-parameter till ajax-anrop
    url=add_param(url,input.value);

    // tar bort meny om värdet är tomt
    if(!input.value){
	input_string_flag(id,"neutral");
	return input_string_menu_delete(id);
    };

    // om fältet inte längre finns, återgå
    var base=document.getElementById(id+"base");
    if(!base) return;

    var xhr=runXHR(url,function(text){if(input_string_menu_place) input_string_menu_place(id,text)},id);
};

function input_string_menu_place(id,text){
    // effekt: gör klickbar meny i element id+"base"
    //         uppdaterande id+"input", från text
    //         alignar base till botten av input om input_string_adjust[id]

    var input=document.getElementById(id+"input");
    var base=document.getElementById(id+"base");

    // om bas-fältet inte längre finns, återgå
    if(!base) return;

    // plats där menyn hamnar (oavsett om den visas eller inte)
    var menu=base;

    if(text.match(/"INTERNAL_ERROR"/)){
	window_status('Inget resultat från AJAX-anrop hittat - kanske är denna server överbelastad');
	return;
    }

    // visa bara meny om så önskas
    if(input_string_suggestions[id]){

	base.innerHTML=text;
	// justerar topp om så önskas
	if(input_string_adjust[id]){
	    base.style.top=(input.clientHeight)+"px";
	    var width=input.clientWidth*2;
	    base.style.width=(width)+"px";
	};

	eval_script(base);

	// sätter onclick för varje länk i menyn
	var matches=base.getElementsByTagName('a');
	for(var i=0;i < matches.length;i++){
	    matches[i].onmousedown=function(){
		input_string_click[id]=1;
	    };
	    matches[i].onmouseup=function(){
		delete(input_string_click[id]);
	    };
	    matches[i].onblur=function(){
		delete(input_string_click[id]);
	    };
	    matches[i].onclick=function(){
		// hämta info om språk för länk
		lang=null;
		s=find_near(this,'span','class','tyda_input_string_lang');
		if(s) lang=s.firstChild.nodeValue;

		input_string_update(id,this.firstChild.nodeValue,lang);
		return false;
	    };
	};
    }
    else{
	// hämta matches på annat sätt
	menu=document.createElement('div');
	menu.innerHTML=text;
	eval_script(menu);
	// räknar antal a
	var matches=menu.getElementsByTagName('a');
    };

    // kolla om sökning är uttryck	
    eh=find_below(menu,'div','class','tyda_expression_header');
    if(eh[0]){
	input_string_flag(id,"expression");
    }
    else{
	if(matches.length > 0){
	    input_string_flag(id,"hit");
	}	
	else{	
	    input_string_flag(id,"miss");
	};	
    };
};

function input_string_completion(id,oldstring,string){
    // effekt: sätter markerad komplettering till string för 
    //         input id+"input" om värdet ännu är oldstring

    // gå vidare bara om förslag önskas
    if(!input_string_suggestions[id]){
	return;
    };

    // tillfälligt av
    return;

    var input=document.getElementById(id+"input");
    if(oldstring != input.value){
	// input har ändrats under hämtningstiden - skippa förslag
	return;
    };

    // hämtar tidigare värde
    var last=input_string_completion_last[id];

    var selection=get_selection(input);
    // var i1=input.selectionStart;
    // var i2=input.selectionEnd;

    if(selection=="" && cursor_position(input)==input.value.length && input.value.length > last.length){
	// bara markör, och vid slutet av strängen och för tillägg

	// sparar nytt tidigare värde
	input_string_completion_last[id]=input.value;

	replace_selection(input,string);
	//input.value+=string;
	//input.selectionStart=i1;
	//input.selectionEnd=i1+string.length;
    }
    else{
	// sparar nytt tidigare värde
	input_string_completion_last[id]=input.value;
    };
};

function input_string_notfound(id,url){
    // effekt: gör notfound-länkar i div id+"notfound" som uppdaterar
    //	   input id+"input", från resultatet av url

    var xhr=runXHR(url,function(text){input_string_notfound_place(id,text)},id+"notfound");
};

function input_string_notfound_place(id,text){
    // effekt: gör klickbar meny i id+"notfound", uppdaterande id+"input", från text

    var input=document.getElementById(id+"input");
    var base=document.getElementById(id+"notfound");

    base.innerHTML=text;
    eval_script(base);
    // alert(base.getElementsByTagName('script')[0]);

    // sätter onclick för varje länk i menyn
    var matches=base.getElementsByTagName('a');
    for(var i=0;i < matches.length;i++){
	matches[i].onmousedown=function(){
	    input_string_click[id]=1;
	};
	matches[i].onmouseup=function(){
	    delete(input_string_click[id]);
	};
	matches[i].onblur=function(){
	    delete(input_string_click[id]);
	};
	matches[i].onclick=function(){
	    input_string_update(id,this.firstChild.nodeValue);
	    return false;
	};
    };
};

function input_string_flag(id,status){
    // retur: sätt flagga för input_string

    var flag=document.getElementById(id+"flag");
    if(flag){
	flag.setAttribute("alt",input_string_text[status]);
	flag.setAttribute("src",input_string_flag_base+status+'.png');
    };
};

function input_string_menu_delete(id){
    // effekt: tar bort meny för input id+"input" (finns i id+"base")

    var base=document.getElementById(id+"base");
    base.innerHTML='';

    input_string_flag(id,"neutral");

    // avbryter pågående menybegäran
    input_string_cancel_xhrs(id);
};

function input_string_update(id,string,lang){
    // effekt: uppdaterar input med id+"input" till string på lang

    // sätt värde och stäng meny
    var input=document.getElementById(id+"input");
    input.value=string;
    input_string_menu_delete(id);

    // skicka med värde för språk om det är satt
    if(lang){
        var lang_input=document.getElementById(id+"lang");
        lang_input.value=lang;
    };

    // skicka formulär (och markera det med flagga)
    window.setTimeout(function(){input_string_flag(id,"sent")},1);
    var form=find_near(input,"form");
    form.submit();
};
