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.geo = {
    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 == '') {
			//document.getElementById('mismatchLetters').style.display = 'none';				
			//document.getElementById('noRegion').style.display = 'none';
			//document.getElementById('sendRegionBtn').style.display = 'none';			
			document.getElementById('saveSettingsBtn').style.display = 'inline';						
            this.hide(ctrl);
            return;
        }
        
        if (this.c[value]) {
            this.onload(ctrl.id, value);
        }
        else {
            var lng = this.detectSearchLanguage(value);
            //var url = "http://tune.yandex.ru/region/geoselector/find.xml?region=" + encodeURIComponent(value) + "&lang=" + lng + "&rnd=" + Math.random() + "&id=" + ctrl.id;
            var url = "/regions/" + encodeURIComponent(value)+"/";// + "/" + lng + "/" + Math.random() + "/" + ctrl.id + "/";
            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";

			if(c.length > 1 && c1 != c2){
				//document.getElementById('mismatchLetters').style.display = 'block';				
				//document.getElementById('noRegion').style.display = 'none';
				//document.getElementById('sendRegionBtn').style.display = 'none';			
				document.getElementById('saveSettingsBtn').style.display = 'inline';			
			}else{
				//document.getElementById('mismatchLetters').style.display = 'none';				
				//document.getElementById('noRegion').style.display = 'block';
				//document.getElementById('sendRegionBtn').style.display = 'inline';			
				document.getElementById('saveSettingsBtn').style.display = 'none';							
			}
            this.hide(ctrl);
            return;
        }
		//document.getElementById('mismatchLetters').style.display = 'none';				
		//document.getElementById('noRegion').style.display = 'none';
		//document.getElementById('sendRegionBtn').style.display = 'none';			
		document.getElementById('saveSettingsBtn').style.display = 'inline';			
        
        var s = '';
        var m = this.c[c];
        
        for (var i = 0; i < m.length; i++) {
            s += '<a href="#" onmousedown="wg.geo.set(this);" onclick="return false;" v="' + m[i].id + '">' + m[i].name + ', ' + m[i].sub + '</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);
                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){
        var value = ctrl.innerHTML;
        var vals = value.split(', ');
        var id = ctrl.getAttribute('v');
        var inp = ctrl.parentNode.parentNode.getElementsByTagName('input');
        inp[0].value = vals[0];
        inp[1].value = id;
		inp[2].value = vals[1];
		//document.getElementById('city').innerHTML = value;
        wg.changed = true;
        this.hide(ctrl.parentNode);
    },
    mousedown: function(ctrl){
        var inp = ctrl.parentNode.parentNode.getElementsByTagName('input')[0];
        inp.setAttribute('noclose', '1');
    },
    init: function(ctrl){
        ctrl.onfocus = function(ev){
            wg.geo.focus(ctrl, ev || event);
        };
        ctrl.onblur = function(ev){
            return wg.geo.blur(ctrl, ev || event);
        };
        ctrl.onkeydown = function(ev){
            return wg.geo.keydown(ctrl, ev || event);
        };
        ctrl.onkeypress = function(ev){
            return wg.geo.keypress(ctrl, ev || event);
        };
        ctrl.onkeyup = function(ev){
            return wg.geo.keyup(ctrl, ev || event);
        };
/*		ctrl.onkeypress = function(ev){
            return wg.geo.onkeypress(ctrl, ev || event);
		};*/
        var div = ctrl.parentNode.getElementsByTagName('div')[0];
        div.onblur = function(ev){
            return wg.geo.blur(div, ev || event);
        };
        div.onmousedown = function(ev){
            return wg.geo.mousedown(div, ev || event);
        };
    }
};
/*
wg.sendRegion = function (text, retpath){
	window.location = 'http://tune.yandex.ru/region/send.xml?name=' + encodeURIComponent(text) + '&retpath=' + encodeURIComponent(retpath);
	return false;
};
*/