function Hub(){

    this.dropdownTimeoutId = null;
    this.dropdownKeepOpen = false;
    this.dropdownCurrentItemIndex = null;
    this.newsLetterForm = null;
    this.b2bLoginForm = null;
    this.b2bMenu = null;
    this.isNewLogin = false;

    this.setupColumnHeights = function(){
        var columnContainer = $$("div.columns");
        
        for( var i = 0; i < columnContainer.length; i++ )
        {
            var columns = columnContainer[i].getElements("div.column");
            var maxHeight = 0;
            for( var j = 0; j < columns.length; j++ )
            {
                var currentHeight = columns[j].offsetHeight;

                var bottomElement = columns[j].getChildren(".bottom");
                var maxBottomHeight = 0;
                for( var k = 0; k < bottomElement.length; k++ )
                {
                    if( bottomElement[k].offsetHeight > maxBottomHeight )
                    {
                        maxBottomHeight = bottomElement[k].offsetHeight;
                    }
                }
                currentHeight += maxBottomHeight;

                if( currentHeight > maxHeight )
                {
                    maxHeight = currentHeight;
                }
            }

            for( j = 0; j < columns.length; j++ )
            {
                columns[j].setStyle("height",maxHeight + "px");
            }
        }
        
        var columnBottomElement = $$("div.columns div .bottom");
        for( i = 0; i < columnBottomElement.length; i++ )
        {
            columnBottomElement[i].setStyle("display","block");
        }
    };

    this.setupMouseOverAnchors = function(){
        var element = $$("a.mouseover");

        for( var i = 0; i < element.length; i++ )
        {
           if(( element[i].mouseOverCreated != null ) && ( element[i].mouseOverCreated == true ))
           {
               continue;
           }
           var width = element[i].offsetWidth;
           var height = element[i].offsetHeight;

           var paddingLeft = parseInt(element[i].getStyle("padding-left"));
           width -= paddingLeft;
           width -= parseInt(element[i].getStyle("padding-right"));

           var paddingTop = parseInt(element[i].getStyle("padding-top"));
           height -= paddingTop;
           height -= parseInt(element[i].getStyle("padding-bottom"));

           element[i].setStyle("width",width + "px");
           element[i].setStyle("height",height + "px");
           element[i].width = width;

           var span = element[i].getElements("span")

           if( span.length == 0 )
           {
               // Bevat geen span, niets mee doen
               continue;
           }

           var speed = 300/span.length;

           for( var j = 0; j < span.length; j++ )
           {
               var html = span[j].innerHTML;
               span[j].over = new Element("div");
               span[j].over.addClass("over");
               span[j].over.setStyle("left",paddingLeft + "px");
               span[j].over.setStyle("top",paddingTop + "px");

               span[j].over.innerHTML = html;
               span[j].over.inject(span[j]);
               span[j].over.fx = new Fx.Tween(span[j].over,{
                   onComplete: function(el){
                       if(( el.getParent().getNext() != null ) && ( el.getParent().getNext().animOver != null ))
                       {
                           el.getParent().getNext().animOver();
                       }
                   },
                   duration: speed,
                   transition: Fx.Transitions.Sine.easeOut
               });
               //span[j].over.top = span[j].paddingTop;
               span[j].over.top = j * span[j].offsetHeight + paddingTop;
               span[j].over.width = span[j].offsetWidth;
               span[j].animOver = function(){

                   //var width = this.getStyle("width");
                   var width = this.offsetWidth + 1;

                   this.over.setStyle("top",this.over.top + "px");
                   //this.over.fx.start("width",0,this.over.width);
                   this.over.fx.start("width",0,width);
               }

               speed += 300/span.length;
           }

           element[i].addEvent("mouseenter",function(){
               var span = this.getElements("span");
               if( span[0] != null )
               {
                   span[0].animOver();
               }
           });

           element[i].addEvent("mouseleave",function(){
               var span = this.getElements("span")
               for( var j = 0; j < span.length; j++ )
               {
                   span[j].over.fx.cancel();
                   span[j].over.setStyle("width","0px");
               }
           });

           element[i].mouseOverCreated = true;
        }
    }

    this.setupSlideDisplays = function(){
        var display = $$("div.slidedisplayelement");
        for( var i = 0; i < display.length; i++ )
        {
            display[i].instance = new SlideDisplay(display[i],"img/SlideDisplay",display[i].getAttribute("src"),3000);
            display[i].instance.onLoad();


        }
    }

    this.setupListingDisplays = function(){
        var display = $$("dl.listing.listingdisplay");
        for( var i = 0; i < display.length; i++ )
        {
            display[i].instance = new ListingDisplay(display[i],4);
            display[i].instance.hubInstance = this;
            display[i].instance.viewElementId = display[i].id;
            display[i].instance.onUpdatePageComplete = function(pageIndex,itemsPerPage,totalItems){

                if( totalItems == 0 )
                {
                    return;
                }
                
                var start = pageIndex*itemsPerPage;
                var end = start+itemsPerPage;
                if( end > totalItems )
                {
                    end = totalItems;
                }

                var str = (start+1) + "-" + end + " of " + totalItems + "/";

                var viewElement = $(this.viewElementId + "_view");
                if( viewElement != null )
                {
                    viewElement.empty();
                    var span = new Element("span");
                    span.set("text",str);
                    span.inject(viewElement);
                    this.hubInstance.setupTextReplacer(span);
                }
            };
            display[i].instance.onLoad();
        }
    }

    this.setupHubMaps = function(){
        var map = $$("div.hubmap");
        for( var i = 0; i < map.length; i++ )
        {
            map[i].instance = new HubMap(map[i],map[i].getAttribute("src"));
            map[i].instance.onLoad();

            var favorite = $$("a.hubmapfavorite");
            for( var j = 0; j < favorite.length; j++ )
            {
                if( favorite[j].getAttribute("rel") == map[i].getAttribute("rel") )
                {
                    favorite[j].mapInstance = map[i].instance;
                    favorite[j].addEvent("click",function(){
                        this.mapInstance.navigateToAddress(this.getAttribute("title"));
                        return false;
                    });
                }
            }

            var search = $$("form.hubmapsearch");
            for( j = 0 ; j < search.length; j++ )
            {
                if( search[j].getAttribute("rel") == map[i].getAttribute("rel") )
                {
                    // Form onsubmit event
                    search[j].mapInstance = map[i].instance;
                    search[j].addEvent("submit",function(e){
                        e = new Event(e);
                        e.stop();
                        
                        var address = this.getElement("input[name=address]");
                        if( (address.value = address.value.trim()).length > 0 )
                        {
                            this.mapInstance.navigateToAddress(address.value);
                        }
                        return false;
                    });

                    // Submit anchors
                    var anchor = search[j].getElements("a[title='search']");
                    for( var k = 0; k < anchor.length; k++ )
                    {
                        anchor[k].form = search[j];
                        anchor[k].mapInstance = map[i].instance;
                        anchor[k].addEvent("click",function(e){
                            e = new Event(e);
                            e.stop();

                            var address = this.form.getElement("input[name=address]");
                            if( (address.value = address.value.trim()).length > 0 )
                            {
                                this.mapInstance.navigateToAddress(address.value);
                            }
                            return false;
                        });
                    }
                }
            }
        }
    }

    this.setupDropdown = function(){

        $("dropdownmenu").fx = new Fx.Tween($("dropdownmenu"),{wait:false});
        $("dropdownmenu").setStyle("height","0px");
        $("dropdownmenu").instance = this;
        $("dropdownmenu").addEvent("mouseenter",function(){
            this.instance.preventCloseDropdown();
        });

        $("dropdownmenu").addEvent("mouseleave",function(){
            this.instance.closeDropdown();
        });

        var menuItem = $$("div.columns.menu div.column.c1 a.mouseover, div.columns.menu div.column.c3 a.mouseover.b2bloggedin");
        for( var i = 0; i < menuItem.length; i++ )
        {
            menuItem[i].instance = this;
            menuItem[i].itemIndex = i;
            menuItem[i].addEvent("mouseenter",function(){
                var left = this.getParent().getLeft();
                if( left <= 20 )
                {
                    left = 0;
                }
                this.instance.openDropdown(this.itemIndex,left);
            });

            menuItem[i].addEvent("mouseleave",function(){
                this.instance.closeDropdown();
            });
        }

        var newsLetterItem = $(document.body).getElement("div.columns.menu div.column.c2 a.mouseover");
        if( newsLetterItem != null )
        {
            newsLetterItem.instance = this;
            newsLetterItem.addEvent("mouseenter",function(){
                this.instance.openDropdown("newsletter");
            });
            newsLetterItem.addEvent("mouseleave",function(){
                this.instance.closeDropdown();
            });
        }

        var b2bLoginItem = $(document.body).getElement("div.columns.menu div.column.c3 a.mouseover.b2blogin");
        if( b2bLoginItem != null )
        {
            b2bLoginItem.instance = this;
            b2bLoginItem.addEvent("mouseenter",function(){
                this.instance.openDropdown("b2blogin");
            });
            b2bLoginItem.addEvent("mouseleave",function(){
                this.instance.closeDropdown();
            });
        }
    }

    this.setupReactionSubmit = function(){
        var form = $$("form.reaction");
        for( var i = 0; i < form.length; i++ )
        {
            form[i].instance = this;
            form[i].addEvent("submit",function(){
                return this.instance.validateReactionForm(this);
            });

            var submitAnchor = form[i].getElement("a.mouseover");
            if( submitAnchor == null )
            {
                continue;
            }
            submitAnchor.submitForm = form[i];
            submitAnchor.instance = this;
            submitAnchor.addEvent("click",function(e){
                e = new Event(e);
                e.stop();
                if( this.instance.validateReactionForm(submitAnchor.submitForm) == true )
                {
                    this.submitForm.submit();
                }
                return false;
            });
        }
    }

    this.validateReactionForm = function(form){

        var author = $(form).getElement("input[name=author]");
        var emailAddress = $(form).getElement("input[name=emailAddress]");
        var comment = $(form).getElement("textarea[name=comment]");
        var postComment = $(form).getElement("input[name=postcomment]");

        if( (author.value = author.value.trim()).length < 2 )
        {
            alert("Please fill in your name.");
            author.focus();
            return false;
        }
        if(
            ( (emailAddress.value = emailAddress.value.trim()).length < 5 ) ||
            ( emailAddress.value.indexOf("@") == -1 ) ||
            ( emailAddress.value.indexOf(".") == -1 )
        )
        {
            alert("Please fill in your e-mail address.");
            emailAddress.focus();
            return false;
        }
        if( (comment.value = comment.value.trim()).length < 8 )
        {
            alert("Please fill in your comment.");
            comment.focus();
            return false;
        }

        postComment.value = "true";

        return true;
    }

    this.setupContactSubmit = function(){
        var form = $$("form.contact");
        for( var i = 0; i < form.length; i++ )
        {
            form[i].instance = this;
            form[i].addEvent("submit",function(){
                return this.instance.validateContactForm(this);
            });

            var submitAnchor = form[i].getElement("a.mouseover");
            if( submitAnchor == null )
            {
                continue;
            }
            submitAnchor.submitForm = form[i];
            submitAnchor.instance = this;
            submitAnchor.addEvent("click",function(e){
                e = new Event(e);
                e.stop();
                if( this.instance.validateContactForm(submitAnchor.submitForm) == true )
                {
                    this.submitForm.submit();
                }
                return false;
            });
        }
    }

    this.validateContactForm = function(form){

        var name = $(form).getElement("input[name=name]");
        var emailAddress = $(form).getElement("input[name=emailAddress]");
        var country = $(form).getElement("select[name=country]");
        var message = $(form).getElement("textarea[name=message]");
        var contact = $(form).getElement("input[name=contact]");

        if( (name.value = name.value.trim()).length < 2 )
        {
            alert("Please fill in your name.");
            name.focus();
            return false;
        }
        if(
            ( (emailAddress.value = emailAddress.value.trim()).length < 5 ) ||
            ( emailAddress.value.indexOf("@") == -1 ) ||
            ( emailAddress.value.indexOf(".") == -1 )
        )
        {
            alert("Please fill in your e-mail address.");
            emailAddress.focus();
            return false;
        }
        if( country.value == "0" )
        {
            alert("Please select your country.");
            country.focus();
            return false;
        }
        if( (message.value = message.value.trim()).length < 8 )
        {
            alert("Please fill in your comment.");
            message.focus();
            return false;
        }

        contact.value = "true";

        return true;
    }

    this.setupFindDealerSubmit = function(){
        var form = $$("form.finddealer");
        for( var i = 0; i < form.length; i++ )
        {
            form[i].instance = this;
            form[i].addEvent("submit",function(){
                return this.instance.validateFindDealerForm(this);
            });

            var submitAnchor = form[i].getElement("a.mouseover");
            if( submitAnchor == null )
            {
                continue;
            }
            submitAnchor.submitForm = form[i];
            submitAnchor.instance = this;
            submitAnchor.addEvent("click",function(e){
                e = new Event(e);
                e.stop();
                if( this.instance.validateFindDealerForm(submitAnchor.submitForm) == true )
                {
                    this.submitForm.submit();
                }
                return false;
            });
        }
    }

    this.validateFindDealerForm = function(form){

        var name = $(form).getElement("input[name=name]");
        var emailAddress = $(form).getElement("input[name=emailAddress]");
        var postalCode = $(form).getElement("input[name=postalCode]");
        var city = $(form).getElement("input[name=city]");
        var country = $(form).getElement("select[name=country]");
        var message = $(form).getElement("textarea[name=message]");
        var locate = $(form).getElement("input[name=locate]");

        if( (name.value = name.value.trim()).length < 2 )
        {
            alert("Please fill in your name.");
            name.focus();
            return false;
        }
        if(
            ( (emailAddress.value = emailAddress.value.trim()).length < 5 ) ||
            ( emailAddress.value.indexOf("@") == -1 ) ||
            ( emailAddress.value.indexOf(".") == -1 )
        )
        {
            alert("Please fill in your e-mail address.");
            emailAddress.focus();
            return false;
        }
        if( (postalCode.value = postalCode.value.trim()).length < 6 )
        {
            alert("Please fill in your postal code.");
            postalCode.focus();
            return false;
        }
        if( (city.value = city.value.trim()).length < 2 )
        {
            alert("Please fill in your city.");
            city.focus();
            return false;
        }
        if( country.value == "0" )
        {
            alert("Please select your country.");
            country.focus();
            return false;
        }

        locate.value = "true";

        return true;
    }

    this.setupLoginSubmit = function(){
        var form = $$("form.login");
        for( var i = 0; i < form.length; i++ )
        {
            form[i].instance = this;
            form[i].addEvent("submit",function(){
                return this.instance.validateLoginForm(this);
            });

            var submitAnchor = form[i].getElement("a.mouseover");
            if( submitAnchor == null )
            {
                continue;
            }
            submitAnchor.submitForm = form[i];
            submitAnchor.instance = this;
            submitAnchor.addEvent("click",function(e){
                e = new Event(e);
                e.stop();
                if( this.instance.validateLoginForm(submitAnchor.submitForm) == true )
                {
                    this.submitForm.submit();
                }
                return false;
            });
        }
    }

    this.validateLoginForm = function(form){

        var user = $(form).getElement("input[name=INFINITE_POST_LOGIN_USERNAME]");
        
        if( (user.value = user.value.trim()).length < 2 )
        {
            alert("Please fill in your username.");
            user.focus();
            return false;
        }

        return true;
    }

    this.validateNewsLetterForm = function(){
        if( ($("newsletter_name").value = $("newsletter_name").value.trim()).length < 2 )
        {
            alert("Please fill in your name.");
            $("newsletter_name").focus();
            return false;
        }

        if(
            ( ($("newsletter_email").value = $("newsletter_email").value.trim()).length < 5 ) ||
            ( $("newsletter_email").value.indexOf("@") == -1 ) ||
            ( $("newsletter_email").value.indexOf(".") == -1 )
        )
        {
            alert("Please fill in your e-mail address.");
            $("newsletter_email").focus();
            return false;
        }

        return true;
    }








    this.setupOrderSubmit = function(){
        var form = $$("form.order");
        for( var i = 0; i < form.length; i++ )
        {
            form[i].instance = this;
            form[i].addEvent("submit",function(){
                return this.instance.validateOrderForm(this);
            });

            var submitAnchor = form[i].getElement("a.mouseover");
            if( submitAnchor == null )
            {
                continue;
            }
            submitAnchor.submitForm = form[i];
            submitAnchor.instance = this;
            submitAnchor.addEvent("click",function(e){
                e = new Event(e);
                e.stop();
                if( this.instance.validateOrderForm(submitAnchor.submitForm) == true )
                {
                    this.submitForm.submit();
                }
                return false;
            });
        }
    }

    this.validateOrderForm = function(form){

        var lastname = $(form).getElement("input[name=last_name]");
        var firstname = $(form).getElement("input[name=first_name]");
        var address1 = $(form).getElement("input[name=address1]");
        var zip = $(form).getElement("input[name=zip]");
        var city = $(form).getElement("input[name=city]");
        var country = $(form).getElement("select[name=country]");
        var email = $(form).getElement("input[name=email]");
        var newsletter = $(form).getElements("input[name=newsletter]");
        var custom = $(form).getElement("input[name=custom]");

        if( lastname == null )
        {
            return false;
        }

        var wantNewsletter = false;
        for( var i = 0; i < newsletter.length; i++ )
        {
            if(( newsletter[i].getAttribute("value") == "1" ) && ( newsletter[i].checked == true ))
            {
                wantNewsletter = true;
            }
        }

        if( (firstname.value = firstname.value.trim()).length < 2 )
        {
            alert("Please fill in your first name.");
            firstname.focus();
            return false;
        }
        if( (lastname.value = lastname.value.trim()).length < 2 )
        {
            alert("Please fill in your last name.");
            lastname.focus();
            return false;
        }
        if( (address1.value = address1.value.trim()).length < 2 )
        {
            alert("Please fill in your address.");
            address1.focus();
            return false;
        }
        if( (zip.value = zip.value.trim()).length < 4 )
        {
            alert("Please fill in your zip code.");
            zip.focus();
            return false;
        }
        if( (city.value = city.value.trim()).length < 2 )
        {
            alert("Please fill in your city.");
            city.focus();
            return false;
        }
        if( country.value == "0" )
        {
            alert("Please select your country.");
            country.focus();
            return false;
        }
        if(
            ( (email.value = email.value.trim()).length < 5 ) ||
            ( email.value.indexOf("@") == -1 ) ||
            ( email.value.indexOf(".") == -1 )
        )
        {
            alert("Please fill in your e-mail address.");
            email.focus();
            return false;
        }

        if( wantNewsletter == true )
        {
            custom.value = "subscribeToNewsletter";
        }
        else
        {
            custom.value = "";
        }
       
        return true;
    }

    this.getSubmenuItems = function(itemIndex){

        var footerMenuItem = $$("div.footer div.columns.footer div.column.c1 dl dd");
        if( footerMenuItem[itemIndex] != null )
        {
            return footerMenuItem[itemIndex].getChildren("a");
        }
    
        return Array();
    }

    this.openDropdown = function(itemIndex,startLeft){

        this.dropdownKeepOpen = false;

        if( this.dropdownCurrentItemIndex == itemIndex )
        {
            return;
        }

        this.dropdownCurrentItemIndex = itemIndex;

        var left = startLeft;
        if( left == null )
        {
            left = 0;
        }
        var requiredHeight = 0;
        
        this.preventCloseDropdown();
        if( this.newsLetterForm != null )
        {
            this.newsLetterForm.dispose();
        }
        if( this.b2bLoginForm != null )
        {
            this.b2bLoginForm.dispose();
        }
        
        $("dropdownmenu").empty();

        if( itemIndex == "newsletter" )
        {
            left = 703;
            requiredHeight = 60;

            if( this.newsLetterForm == null )
            {
                this.newsLetterForm = new Element("form");
                this.newsLetterForm.setAttribute("method","post");
                this.newsLetterForm.setAttribute("action","/mailing/subscribe");
                this.newsLetterForm.addClass("small");
                this.newsLetterForm.instance = this;

                // name
                var nameFieldset = new Element("fieldset");
                var nameInput = new Element("input");
                nameInput.setAttribute("type","text");
                nameInput.setAttribute("id","newsletter_name");
                nameInput.setAttribute("name","name");
                var nameLabel = new Element("span");
                nameLabel.appendText("name");
                nameInput.inject(nameFieldset);
                nameLabel.inject(nameFieldset);
                nameFieldset.inject(this.newsLetterForm);

                // e-mail
                var emailFieldset = new Element("fieldset");
                var emailInput = new Element("input");
                emailInput.setAttribute("type","text");
                emailInput.setAttribute("id","newsletter_email");
                emailInput.setAttribute("name","emailAddress");
                var emailLabel = new Element("span");
                emailLabel.appendText("e-mail address");
                emailInput.inject(emailFieldset);
                emailLabel.inject(emailFieldset);
                emailFieldset.inject(this.newsLetterForm);

                // submit
                var submitAnchor = new Element("a");
                submitAnchor.setAttribute("href","#");
                submitAnchor.appendText("subscribe");
                submitAnchor.inject(this.newsLetterForm);
                submitAnchor.instance = this;
                submitAnchor.form = this.newsLetterForm;
                submitAnchor.addEvent("click",function(){
                    this.instance.dropdownKeepOpen = true;

                    if( this.instance.validateNewsLetterForm() == true )
                    {
                        this.form.submit();
                    }
                    return false;
                });

                this.newsLetterForm.addEvent("submit",function(){
                    return this.instance.validateNewsLetterForm();
                });
            }

            this.newsLetterForm.inject($("dropdownmenu"));
        }
        else if( itemIndex == "b2blogin" )
        {
            left = 953;
            requiredHeight = 80;

            if( this.b2bLoginForm == null )
            {
                this.b2bLoginForm = new Element("form");
                this.b2bLoginForm.addClass("small");
                this.b2bLoginForm.setAttribute("method","post");
                this.b2bLoginForm.setAttribute("action","/login");

                // hidden INFINITE_POST_LOGIN_INCORRECT_URL
                var incorrectURL = new Element("input");
                incorrectURL.setAttribute("type","hidden");
                incorrectURL.setAttribute("name","INFINITE_POST_LOGIN_INCORRECT_URL");
                incorrectURL.value = "/message/invalid-login";
                incorrectURL.inject(this.b2bLoginForm);
                
                // user
                var userFieldset = new Element("fieldset");
                var userInput = new Element("input");
                userInput.setAttribute("type","text");
                userInput.setAttribute("name","INFINITE_POST_LOGIN_USERNAME");
                var userLabel = new Element("span");
                userLabel.appendText("user");
                userInput.inject(userFieldset);
                userLabel.inject(userFieldset);
                userFieldset.inject(this.b2bLoginForm);

                // e-mail
                var passwordFieldset = new Element("fieldset");
                var passwordInput = new Element("input");
                passwordInput.setAttribute("type","password");
                passwordInput.setAttribute("name","INFINITE_POST_LOGIN_PASSWORD");
                var passwordLabel = new Element("span");
                passwordLabel.appendText("password");
                passwordInput.inject(passwordFieldset);
                passwordLabel.inject(passwordFieldset);
                passwordFieldset.inject(this.b2bLoginForm);

                // remember
                var rememberFieldset = new Element("fieldset");
                rememberFieldset.addClass("checkbox");
                var rememberInput = new Element("input");
                rememberInput.setAttribute("type","checkbox");
                rememberInput.setAttribute("name","INFINITE_POST_LOGIN_REMEMBER");
                
                var rememberLabel = new Element("span");
                rememberLabel.appendText("remember login");
                rememberInput.inject(rememberFieldset);
                rememberLabel.inject(rememberFieldset);
                rememberFieldset.inject(this.b2bLoginForm);

                // submit
                submitAnchor = new Element("a");
                submitAnchor.setAttribute("href","#");
                submitAnchor.appendText("log in");
                submitAnchor.inject(this.b2bLoginForm);
                submitAnchor.addEvent("click",function(e){
                    e = new Event(e);
                    e.stop();
                    this.getParent().submit();
                    return false;
                });
            }
            this.b2bLoginForm.inject($("dropdownmenu"));
        }
        else
        {
            var item = this.getSubmenuItems(itemIndex);
                        
            for( var i = 0; i < item.length; i++ )
            {
                if(( i == 0 ) && ( left == 0 ))
                {
                    left += item[i].getLeft();
                }
                requiredHeight += item[i].offsetHeight;
                var submenuItem = item[i].clone();
                submenuItem.inject($("dropdownmenu"));
            }

            left += 5; // Fix?!
        }
        $("dropdownmenu").setStyle("margin-left",left + "px");
        $("dropdownmenu").fx.start("height",requiredHeight);
    }

    this.closeDropdown = function(){
        if( this.dropdownTimeoutId == null )
        {
            this.dropdownTimeoutId = this.closeDropdownTimeout.delay(1000,this);
        }
    }

    this.closeDropdownTimeout = function(){
        if( this.dropdownKeepOpen != true )
        {
            $("dropdownmenu").fx.start("height",0);
            this.dropdownCurrentItemIndex = null;
        }
    }

    this.preventCloseDropdown = function(){
        if( this.dropdownTimeoutId != null )
        {
            $clear(this.dropdownTimeoutId);
            this.dropdownTimeoutId = null;
        }
    }

    this.mouseOverPreloadCounter = 0;
    this.mouseOverPreloadLoaded = 0;

    this.setupTextReplacer = function(replaceElement)
    {
        if( replaceElement == null )
        {
            var element = $$("a.mouseover span");
            for( var i = 0; i < element.length; i++ )
            {
                element[i].textReplaced = true;
                var text = element[i].innerHTML;

                element[i].setStyle("height","20px");
                element[i].setStyle("overflow","hidden");
                element[i].setStyle("position","relative");
                element[i].empty();

                element[i].imageText = text;
                element[i].preloader = new Image();
                element[i].preloader.element = element[i];
                element[i].preloader.instance = this;
                element[i].preloader.onload = function(){
                    this.element.setStyle("background-position: 0px 0px")
                    this.element.setStyle("background-image","url('" + this.src + "')");
                    this.element.backgroundImageUrl = this.src;
                    this.element.setStyle("float","left");
                    //alert(this.width);
                    this.element.setStyle("width",this.width + "px");
                    this.element.setStyle("height",(this.height/2) + "px");
                    this.instance.mouseOverPreloadCompleted();
                };
                element[i].preloader.src = "/fonts/Puschkin.php?text=" + text;
                this.mouseOverPreloadCounter++;
            }
        }

        if( replaceElement == null )
        {
            element = $$("div.footer h5, h3, h4, label, h1 span, h2 span");
        }
        else
        {
            element = Array(replaceElement);
        }
        for( i = 0; i < element.length; i++ )
        {
            if(( element[i].textReplaced != null ) || ( (element[i].getChildren("a.mouseover")).length > 0 ))
            {
                continue;
            }

            element[i].textReplaced = true;
            
            var text = element[i].innerHTML;

            element[i].setStyle("height","20px");
            element[i].setStyle("overflow","hidden");
            element[i].setStyle("position","relative");
            element[i].empty();

            element[i].imageText = text;
            element[i].preloader = new Image();
            element[i].preloader.element = element[i];
            element[i].preloader.instance = this;
            element[i].preloader.onload = function(){
                this.element.setStyle("background-position: 0px 0px")
                this.element.setStyle("background-image","url('" + this.src + "')");
                this.element.backgroundImageUrl = this.src;
                this.element.setStyle("float","left");
                this.element.setStyle("width",this.width + "px");
                this.element.setStyle("height",(this.height/2) + "px");
            };
            element[i].preloader.src = "/fonts/Puschkin.php?text=" + text;
        }
    }

    this.mouseOverPreloadCompleted = function()
    {
        this.mouseOverPreloadLoaded++;

        if( this.mouseOverPreloadLoaded == this.mouseOverPreloadCounter )
        {
            var element = $$("a.mouseover");
            for( var i = 0; i < element.length; i++ )
            {
                this.mouseOverFixElement(element[i]);
            }
        }
    }

    this.mouseOverFixElement = function(element)
    {
        var width = element.getParent().offsetWidth;
        var height = element.offsetHeight;
        if( height == 0 )
        {
            height = 20;
        }


        var paddingLeft = parseInt(element.getStyle("padding-left"));
        width -= paddingLeft;
        width -= parseInt(element.getStyle("padding-right"));

        var paddingTop = parseInt(element.getStyle("padding-top"));
        height -= paddingTop;
        height -= parseInt(element.getStyle("padding-bottom"));
        
        //element.setStyle("width",width + "px");
        element.setStyle("height",height + "px");
        element.width = width;

        var span = element.getChildren("span");

        if( span.length == 0 )
        {
            // Bevat geen span, niets mee doen
            return;
        }

        var speed = 300/span.length;

        for( var j = 0; j < span.length; j++ )
        {
            span[j].over = new Element("div");
            span[j].over.addClass("over");
            //span[j].over.setStyle("left",paddingLeft + "px");
            //span[j].over.setStyle("top",paddingTop + "px");
            span[j].over.setStyle("width","0px");
            span[j].over.setStyle("height","20px");

            span[j].over.inject(span[j]);
            span[j].over.setStyle("background-image","url('" + span[j].backgroundImageUrl + "')");
            span[j].over.setStyle("background-position","0px " + span[j].getHeight() + "px");
            
            span[j].over.fx = new Fx.Tween(span[j].over,{
               onComplete: function(el){
                   if(( el.getParent().getNext() != null ) && ( el.getParent().getNext().animOver != null ))
                   {
                       el.getParent().getNext().animOver();
                   }
               },
               duration: speed,
               transition: Fx.Transitions.Sine.easeOut
            });

            //span[j].over.top = span[j].paddingTop;
            span[j].over.top = j * span[j].offsetHeight + paddingTop;
            span[j].over.width = span[j].offsetWidth;
            span[j].animOver = function(){

               //var width = this.getParent().getStyle("width");
               //var width = this.getParent().offsetWidth + 1;

               //this.over.setStyle("top",this.over.top + "px");
               this.over.fx.start("width",0,this.over.width);
               //this.over.fx.start("width",0,width);
            }

            speed += 300/span.length;
        }

        if( element.hasClass("mouseover") == true )
        {
            element.addEvent("mouseenter",function(){
               var span = this.getChildren("span");
               if( span[0] != null )
               {
                   span[0].animOver();
               }
            });

            element.addEvent("mouseleave",function(){
               var span = this.getChildren("span")
               for( var j = 0; j < span.length; j++ )
               {
                   span[j].over.fx.cancel();
                   span[j].over.setStyle("width","0px");
               }
            });
        }

        element.mouseOverCreated = true;
    }

    this.fixSwfContent = function(){

        var item = $$("div.swfcontent");
        for( var i = 0; i < item.length; i++ )
        {
            var src = item[i].innerHTML;
            item[i].empty();
            item[i].setAttribute("id","swfcontent" + i);
            swfobject.embedSWF(src,"swfcontent" + i,item[i].offsetWidth,item[i].offsetHeight,"9.0.0","/swf/expressInstall.swf","",{allowfullscreen:true});
        }

    }

    this.onLoad = function(){

        this.setupListingDisplays();
        this.setupColumnHeights();
        //this.setupMouseOverAnchors();
        
        this.setupDropdown();

        this.setupReactionSubmit();
        this.setupFindDealerSubmit();
        this.setupContactSubmit();
        this.setupLoginSubmit();
        this.setupOrderSubmit();
        this.setupSlideDisplays();
        this.setupHubMaps();

        this.setupTextReplacer();
        this.fixSwfContent();

        if( this.isNewLogin == true )
        {
            setTimeout("hub.openDropdown(1,null)",1000);
        }
    };
}


var hub = new Hub();

window.addEvent("domready",function(){
   hub.onLoad();
});