function checkform() {
    var searchtext = $("#domain")[0].value;
    if (searchtext && searchtext != '' && searchtext != 'e.g. your name, company or brand') {
        try {
            var register = $("#register")[0].value;
            param = register == '1' ? '&register=1' : ''
        }catch (e) {
            param = '';
        }
        location.href = '/search/' + encodeURI(searchtext.replace('#', '')) + param;
    }
    return false;
}

DomainProcess = function() {
    var maximum    = 10; // maximum count of requests
    var counter    = 0;  // counter for requests
    var each_count = 10; // how much to proceed between every request
    var check_result = { };
    var tooltips = { };
    var running_requests = 0;
    
    return {
        process: function(tld_count) {
            var tlds = this.getWaitingTlds(tld_count, each_count);
            if (tlds.length == 0) {
                return;
            }
            
            if (counter >= maximum) {
                return false;
            }
            
            counter++;
            var searchtext   = this.getSearchText();
            var registerflag = this.getRegisterFlag();

            running_requests++;
            Ext.Ajax.request({
                url: '/service/check.php',
                method: 'POST',
                params: {
                    'tlds': Ext.encode(tlds),
                    'searchtext': searchtext,
                    'register' : registerflag
                },
                scope: this,
                failure: function(response) {
                    this.process(); // try again
                },
                success: function(response) { 
                    running_requests = running_requests-1;
                    this.proceedAnswer(response, tld_count);
                    if(running_requests == 0) {
                        this.displayErrors();
                    }
                }

            });
            this.process(tld_count+each_count);
        },

        proceedAnswer: function (response, tld_count) {
            if (!response) {
                this.process(); // try again
                return;
            }

            data = Ext.decode(response.responseText);

            if (!Ext.isArray(data)) {
                this.process(); // try again
                return;
            }

            Ext.each(data, function(item) {
                if (item.status != "ERROR" && item.tld != 'trademark') {
                    this.hideLoadingImage(item.tld);
                    check_result[item.tld] = item.status; 
                }
                
                if (item.tld == 'trademark') {
                    check_result[item.tld] = item.status; 
                    this.proceedTrademark(item.data);
                } else if (item.status == "REGISTERED") {
                    this.changeLineColor(item.tld, "taken");
                    this.showStatus(item.tld, "<img src=\"/images/print/print-taken.jpg\" width=\"16\" class=\"print\" height=\"16\" alt=\"Taken\" />");
                    if (item.url) {
                        this.setLink(item.tld, item.url);
                    }
                } else if (item.status == "FREE") {
                    this.changeLineColor(item.tld, "free");
                    this.check(item.domain);
                    this.showStatus(item.tld, "<img src=\"/images/print/print-free.jpg\" width=\"16\" class=\"print\" height=\"16\" alt=\"Info\" />");
                    if (item.url) {
                        this.setLink(item.tld, item.url);
                    }
                } else if (item.status == "INVALID") {
                    this.showStatus(item.tld, "<img src=\"/images/search-info.png\" width=\"16\" class=\"print\" height=\"16\" alt=\"Info\" />");
                    var tooltip = '';
                    try {
                        for (i=0;i<item.message.length ;i=i+1) {
                            tooltip = tooltip + '<br/>' + item.message[i];
                        }
                        if(item.message.length == 0) {
                            tooltip = 'Given name has illegal symbol'
                        }
                    }catch (e) {
                        tooltip = '';
                    }
                    document.getElementById('tooltip'+item.tld).innerHTML = tooltip;
                    DomainProcess.checkToolTip(item.tld, 1);
                    this.showStatus(item.tld, "<img src=\"/images/search-info.png\" alt=\"Invalid\" title=\"Invalid\" onClick=\"return DomainProcess.showInfo('"+item.tld+ "', 2)\" />");
                    this.changeLineColor(item.tld, "error");
                }
                
            }, this);
            
            this.process(tld_count); // to check if some missing - try again
        },

        proceedTrademark: function(data) {
            avTrademarks = {};
            var trademarks = Ext.query(".trademark");
            Ext.each(trademarks, function(item) {
                patent_office = item.className.substring(10,1000);
                if (data == null || data[patent_office] == undefined) {
                    this.showStatus('trademark_' + patent_office, 
                            "<a href=\"#\" onClick=\"return DomainProcess.showInfo('trademark_" + patent_office + "', 2)\"><img class=\"img\" src=\"/images/search-info.png\" alt=\"Information\"/></a>");
                    this.changeLineColor('trademark_' + patent_office, "free");
                }
            }, this);

            for (var patent_office in data) {
                this.showStatus('trademark_' + patent_office, 
                        "");
                this.changeLineColor('trademark_' + patent_office, "ptaken");
                this.setCountries(data[patent_office], patent_office);
            }
            
            var trademarks = Ext.query(".trademark");
            Ext.each(trademarks, function(item) {
                patent_office = item.className.substring(10,1000);
                var type = 1;
                if (data == null || data[patent_office] == undefined) {
                    type = 2;
                }
                DomainProcess.checkToolTip('trademark_' + patent_office, type);
            }, this);

        },
        
        setCountries: function(list, type) {
            var slidetext = Ext.get("slidetext_" + type);
            if (!slidetext) {
                return;
            }
            
            out = '';
            flags = '';
            showInt = false;
            count = 0;

            for (var index in list) {
                var item = list[index];
                if (item.EN == undefined) {
                    showInt = true;
                } else {
                    out = out + '<div class="flag_' + item.CC + '">' + item.CC + ' - ' + item.EN + '</div>';
                    flags = flags + '<div class="flag_' + item.CC + '"></div>';
                }
                count++;
            }
            
            if(count > 1) {
                showInt = false;
            }
            
            if(showInt) {
                out = out + '<div class="flag_NULL">International</div>';
                flags = flags + '<div class="flag_NULL"></div>';
            }

            // fill popup
            var element = Ext.get("countries_" + type);
            if(element) {
                element.dom.innerHTML = out;
            }
            
            // fill slide element
            var element = Ext.get("countries_" + type + '_icons');
            element.dom.innerHTML = flags;
            
            // slide out element
            DomainProcess.slideText(slidetext, 2);
        },

        getWaitingTlds: function(offset, limit) {
            if (offset == undefined) { offset = 0; }
            if (limit == undefined) { limit = 10000; }
            count = 0;
            var tld_selection = Ext.select(".searchtld");
            var tlds = new Array();
            tld_selection.each(function(element) {
                tld = element.getValue();
                if (count>=offset &&
                    count < offset+limit) {
                    if (check_result[tld] == undefined && tld != '1') {
                        tlds.push(tld);
                    }
                }
                count++;
            }, this);
            
            return tlds;
        },

        getSearchText: function() {
            var domain_search_form = Ext.get("domain");
            return(domain_search_form.getValue());
        },

        getRegisterFlag: function() {
            var domain_search_form = Ext.get("register");
            return(domain_search_form.getValue());
        },
        
        // show generated tooltip
        showInfo: function(name) {
            positionx = tooltips[name].target.getX() - 100;
            positiony = tooltips[name].target.getY();
            tooltips[name].targetXY = [positionx, positiony];
            tooltips[name].show();
            return false; // just don't jump to top of page
        },
        
        // check element for tooltip item
        checkToolTip: function (tld, type) {
            var elements = Ext.select("tr[domain="+tld+"] .tooltip_content");
            elements.each(function(item) {
                if (type == 2) {
                    var elements_infotext = Ext.select("tr[domain="+tld+"] .tooltip_content .infotext_1");
                } else {
                    var elements_infotext = Ext.select("tr[domain="+tld+"] .tooltip_content .infotext_2");
                }
                elements_infotext.each(function(infotext) {
                    infotext.dom.innerHTML = '';
                });
                this.addToolTip(tld, item);
            }, this);
            Ext.QuickTips.init();
        },
        
        // render tooltip
        addToolTip: function(tld, contentItem) {
            var elements = Ext.select("tr[domain="+tld+"] td");
            var tooltipWidth = 300;
            if (tld == 'trademark_WIPO' || tld == 'trademark_HABM' || tld == 'trademark_DPMA') {
                tooltipWidth = 450;
            }
            elements.each(function(item) {
                tooltips[tld] = new Ext.ToolTip({
                    anchor: 'left',
                    autoHide: false,
                    target: item,
                    hidden: true,
                    title: '<br/>Information',
                    width: tooltipWidth,
                    layout: 'fit',
                    constrainPosition: 'false',
                    html: contentItem.dom.innerHTML // load content from the page
                });
                
                //deactivate mouseover effect
                item.un('mouseover', tooltips[tld].onTargetOver, tooltips[tld]);
                item.un('mouseout', tooltips[tld].onTargetOut, tooltips[tld]);
                item.un('mousemove', tooltips[tld].onMouseMove, tooltips[tld]);

            });
        },
        
        hideLoadingImage: function(tld) {
            var elements = Ext.select("tr[domain="+tld+"] .img");
            elements.each(function(item) {
                item.setVisible(false);
                item.removeClass("loading");
                item.addClass("loaded");
            });
        },

        displayResultItem: function(tld, classname) {
            var element = Ext.select("tr[domain="+tld+"] ."+classname);
            element.each(function(item) {
                item.setVisible(true);
            });
        },

        changeLineColor: function(tld, status) {
            var element = Ext.select("tr[domain="+tld+"] td div.processing");
            element.each(function(item) {
                item.addClass(status);
                item.removeClass("processing");
            });
        },

        setLink: function(tld, link) {
            var element = Ext.select("tr[domain="+tld+"] td");
            element.each(function(item) {
                text = item.dom.innerHTML;
                item.dom.innerHTML = '<a href="' + link + '" target="_blank">' + text + '</a>';
            });
        },

        showStatus: function(tld, text) {
            var element = Ext.select("tr[domain="+tld+"] .status");
            element.each(function(item) {
                item.dom.innerHTML = text;
            });
        },

        displayErrors: function() {
            var tlds = this.getWaitingTlds();
            
            Ext.each(tlds, function(item) {
                this.hideLoadingImage(item);
                this.showStatus(item, "<img src=\"/images/warning.png\" alt=\"Error!\"  title=\"ERROR\" onClick=\"return DomainProcess.showInfo('"+item+ "', 2)\" />");
                this.displayResultItem(item, "searchError");
                this.displayResultItem(item, "serverErrorFaq");
                this.changeLineColor(item, "error");

                var tooltip = 'Could not connect to server'
                document.getElementById('tooltip'+item).innerHTML = tooltip;
                DomainProcess.checkToolTip(item, 1);

            }, this);
        },

        check: function(tld) {
            var element = Ext.select("tr[domain="+tld+"] .checked");
            element.each(function(item) {
                item.dom.checked = true;
            });
        },
        
        slideText: function(e, type){
            if (e.isDisplayed() && type == 1){
                //Is visible.
                e.slideOut('t',{
                    remove: false,
                    useDisplay:true
                });
            } else if (!e.isDisplayed() && type == 2) {
                //Isn't Visible.
                e.slideIn('t',{
                    useDisplay:true
                });
            }
        }
    }
}();