
$ = jQuery;

(function ($) {
    $.fn.as24menu = function () {
 
        $.each(this, function () {
            var timer;
            var menu = $(this);            
            //var side = menu.hasClass('right') ? 'right' : 'left';
            
            var state = {
                mouseOverMenu: false,
                mouseOverSubMenu: false,
                update: updateMenu
            }           

            if(Modernizr.touch) {
                makeMenuNotNavigatingOnClick();
                makeTabsOpeningOnClick();
                
            } else {
                makeTabsOpeningOnHoverWithDelay();
            }
            
            function makeMenuNotNavigatingOnClick() {
                var currentMenuId = menu.attr('id');
                if(currentMenuId !== 'logOut' 
                    && currentMenuId !== 'home'
                    && currentMenuId !== 'b2b-home')  {
                    menu.find('.navLink').attr("href", "#");
                }
            }
            
            function makeTabsOpeningOnClick() {
                menu.click(function(event) {
                    var currentMenu = $(this);
                    var showThisMenu = !currentMenu.hasClass('highlightWithSubmenu');
                    
                    $('.navMenuItem').each(function() {
                      unhighlight(this);
                    });
                    state.mouseOverSubMenu = showThisMenu;
                    state.update();
                });
                
            }
            
            function makeTabsOpeningOnHoverWithDelay() {
                menu.hover(
                  function () {
                      timer = setTimeout(function () {
                          state.mouseOverMenu = true; state.update();
                      }, 300);
                  },
                  function () {
                      clearTimeout(timer);
                      state.mouseOverMenu = false; state.update();
                  }
                );           

                getSubmenu(menu).mouseenter(function () {
                    state.mouseOverSubMenu = true; state.update();
                });
                getSubmenu(menu).mouseleave(function () {
                    state.mouseOverSubMenu = false; state.update();
                });
            }

            function updateMenu() {
                if (state.mouseOverMenu || state.mouseOverSubMenu) {
                    highlight();
                }
                else {
                    unhighlight(menu);
                }
            }

            function unhighlight(menu) {
                menu = $(menu);
                if (hasSubmenu()) {
                    
                    var submenu = getSubmenu(menu);
                    submenu.hide();
                    menu.removeClass('highlightWithSubmenu');
                    menu.find('.navLink').removeClass('highlightLinkWithSubmenu');
                    
                    if($.as24.menu.isHighlightElement(menu))
                        $.as24.menu.highlightElement(menu);
                }
                else {
                    if(!$.as24.menu.isHighlightElement(menu)) {
                        $.as24.menu.unhighlightElement(menu);
                    }
                }
            }

            function getSubmenu(menu) {
                var submenuId = 'sub_' + menu.attr('id');
                return $('#' + submenuId);
            }

            function highlight() {
                showSubmenu();
                correctSubmenuWidth();
                alignSubmenu();
                highlightCurrentMenuItem();
            }
            
            function highlightCurrentMenuItem() {
                if (hasSubmenu()) {
                    $.as24.menu.unhighlightElement(menu);

                    menu.addClass('highlightWithSubmenu');
                    menu.find('.navLink').addClass('highlightLinkWithSubmenu');
                }
                else {
                    $.as24.menu.highlightElement(menu);
                }
            }

            function showSubmenu() {
                getSubmenu(menu).show();
            }

            function correctSubmenuWidth() {
                var menuWidth = menu.width();
                var submenu = getSubmenu(menu);
                if (submenu.width() < menuWidth)
                    submenu.width(menuWidth);
            }

            function alignSubmenu() {
                var menuWidth = menu.width();
                var submenuLeft = 0;
                var subemnuTop = 0;

                var menuOffset = menu.offset();
                var submenu = getSubmenu(menu);
                if (submenu.hasClass('floatRight')) {
                    var menuRight = menuOffset.left + menu.outerWidth();
                    submenuLeft = menuRight - submenu.outerWidth() - 10;
                }
                else {
                    submenuLeft = menuOffset.left - 12;
                }

                submenu.css('left', submenuLeft);
            }

            function hasSubmenu() {
                return $(menu).find('.navSubMenu').length > 0;
            }
        });
    };

    $.fn.as24login = function () {
        var cookievalue = $.cookie('User');
        var loginLink = this;

        //If user has already logged in ...
        if (cookievalue) {
            var currentLink = $(loginLink).attr('href');
            if (currentLink) {
                loginLink.text($.as24.menu.settings.logoutText);
                var newLink = currentLink.replace("Login.aspx", "Logout.aspx"); // switch the text and link to logout
                loginLink.attr('href', newLink);

                $('#dealer').next().remove(); //remove navSeparator right
                $('#dealer').remove(); //remove dealer node
                $('#myas-register').remove(); //remove register leaf
            }

            //Insert LogOut in First layer
            var menuBookmark = $('.navMenuItem.floatLeft').first();
            var newBlock = '<div id="logOut" class="navMenuItem floatRight">';
            newBlock = newBlock + '<a class="navLink" href=\"';
            newBlock = newBlock + $.as24.menu.settings.logoutUrl;
            newBlock = newBlock + '">' + $.as24.menu.settings.logoutText + '</a></div><div class="navSeparator floatRight"> </div>';
            var logoutButton = $(newBlock);
            $(logoutButton).insertBefore(menuBookmark);

            $('#loginLink').remove();
            $('#logOut').as24menu();
        }
    }

    $.fn.as24dealerWelcomeBox = function () {
        var dealerBox = this;
        var welcomeText = $.as24.menu.settings.dealerWelcomeText;

        function getUserName() {
            var firstname = $.as24.readCookie('User').FirstName;

            if (firstname === undefined) {
                firstname = '';
            }

            var lastname = $.as24.readCookie('User').LastName;
            if (lastname === undefined) {
                lastname = '';
            }

            if (firstname !== '' || lastname !== '') {
                return decodeURIComponent(firstname) + ' ' + decodeURIComponent(lastname);
            }

            var name = $.as24.readCookie('User').Name;
            if (name !== undefined) {
                return decodeURIComponent(name);
            }

            return '-';
        }

        function getSellId() {
            var sellId = $.as24.readCookie('User').SellId;
            if (sellId === undefined) {
                return '';
            }

            return sellId;
        }

        function getLastLoginDate() {
            var lastlogindate = $.as24.readCookie('User').LastLogin;
            if (lastlogindate === undefined) {
                return '-';
            }

            return lastlogindate;
        }

        welcomeText = welcomeText.replace(/#NAME#/, getUserName());
        welcomeText = welcomeText.replace(/#SELLID#/, getSellId());
        welcomeText = welcomeText.replace(/#LASTLOGIN#/, getLastLoginDate());

        dealerBox.html(welcomeText);
    };


})(jQuery);

(function () {
    $.as24 = $.as24 || {};
    $.as24.readCookie = function (cookieName) {
    
        var cookieValue = $.cookie(cookieName);
        if(typeof cookieValue === "undefined" || cookieValue === null)
            return {};
            
        var result = {};
        
        var values = cookieValue.split('&');
        for(var i=0; i<values.length; i++) {
            var split = values[i].split('=');
            result[replaceEscapedChar(split[0])] = replaceEscapedChar(split[1]);
        }
        return result;
    }
    
    $.as24.readCookie.settings = {
         specialChars: { 
            "**":"&",
            "##":";" 
            }
    };
    
    function replaceEscapedChar(value) {
        var specialChars = $.as24.readCookie.settings.specialChars;
        for(escapedChar in specialChars)
            value = value.replace(escapedChar, specialChars[escapedChar]);
        return value;
    }

})();

$(function () {
    //init the SEO Menu in case loading takes longer
    $.as24.menu.init();
});


// as24 menu
(function () {
    $.as24 = $.as24 || {};
    $.as24.menu = {
        init: init,
        requestMenu: requestMenu,
        menuLoaded: menuLoaded,
        buildMenu: buildMenu,
        isHighlightElement: isHighlightElement,
        highlightElement: highlightElement,
        unhighlightElement: unhighlightElement
    };
    // as24 menu Settings (can be overriden by server code)
    $.as24.menu.settings = {
        url: '',
        logoutText: 'LogOut',
        logoutUrl: 'https://secure.autoscout24.de/Logout.aspx',
        highlightElementId: '',
        doReloadMenu: true,
        dealerWelcomeText: ''
    };

    function init() {
        if(isTouchDevice()) {
            Modernizr.touch = true;
        }
        
        $.as24.menu.buildMenu();
        
        if(doReloadFromQueryString() && $.as24.menu.settings.doReloadMenu) {
            $.as24.menu.requestMenu();
        }
    }
    
    function doReloadFromQueryString() {
        var q = $.parseQuery();
        if (q.doReloadMenu === "0" || q.doreloadmenu === "0")
            return false;
        return true;
    }
    
    function isTouchDevice() {
        var q = $.parseQuery();
        if (q.isTouchDevice === "1" || q.istouchdevice === "1")
            return true;
        return false;
    }

    function buildMenu() {
        $('.navMenuItem').as24menu();
        $('#loginLink').as24login();
        $('#dealerwelcomebox').as24dealerWelcomeBox();
        highlightElement(getHighlightElement());
    };
    
    function isHighlightElement(element) {
        return element.attr('id') === $.as24.menu.settings.highlightElementId;
    }
    
    function highlightElement(element) {
        element.addClass('activeNavMenuItem');
        element.find('.navLink').addClass('highlightLink');
    }
    
    function unhighlightElement(element) {  
        element.removeClass('activeNavMenuItem');
        element.find('.navLink').removeClass('highlightLink');
    }
    
    function getHighlightElement() {
        var elementId = $.as24.menu.settings.highlightElementId;
        
        if(elementId === undefined || elementId === '') {
            return $();
        }
        
        return $('#' + elementId);
    }
    
    //Do an ajax call - when finished call the callback
    function requestMenu() {
		var shouldReplace = location.hostname.toLowerCase().indexOf('www') > 0;
        $.ajax({
            url: shouldReplace ? $.as24.menu.settings.url.replace( 'html','html.aspx') : $.as24.menu.settings.url,
            type: 'GET',
            dataType: 'html',
            cache: true,
            success: $.as24.menu.menuLoaded,
            error: $.as24.menu.menuLoadError
        });
    };

    function menuLoaded(response) {
        if (response.length > 0) {
             // if response contains html element, this means there was no file found.
            if(response.indexOf('<html') < 0 ) {
                //here has to be the part that replaces the menu
                $('#topNavigation').replaceWith(response);
                $.as24.menu.buildMenu();
            }
        }
    };

    function menuLoadError() {
    };

})();
