(function ($) {
    $.fn.hoverAccordion = function (options) {
        options = jQuery.extend({
            speed: 'fast',
            activateItem: true,
            keepHeight: false,
            onClickOnly: false,
            classActive: 'active',
            classHeader: 'accordian-trigger',
            classHover: 'hover',
            classOpen: 'opened',
            classClosed: 'closed'
        }, options);

        var container = this;

        var pageHref = window.location.href;

        var i = 0;

        function doHover(itemList, itemHeader, listHeight) {

            var oldList = $(container).find('.' + options.classOpen).closest(
            'li').find('ul:first');

            if (false === oldList.is(':animated')) {
                if (options.keepHeight == true) {
                    listHeight = maxHeight;
                }

                if (itemHeader.hasClass(options.classOpen) == false) {
                    itemList.children().show();
                    itemList.animate({
                        height: listHeight
                    }, {
                        step: function (n, fx) {
                            itemList.height(listHeight - n);
                        },
                        duration: options.speed
                    });

                    oldList.animate({
                        height: 0
                    }, {
                        step: function (n, fx) {
                            itemList.height(listHeight - n);
                        },
                        duration: options.speed
                    }).children().hide();

                    itemHeader.addClass(options.classOpen).removeClass(
                    options.classClosed);

                    oldList.closest('li').removeClass(options.classActive)
                    .find('a:first').addClass(options.classClosed).removeClass(
                    options.classOpen);
                }
            }
        }

        var itemNo = 0;
        var maxHeight = 0;

        $(this)
        .children('li')
        .each(
        function () {
            var item = $(this);
            var isActive = false;

            itemNo++;

            var itemHeader = item.find('a:first').addClass(options.classHeader);

            if (itemHeader.length > 0) {
                itemHeader.hover(function () {
                    itemHeader.addClass(options.classHover);
                }, function () {
                    itemHeader.removeClass(options.classHover);
                });

                var itemHref = itemHeader.attr('href');

                if (itemHref == '#') {
                    itemHeader.click(function () {
                        this.blur();
                        return false;
                    });
                    if (options.activateItem == itemNo) {
                        isActive = true;
                        item.addClass(options.classActive);
                        itemHeader.removeClass(options.classClosed).addClass(
                    options.classOpen);
                    }
                } else if (options.activateItem == true
                && pageHref.indexOf(itemHref) > 0
                && pageHref.length - pageHref.lastIndexOf(itemHref) == itemHref.length) {
                    isActive = true;
                    item.addClass(options.classActive);
                    itemHeader.removeClass(options.classClosed).addClass(
                    options.classOpen);
                }
            }

            var itemList = item.find('ul:first');

            if (itemList.length > 0) {
                var listHeight = itemList.height();

                if (maxHeight < listHeight)
                    maxHeight = listHeight;

                if (options.onClickOnly == true) {
                    itemHeader.click(function () {
                        doHover(itemList, itemHeader, listHeight);
                    });
                } else {
                    itemHeader.hover(function () {
                        i = setInterval(function () {
                            doHover(itemList, itemHeader, listHeight);
                            clearInterval(i);
                        }, 400);
                    }, function () {
                        clearInterval(i);
                    });
                }

                if (options.activateItem == true) {
                    itemList
                    .children('li')
                    .each(
                    function () {
                        var m = $(this).find('a').attr('href');
                        if (m) {
                            if (pageHref.indexOf(m) > 0
                            && pageHref.length - pageHref.lastIndexOf(m) == m.length) {
                                isActive = true;
                                item.addClass(options.classActive);
                                itemHeader.removeClass(options.classClosed)
                                .addClass(options.classOpen);
                            }
                        }
                    });
                } else if (parseInt(options.activateItem, 10) == itemNo) {
                    isActive = true;
                    item.addClass(options.classActive);
                    itemHeader.removeClass(options.classClosed).addClass(
                    options.classOpen);
                }
            }

            if (!isActive) {
                itemHeader.removeClass(options.classOpen);
                if (itemList.length > 0) {
                    itemList.children().hide();
                    itemHeader.addClass(options.classClosed);
                }
            }
        });

        return this;
    };
})(jQuery);

