var wg = {
    createElement: function(name, attrs, container){
        var el = document.createElement(name);
        for (var i in attrs) {
            el[i] = attrs[i];
        }
        
        return container.appendChild(el);
    },
    QueryScript: function(src){
        wg.createElement('script', {
            type: 'text/javascript',
            src: src,
			charset: 'utf-8'			
        }, document.body, document);
    }
};

wg.acom = {
    c: {},
    focus: function(ctrl, ev){
        this.suggest(ctrl);
    },
    blur: function(ctrl, ev){
        if (ctrl.getAttribute('noclose')) {
            ctrl.removeAttribute('noclose');
            return false;
        }
        this.hide(ctrl);
    },
    detectSearchLanguage: function(str){
        var cl = "àáâãäå¸æçèéêëìíîïðñòóôõö÷øùúûüýþÿ";
        var fl = str.charAt(0).toLowerCase();
        return cl.indexOf(fl) >= 0 ? "cyr" : "lat";
    },
    suggest: function(ctrl){
        var value = ctrl.value.replace(/\([^)]*\)/, '').replace(/(^\s+|\s+$)/, '');
        if (value == '') {
            this.hide(ctrl);
            return;
        }
        
        if (this.c[value]) {
            this.onload(ctrl.id, value);
        }
        else {
            var lng = this.detectSearchLanguage(value);
            var url = "/ajax/search_complete/" + encodeURIComponent(value) + "/"+ ctrl.id +"/" + lng + "/";
            wg.QueryScript(url);
        }
        
        return ctrl.parentNode.getElementsByTagName('div')[0].getElementsByTagName('a').length;
    },
    onload: function(id, c){
        var ctrl = document.getElementById(id);
        var value = ctrl.value.replace(/\([^)]*\)/, '').replace(/(^\s+|\s+$)/, '');
        
        if (this.c[value]) {
            c = value;
        }else if (value != c) {
            return;
        }
        
        
        
        if (this.c[c].length == 0) {
	        var cl = "àáâãäå¸æçèéêëìíîïðñòóôõö÷øùúûüýþÿ";
			var c1 = cl.indexOf(c.charAt(0).toLowerCase()) >= 0 ? "cyr" : "lat";
			var c2 = cl.indexOf(c.charAt(1).toLowerCase()) >= 0 ? "cyr" : "lat";

            this.hide(ctrl);
            return;
        }
        
        var s = '';
        var m = this.c[c];
        
        for (var i = 0; i < m.length; i++) {
            s += '<a href="#" onmousedown="wg.acom.set(this, event || window.event);" onclick="return false;" v="' + m[i].id + '">' + m[i].name + '</a>';
        }
        
        ctrl.parentNode.getElementsByTagName('div')[0].innerHTML = s;
        this.show(ctrl);
    },
    keydown: function(ctrl, ev){
        switch (ev.keyCode) {
            case 27: // Esc
                this.hide();
                return true;
                
            case 38: // Up
            case 40: // Down
                return false;
                
            case 13: // Enter
                return false;
                
            case 37: // Left
            case 39: // Right
            case 10: // Return
                return true;
        }
    },
    keyup: function(ctrl, ev){
        var length = this.suggest(ctrl);
        var cursor = parseInt(ctrl.getAttribute('cursor'));
        cursor = cursor >= 0 ? cursor : -1;
        switch (ev.keyCode) {
            case 40: // Down
                this.nextCursor(cursor, length, ctrl);
                return false;
                
            case 38: // Up
                this.prevCursor(cursor, length, ctrl);
                return false;
                
            case 9: // Tab
                this.hide(ctrl);
                return true;
                
            case 13: // Enter
            case 10: // Return
                this.hide(ctrl);
                this.saveStat(cursor, ctrl);
		        //var form = ctrl.parentNode.parentNode.getElementsByTagName('input')[0].form;
		       // setTimeout(function(){check_action(form);form.submit();},0);
		       document.getElementById('head_search_box').submit();
                return false;
                
            case 27: // Esc
                this.hide(ctrl);
                return true;
        }
    },
    keypress: function(ctrl, ev){
        switch (ev.keyCode) {               
            case 13: // Enter
            case 10: // Return
                return false;                
        }
    },	
    saveStat: function(cursor, ctrl){
        var div = ctrl.parentNode.getElementsByTagName('div')[0];
        var items = div.getElementsByTagName('a');
        if (cursor >= 0 && items[cursor]) {
            this.set(items[cursor]);
        }
        ctrl.setAttribute('cursor', -1);
    },
    nextCursor: function(cursor, length, ctrl){
        this.cursor(this.getNextCursor(cursor, length), ctrl);
    },
    prevCursor: function(cursor, length, ctrl){
        this.cursor(this.getPrevCursor(cursor, length), ctrl);
    },
    getNextCursor: function(cursor, length){
        cursor++;
        
        if (cursor >= length) {
            cursor = -1;
        }
        
        return cursor;
    },
    getPrevCursor: function(cursor, length){
        cursor--;
        if (cursor < -1) {
            cursor = length - 1;
        }
        else 
            if (cursor >= length) {
                cursor = -1;
            }
        return cursor;
    },
    cursor: function(cursor, ctrl){
        var div = ctrl.parentNode.getElementsByTagName('div')[0];
        var items = div.getElementsByTagName('a');
        if (cursor >= 0 && items[cursor]) {
            items[cursor].className = 's';
            var h = items[cursor].offsetTop - div.offsetHeight / 2;
            div.scrollTop = h;
        }
        ctrl.setAttribute('cursor', cursor);
    },
    change: function(ctrl, ev){
    },
    hide: function(ctrl, noRegion){
        var pn = ctrl.parentNode;
        var div = pn.getElementsByTagName('div')[0];
        div.style.display = 'none';
        var frame = pn.getElementsByTagName('iframe')[0];
        if (frame) {
            frame.style.display = 'none';
        }
        
        var value = ctrl.value;
        var m = this.c[value];
        if (!m) {
            return;
        }
        
        value = value.toLowerCase();

        for (var i = 0; i < m.length; i++) {
            if (m[i].name.toLowerCase() == value) {
                var inp = ctrl.parentNode.getElementsByTagName('input');
                inp[1].value = m[i].id;
                
				//document.getElementById('city').innerHTML = m[i].name;
                
                return;
            }
        }
    },
    show: function(ctrl){
        var pn = ctrl.parentNode;
        var div = pn.getElementsByTagName('div')[0];
        div.style.display = 'block';
        var frame = pn.getElementsByTagName('iframe')[0];
        if (frame) {
            frame.style.display = 'block';
            frame.style.height = (div.offsetHeight - 1) + 'px';
        }
    },
    set: function(ctrl, ev){
		if(ev && ev.button > 1){
			return;
		}
        var value = ctrl.innerHTML;
        var id = ctrl.getAttribute('v');
        var inp = ctrl.parentNode.parentNode.getElementsByTagName('input');
        inp[0].value = value;
        inp[1].value = id;
        wg.changed = true;
        this.hide(ctrl.parentNode);
        document.getElementById('head_search_box').submit();
    },
    mousedown: function(ctrl){
        var inp = ctrl.parentNode.parentNode.getElementsByTagName('input')[0];
        inp.setAttribute('noclose', '1');
    },
    init: function(nms){
    	ctrl = document.getElementById(nms);	
    
        ctrl.onfocus = function(ev){
            wg.acom.focus(ctrl, ev || event);
        };
        ctrl.onblur = function(ev){
            return wg.acom.blur(ctrl, ev || event);
        };
        ctrl.onkeydown = function(ev){
            return wg.acom.keydown(ctrl, ev || event);
        };
        ctrl.onkeypress = function(ev){
            return wg.acom.keypress(ctrl, ev || event);
        };
        ctrl.onkeyup = function(ev){
            return wg.acom.keyup(ctrl, ev || event);
        };
        var div = ctrl.parentNode.getElementsByTagName('div')[0];
        div.onblur = function(ev){
            return wg.acom.blur(div, ev || event);
        };
        div.onmousedown = function(ev){
            return wg.acom.mousedown(div, ev || event);
        };
    }
};
