/**
 * whisperer - naseptavac 
 * 
 * imports
 *      ajax.js pro praci s ajaxem
 *      whisper.css pro nastylovani
 *  
 */
 
 
 
/**
 * po nacteni stranky inicializuje naseptavac
 */ 
setTimeout(function(){
    var temp_f;
    if( window.onload ) {
        temp_f = window.onload;
    }
    window.onload = function () {
        if( temp_f ) {
            temp_f();
        }                  
        whisperer.ini();
    }
}, 500);





var wlh; // timeout na skryti seznamu


/**
 * whisperer
 * Author: Josef Traxler
 * Date: 2011-05-18
 * Description:
 *      Naseptavac, vice informaci v prilozenem read_me.txt    
 */ 
var whisperer = {
    // definice obecnych promennych
    loading:'<img src="/images/icons/loading.gif" height="15px;" />',// text zobrazeny pri nacitani naseptavace
    key:0,// pocitadlo pomocna promenna
    
    // nacteni vsech divu a spanu, ve kterych je trida whisperer
    ini: function(){
        var divs = document.getElementsByTagName('div');
        for (var i in divs){
            this.loadElement(divs[i]);
        }
        var spans = document.getElementsByTagName('span');
        for (var i in spans){
            this.loadElement(spans[i]);
        }
    },
    
    // nacteni, spracovani a prizbusobeni elementu, ve kterem je naseptavac
    loadElement:function(e){
        if (e.className == 'whisperer'){
            this.key++
            var key = this.key;
            var url = '/whisperer/search_goods/';
            var inp = e.getElementsByTagName('input')[0];
            if (!inp) {// pokud neexistuje, tak ho vytvorim
                inp = this.createInput(key);
                e.appendChild(inp);
            }
            if (inp.id=='') inp.id = 'whisperer_input_'+key;
            inp.autocomplete = 'off';                               
            inp.onkeydown = this.onkeydown;// pri zmacknuti klavesy
            inp.onkeyup = this.onkeyup;// pri odmacknuti klavesy
            inp.onblur = this.onblur;// pri opusteni pole
            inp.onclick = this.onclick; // pri kliknuti
            
            // element se statusem
            var whisperer_status = document.getElementById('whisperer_status_'+key);
            if (!whisperer_status){// pokud neexistuje, tak ho vytvorim
                whisperer_status = this.createStatus(key);
                e.appendChild(whisperer_status);
            }
            
            // element se seznamem
            var whisperer_list = document.getElementById('whisperer_list_'+key);
            if (!whisperer_list){// pokud neexistuje, tak ho vytvorim
                whisperer_list = this.createList(key);
                e.appendChild(whisperer_list);
            }
            whisperer_list.onclick = function(){ setTimeout(function(){ window.clearTimeout(wlh); }, 100); };
            whisperer_list.style.width = (inp.offsetWidth-2)+'px';
            whisperer_list.style.display = 'none';
            
            var sets = e.getElementsByTagName('div');
            for(var i in sets){
                if (sets[i].className == 'settings'){
                    eval(sets[i].innerHTML);
                }
            }
            
            // pridam input a jeho parametry do polozek naseptavace
            this.items[inp.id] = {
                'all':e,// div ve kterem se vse odehrava
                'input':inp,// input ve kterem je text
                'list':whisperer_list,// div s vypisem naseptavace
                'status':whisperer_status,// div se statusem
                'url':url,// url adresa vyhledavani, za ni se pripoji vyhledany text
                'count':0,// pocet nalezenych polozek
                'pos':0,// pozice, na ktere jsem
                'last_char_id':0// id posledniho slova
            };        
        }    
    },
    
    
    
    // elementy ve kterych jsou naseptavace
    items:new Array(),
    
    // vytvoreni inputu
    createInput: function(key){
        var result = document.createElement('input');
        result.setAttribute('id', 'whisperer_input_'+key);
        result.setAttribute('class', 'whisperer_input');
        result.setAttribute('name', 'search[name]');
        return result;
    },
    
    // vytvori div, ve kterem budou vypsany polozky
    createList:function(key){
        var result = document.createElement('div');
        result.setAttribute('id', 'whisperer_list_'+key); 
        result.setAttribute('class', 'whisperer_list');
        return result;
    },
    
    // vytvori div, ve kterem bude status naseptavace
    createStatus:function(key){
        var result = document.createElement('div');
        result.setAttribute('id', 'whisperer_status_'+key); 
        result.setAttribute('class', 'whisperer_statusbar');
        return result;
    },  
    
    
    
    // nastavi hodnotu inputu na zvoleny text
    set_input:function(inp_id, text){
        whisperer.items[inp_id].input.value = text;          
        whisperer.items[inp_id].list.style.display = 'none';
        if (whisperer.items[inp_id].input.form) whisperer.items[inp_id].input.form.submit();
    },
    
    // nastavi pozici
    set_position:function(inp_id, pos){
        var list = whisperer.items[inp_id].list;
        var count = whisperer.items[inp_id].count;
        if (pos<0) pos = 0;
        if (pos>count) pos = count;
        var items_height = 0;
        var list_height = list.offsetHeight;
        for(var i = 1; i <= count; i++){
            if (document.getElementById(list.id+'_'+i)){
                if (i == pos){                                                                                                                      
                    document.getElementById(list.id+'_'+i).className = 'whisperer_item whisperer_item_over';
                }
                else {
                    document.getElementById(list.id+'_'+i).className = 'whisperer_item';
                }
                items_height+= document.getElementById(list.id+'_'+i).offsetHeight;                  
            }
        }
        var y_pos = (items_height-list_height)*((pos-1)/(count-3));
        list.scrollTop = y_pos;  
        whisperer.items[inp_id].pos = pos;
    },
    
    // ajaxove funkce
                                 
    // nacteni seznamu
    load_list:function(inp_id){
        if (whisperer.items[inp_id].input.value.length >= 3) {
            whisperer.items[inp_id].status.innerHTML = this.loading;
            url = whisperer.items[inp_id].url+whisperer.items[inp_id].input.value;
            this.items[inp_id].last_char_id++;
            ajax_request(url, 'GET', whisperer.load_list_process, inp_id+'#'+whisperer.items[inp_id].last_char_id);
        }
        return true;
    },                                       
    // nacteni seznamu po zavolani ajaxu na seznam
    load_list_process:function(answer, ids){
        var ids = ids.split('#');
        var inp_id = ids[0];
        var lchi = ids[1];
        if (lchi == whisperer.items[inp_id].last_char_id){
            var answers = answer.split("\n");
            var list = whisperer.items[inp_id].list;
            var html = '';
            var count = 0;
            for(var i in answers){
                if (answers[i]!=''){
                    count++;
                    html += '<div id="'+list.id+'_'+count+'" class="whisperer_item" onmouseover="whisperer.set_position(\''+inp_id+'\', '+count+');" >';
                    html +=     '<a href="javascript:;" id="'+list.id+'_item_'+count+'" onclick="whisperer.set_input(\''+inp_id+'\', this.innerHTML);" >';
                    html +=         answers[i];
                    html +=     '</a>';
                    html += '</div>'; 
                }
            }                          
            if (html != '') list.style.display = 'block';// zobrazeni okna
            else list.style.display = 'none';
            list.innerHTML = html;
            whisperer.items[inp_id].count = count;
            whisperer.items[inp_id].pos = 0; 
            setTimeout('whisperer.items["'+inp_id+'"].status.innerHTML = \'\'', 500);
        }
        
    },
    
    
    
    
    
    
    
    
    
    
    
    // !!! predane funkce inputu, tady je this input, takze bacha !!!
                    
            // udalost pri stisku klavesy
            onkeydown: function(ev){
                var key = ev.keyCode || ev.which;
                var character = String.fromCharCode(key);
                var pos = whisperer.items[this.id].pos;   
                var count = whisperer.items[this.id].count;
                var list = whisperer.items[this.id].list;
                
                switch(key){
                    case 13://enter
                        if (pos!=0){
                            if (document.getElementById(list.id+'_item_'+pos))
                            this.value = document.getElementById(list.id+'_item_'+pos).innerHTML;
                        }                 
                        list.style.display = 'none';
                        return true;
                    break;
                    //case 37:// sipka doleva
                        
                    //break;
                    //case 39://sipka doprava
                    
                    //break;
                    case 38:// sipka nahoru
                        pos--;
                        whisperer.set_position(this.id, pos);
                    break;
                    case 40://sipka dolu                     
                        pos++;
                        whisperer.set_position(this.id, pos);
                    break;
                    default:                                   
                        return true;
                    break;
                }
                if (count==0){                         
                    whisperer.load_list(this.id);
                    return true;
                }
                return false;
            },
            
            // udalost pri odmacknuti klavesy
            onkeyup: function(ev){
                var key = ev.keyCode || ev.which;
                var character = String.fromCharCode(key);
                var pos = whisperer.items[this.id].pos;   
                var count = whisperer.items[this.id].count;
                var list = whisperer.items[this.id].list;
                
                switch(key){
                    case 13://enter
                        if (whisperer.items[this.id].input.form) whisperer.items[this.id].input.form.submit();// odesle formular, pokud existuje
                    break;
                    case 37:// sipka doleva
                        
                    break;
                    case 39://sipka doprava
                    
                    break;
                    case 38:// sipka nahoru
                        //pos--;
                        //whisperer.set_position(this.id, pos);
                    break;
                    case 40://sipka dolu                     
                        //pos++;
                        //whisperer.set_position(this.id, pos);
                    break;
                    default:                                        
                        whisperer.load_list(this.id);
                        return true;
                    break;
                }
                return false;
            },
            
            // udalost pri opusteni pole
            onblur: function(ev){  
                wlh = window.setTimeout("var list = whisperer.items['"+this.id+"'].list; list.style.display = 'none';", 200);// schovani okna
            },
            
            // udalost pri kliknuti na pole
            onclick: function(ev){                 
                if (whisperer.items[this.id].list.innerHTML!='') whisperer.items[this.id].list.style.display = 'block';// zobrazeni okna                     
                if ((whisperer.items[this.id].count==0) && (this.value!='')){      
                    whisperer.load_list(this.id);
                    return true;
                }
            },
    // konec predanych funkci inputu
    
    
    
    
    
    
    end:''
};  
